如何不改变次序时获取 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,将数据粘贴进来。

11png

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" 按钮,将计算结果复制到剪贴板。

22png

7.  Excel 的 C1 单元格,用 ctrl+V 粘贴结果,即可完成计算。

上面的例子只取上下一条,如果遇到更复杂情况,比如上下N 行,也可用类似的办法获取到。