根据列值查找相应的列名
例题描述和简单分析
某Excel在D1:I6片区的第1行是列名,其他行有些格为空,有些格有数据,有数据的格一定是连续的。如下所示:
A |
B |
C |
D |
E |
F |
G |
H |
I |
|
1 |
4.5.2020 |
5.5.2020 |
6.5.2020 |
7.5.2020 |
8.5.2020 |
9.5.2020 |
|||
2 |
data |
data |
|||||||
3 |
data |
data |
data |
data |
data |
||||
4 |
data |
data |
data |
data |
data |
||||
5 |
data |
data |
data |
data |
data |
data |
|||
6 |
data |
data |
data |
data |
现在要在A列和B列分别算出连续有数据的格的起始列的列名,以及终止列的列名。如下所示:
A |
B |
C |
D |
E |
F |
G |
H |
I |
|
1 |
start date |
end date |
4.5.2020 |
5.5.2020 |
6.5.2020 |
7.5.2020 |
8.5.2020 |
9.5.2020 |
|
2 |
4.5.2020 |
5.5.2020 |
data |
data |
|||||
3 |
4.5.2020 |
8.5.2020 |
data |
data |
data |
data |
data |
||
4 |
5.5.2020 |
9.5.2020 |
data |
data |
data |
data |
data |
||
5 |
4.5.2020 |
9.5.2020 |
data |
data |
data |
data |
data |
data |
|
6 |
6.5.2020 |
9.5.2020 |
data |
data |
data |
data |
上面算法涉及定位查询和按位置取数。
解法及简要说明
首先在 Excel 中选中 D1:I6, 复制到集算器脚本的 A1 格,然后编写如下脚本:
` |
A |
1 |
…(复制来的数据 ) |
2 |
=A1.split@n("\t") |
3 |
=A2.to(2,).new(~.pselect(~!=""):start,~.pselect@z(~!=""):end) |
4 |
=A3.new(A2(1)(start):'start date',A2(1)(end):'end date') |
执行后,将A4的计算结果连同列名复制到Excel的A1格。
A2:将字符串解析成序列的序列
A3:取数据部分(从第2行开始),分别算出顺序第1个不为空的成员的位置,以及逆序第1个不为空的成员的位置。
A4:按位置从列名序列里中取数。
英文版