如何不改变次序时获取 Excel 中同类的上(下)行数据
下面的Excel中,Block相同的行属于同一组。
A |
B |
|
1 |
Block |
Bench |
2 |
4 |
1 |
3 |
5 |
1 |
4 |
6 |
1 |
5 |
4 |
8 |
6 |
5 |
8 |
7 |
6 |
8 |
8 |
4 |
9 |
9 |
5 |
9 |
10 |
6 |
9 |
11 |
4 |
5 |
12 |
5 |
5 |
13 |
6 |
5 |
目标:计算出2个新列,BenchAbove为同一组内的上一行的Bench,如果本行为第1行,则BenchAbove为空。BenchBelow为同一组内的下一行的Bench,如果本行为最后1行,则BenchBelow为空。
计算结果应当如下:
A |
B |
C |
D |
|
1 |
Block |
Bench |
BenchAbove |
BenchBelow |
2 |
4 |
1 |
8 |
|
3 |
5 |
1 |
8 |
|
4 |
6 |
1 |
8 |
|
5 |
4 |
8 |
1 |
9 |
6 |
5 |
8 |
1 |
9 |
7 |
6 |
8 |
1 |
9 |
8 |
4 |
9 |
8 |
5 |
9 |
5 |
9 |
8 |
5 |
10 |
6 |
9 |
8 |
5 |
11 |
4 |
5 |
9 |
|
12 |
5 |
5 |
9 |
|
13 |
6 |
5 |
9 |
这类问题的难点是:在不改变行顺序的前提下,获取同一组内的上一行下一行。
1. 运行集算器(可以到润乾官网下载,用职场版,首次运行时会提示加载授权,下载个免费的就够了)
2. 编写脚本并执行
A |
B |
|
1 |
=file("data.xlsx").xlsimport@t() |
/读入Excel |
2 |
=A1.derive(~[:-1].select@1z(Block==A2.Block).Bench:BenchAbove, ~[1:].select@1(Block==A2.Block).Bench:BenchBelow) |
/获取相邻行 |
3 |
=file("result.xlsx").xlsexport@(A2) |
/导出成新Excel |
A2 中,~[:-1] 获取当前行之前的所有行,~[1:] 则是当前行之后的所有行,select 用于查找,@z 表示从后往前找,@1 表示找到 1 条就结束。
还可以在Excel 内用剪贴板实现,步骤如下:
1. 运行集算器
2. 用Excel 打开需要计算的文件。
3. 选中A1:B13 区域,按 ctrl+C 复制到剪贴板。
4. 切换到集算器,选中A1 格,注意要让光标落到 A1 的编辑状态中,用 ctrl+V,将数据粘贴进来。
5. 编写如下esProc 脚本并执行
A |
||
1 |
….(粘贴而来的数据) |
|
2 |
=A1.import@t() |
|
3 |
=A2.new(~[:-1].select@1z(Block==A2.Block).Bench:BenchAbove, ~[1:].select@1(Block==A2.Block).Bench:BenchBelow) |
6. 按F9 执行,然后点击 A3,右侧可以看到执行结果。按住 shift(以便带上列名),点击 "copy data" 按钮,将计算结果复制到剪贴板。
7. 在Excel 的 C1 单元格,用 ctrl+V 粘贴结果,即可完成计算。
上面的例子只取上下一条,如果遇到更复杂情况,比如上下N 行,也可用类似的办法获取到。