2.2 使用 spl() 函数

 

安装配置好之后,Excel 中会增加 spl() 函数,其功能是在 Excel 单元格中执行 SPL 脚本并获得计算后的结果集。

spl() 函数有两种参数格式:

1、spl(exp, arg1, …)

exp 以 = 开头的 SPL 语法的表达式串。其中用问号代表参数引用,?1 对应第一个参数,?2 对应第二个参数,依此类推
arg1,… 参数值,参数可以有 0 个或多个,至多 30 个。可以填入常数,或引用当前 Excel 单元格,允许单格和片区。

复杂计算需求,执行用 SPL 写好的脚本文件,格式为

2、spl(splx(…), … )

splx() 脚本文件名称,无扩展名,统一用.splx。名称后必须加上 ()。如果脚本有参数,也在() 写上?1,?2,.. 等表示。
arg1,… 依次对应脚本文件需要的参数,可以引用 Excel 单元格及片区

spl() 函数可能返回单值、一维数组或二维数组。

2.2.1 无参数

生成 100 以内的整数随机数:

imagepng

计算结果:

imagepng

2.2.2 单个参数

有如下 Excel 文件,第一列是随机数的范围,第二列是根据第一列给定的范围,生成一个相应范围内的整数随机数:

imagepng

计算结果:

imagepng

把 B2 单元格拖动复制到每一个格子:

imagepng

2.2.3 表达式中有双引号

有如下日期数据:

imagepng

这些数据没有日期格式,无法被 Excel 识别,被当成了普通的数字串,需要把它们变成日期数据。

SPL 有很简单的写法:=date(A2,“yyyyMMdd”),这样会按照 "yyyyMMdd" 的格式,把 A2 解析成日期。但是这样的 SPL 脚本里本身含有双引号,写到 spl() 函数里,需要使用 Excel 的规则对双引号进行转义,即把 "写成"",如下所示:

imagepng

运算结果如下:

imagepng

然后把 B2 拖动复制到每一行,结果如下:

imagepng

补充说明:

需要先把日期数据所在单元格类型设为文本类型。

2.2.4 多个参数

有如下 Excel 文件,其中 r, g, b, a 分别代表颜色中的红、绿、蓝及透明分量:

imagepng

现需要在右边增加一列,算出每一行颜色分量组合成的颜色值,输入 SPL 代码如下:

imagepng

代码中分别用?1,?2,?3,?4 对应第一个参数 A2,第二个参数 B2,第三个参数 C2,第四个参数 D2

输入完上述表达式后,即可算出当前行的颜色值如下:

imagepng

然后再把 E2 单元格拖动复制到每一个格子

imagepng

2.2.5 一行片区参数

有 Excel 文件如下图所示,现需要对每行数据去掉最大值和最小值,再求中位数,把结果填在最右侧的列中:

imagepng

在 I2 单元格中输入=spl("=?.conj().sort().m(2:-2).median()",A2:H2),Excel 将把 A2:H2 单元格片区组成的数组传给 SPL 表达式 "=?.conj().sort().m(2:-2).median()",替代其中的参数?,返回去掉最大值和最小值后的中位数。

计算结果:

imagepng

补充说明:

1、Excel 会自动把数组参数处理成二维数组,即使事实上只一行(或一列)也是如此,因此在 SPL 脚本里需要用conj() 拼成单层序列。

此时再把 I2 单元格的表达式向下拖拽复制到下面的每一行,即可自动算出所有行的中位数,如下图所示:

imagepng

2.2.6 一列片区参数

有 Excel 文件如下图所示,现需要对每列数据去掉最大值和最小值,再求中位数,把结果填在最底下的行中:

imagepng

在 A14 单元格中输入=spl("=?.conj().sort().m(2:-2).median()",B1:B13),Excel 将把 B1:B13 单元格片区组成的数组传给 SPL 表达式 "=?.conj().sort().m(2:-2).median()",替代其中的参数?,返回去掉最大值和最小值后的中位数。

计算结果:

imagepng

补充说明:

1、Excel 会自动把数组参数处理成二维数组,即使事实上只一行(或一列)也是如此,因此在 SPL 脚本里需要用conj() 拼成单层序列。

此时再把 B14 单元格的表达式向右拖拽复制到右边的每一列,即可自动算出右边所有列的中位数,如下图所示:

imagepng

2.2.7 多行多列片区参数

有如下 Excel 文件:

imagepng

现在需要在右侧增加一列,计算取样数据的累计平均值,即第一天的行只算第一天的平均值,第二天的行则算前两天总的平均值,第三天则算前三天的总平均值,依此类推。同样的,计算平均值之前需要先去掉最大值和最小值

计算结果:

imagepng

在 Z3 单元格中输入表达式:=spl("=?.conj().sort().m(2:-2).avg()",$B$3:Y3),此时算出结果 5.40

从表达式可以看出,传入的参数 $B$3:Y3 ,第一个单元格加了 $ 符号,因为要算的是累计平均,在向下复制该表达式时要保持始终从 B3 单元格开始累计,所以加 $。

把 Z3 单元格的表达式拖动复制到每一行,最后算出所有行的累计平均值。

2.2.8 混合参数

有如下 Excel 文件,为每一天 24 个小时的整点取样数据:

imagepng

现在需要在右侧增加一列,找出截止到当天本月所有取样数据中的最大 n 个值的平均值,n 取决于 Z 列的数据。

imagepng

在 AA3 中输入 SPL 表达式如下:

=spl("=?1.top@2(-?2).avg()", $B$3:Y3, Z3)

第一个参数:=?1.top@2(-?2).avg() 是 SPL 表达式,表示对参数?1 算前 n 名,n 由参数?2 决定;然后再对前 n 名算平均值

第二个参数:$B$3:Y3,是传给 SPL 表达式的参数,对应?1

第三个参数:Z3,是传给 SPL 表达式的参数,对应?2

把 AA3 的公式拖动复制到每一行,最后结果如下:

imagepng

2.2.9 返回一维数组

生成 10 个 100 以内的随机整数,按顺序填入第一行中:

imagepng

输入表达式后,按 Ctrl-Enter 执行在 esproc_template.xla 中定义的宏,将计算结果填充到相邻格中:

imagepng

表达式返回一维数组时,按 Ctrl-Enter 后,会把数组成员以当前格为起始格,向右依次填入一行单元格中。不使用 Ctrl-Enter 则只会将第一个成员填入表达式所在格。

2.2.10 返回二维数组

现有 Employee.xlsx 文件内容如下:

imagepng

现需要按部门 DEPT 列统计每个部门的人数,在 A1 格输入 SPL 脚本如下:

imagepng

Employee.xlsx 最好放在集算器主目录下,这样可以不写路径名找到,否则要在表达式中写上全路径名

按 Ctrl-Enter 将计算结果填入相邻单元格:

imagepng

补充说明:

1、 返回二维数组时需要按Ctrl-Enter触发填充动作,以当前格为起始格,向右向下依次填入一片单元格中。不使用 Ctrl-Enter 时只会在表达式所在格填入数组的第一个成员。

2、 SPL 脚本中如果有 ",需要按 Excel 规则进行转义,写成 ""

2.2.11 动态拼 SPL 表达式

有如下 Excel 文件:

imagepng

现在需要在右侧增加一列,计算取样数据的累计汇总值,汇总函数由 Z 列给出的函数名决定,如果是 median,则算中位数;如果是 avg 则算平均值;sum 则求和;依此类推。

在 AA3 单元格中输入表达式:=spl("=?.conj()."&Z3&"()",$B$3:Y3),第一个参数 "=?.conj().“&Z3&”()" 是动态拼出的 SPL 表达式,第二个参数 $B$3:Y3 传入从 B3 到 Y3 组成的数组。

传入参数 $B$3:Y3 中,第一个单元格加了 $ 符号,因为算的是累计汇总,在向下复制该表达式时要保持始终从 B3 单元格开始累计,该单元格不能变迁。

把 AA3 单元格的表达式拖动复制到每一行,最后算出所有行的累计汇总值。

imagepng


帮你早下班 - esProc 桌面版与 Excel 数据处理
2.1 安装与配置
2.3 编辑 SPL 代码