如何不改变次序时获取 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 行,也可用类似的办法获取到。