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 以内的整数随机数:
计算结果:
2.2.2 单个参数
有如下 Excel 文件,第一列是随机数的范围,第二列是根据第一列给定的范围,生成一个相应范围内的整数随机数:
计算结果:
把 B2 单元格拖动复制到每一个格子:
2.2.3 表达式中有双引号
有如下日期数据:
这些数据没有日期格式,无法被 Excel 识别,被当成了普通的数字串,需要把它们变成日期数据。
SPL 有很简单的写法:=date(A2,“yyyyMMdd”),这样会按照 "yyyyMMdd" 的格式,把 A2 解析成日期。但是这样的 SPL 脚本里本身含有双引号,写到 spl() 函数里,需要使用 Excel 的规则对双引号进行转义,即把 "写成"",如下所示:
运算结果如下:
然后把 B2 拖动复制到每一行,结果如下:
补充说明:
需要先把日期数据所在单元格类型设为文本类型。
2.2.4 多个参数
有如下 Excel 文件,其中 r, g, b, a 分别代表颜色中的红、绿、蓝及透明分量:
现需要在右边增加一列,算出每一行颜色分量组合成的颜色值,输入 SPL 代码如下:
代码中分别用?1,?2,?3,?4 对应第一个参数 A2,第二个参数 B2,第三个参数 C2,第四个参数 D2
输入完上述表达式后,即可算出当前行的颜色值如下:
然后再把 E2 单元格拖动复制到每一个格子
2.2.5 一行片区参数
有 Excel 文件如下图所示,现需要对每行数据去掉最大值和最小值,再求中位数,把结果填在最右侧的列中:
在 I2 单元格中输入=spl("=?.conj().sort().m(2:-2).median()",A2:H2)
,Excel 将把 A2:H2 单元格片区组成的数组传给 SPL 表达式 "=?.conj().sort().m(2:-2).median()",替代其中的参数?,返回去掉最大值和最小值后的中位数。
计算结果:
补充说明:
1、Excel 会自动把数组参数处理成二维数组,即使事实上只一行(或一列)也是如此,因此在 SPL 脚本里需要用conj() 拼成单层序列。
此时再把 I2 单元格的表达式向下拖拽复制到下面的每一行,即可自动算出所有行的中位数,如下图所示:
2.2.6 一列片区参数
有 Excel 文件如下图所示,现需要对每列数据去掉最大值和最小值,再求中位数,把结果填在最底下的行中:
在 A14 单元格中输入=spl("=?.conj().sort().m(2:-2).median()",B1:B13)
,Excel 将把 B1:B13 单元格片区组成的数组传给 SPL 表达式 "=?.conj().sort().m(2:-2).median()",替代其中的参数?,返回去掉最大值和最小值后的中位数。
计算结果:
补充说明:
1、Excel 会自动把数组参数处理成二维数组,即使事实上只一行(或一列)也是如此,因此在 SPL 脚本里需要用conj() 拼成单层序列。
此时再把 B14 单元格的表达式向右拖拽复制到右边的每一列,即可自动算出右边所有列的中位数,如下图所示:
2.2.7 多行多列片区参数
有如下 Excel 文件:
现在需要在右侧增加一列,计算取样数据的累计平均值,即第一天的行只算第一天的平均值,第二天的行则算前两天总的平均值,第三天则算前三天的总平均值,依此类推。同样的,计算平均值之前需要先去掉最大值和最小值。
计算结果:
在 Z3 单元格中输入表达式:=spl("=?.conj().sort().m(2:-2).avg()",$B$3:Y3)
,此时算出结果 5.40
从表达式可以看出,传入的参数 $B$3:Y3 ,第一个单元格加了 $ 符号,因为要算的是累计平均,在向下复制该表达式时要保持始终从 B3 单元格开始累计,所以加 $。
把 Z3 单元格的表达式拖动复制到每一行,最后算出所有行的累计平均值。
2.2.8 混合参数
有如下 Excel 文件,为每一天 24 个小时的整点取样数据:
现在需要在右侧增加一列,找出截止到当天本月所有取样数据中的最大 n 个值的平均值,n 取决于 Z 列的数据。
在 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 的公式拖动复制到每一行,最后结果如下:
2.2.9 返回一维数组
生成 10 个 100 以内的随机整数,按顺序填入第一行中:
输入表达式后,按 Ctrl-Enter 执行在 esproc_template.xla 中定义的宏,将计算结果填充到相邻格中:
表达式返回一维数组时,按 Ctrl-Enter 后,会把数组成员以当前格为起始格,向右依次填入一行单元格中。不使用 Ctrl-Enter 则只会将第一个成员填入表达式所在格。
2.2.10 返回二维数组
现有 Employee.xlsx 文件内容如下:
现需要按部门 DEPT 列统计每个部门的人数,在 A1 格输入 SPL 脚本如下:
Employee.xlsx 最好放在集算器主目录下,这样可以不写路径名找到,否则要在表达式中写上全路径名
按 Ctrl-Enter 将计算结果填入相邻单元格:
补充说明:
1、 返回二维数组时需要按Ctrl-Enter触发填充动作,以当前格为起始格,向右向下依次填入一片单元格中。不使用 Ctrl-Enter 时只会在表达式所在格填入数组的第一个成员。
2、 SPL 脚本中如果有 ",需要按 Excel 规则进行转义,写成 "" 。
2.2.11 动态拼 SPL 表达式
有如下 Excel 文件:
现在需要在右侧增加一列,计算取样数据的累计汇总值,汇总函数由 Z 列给出的函数名决定,如果是 median,则算中位数;如果是 avg 则算平均值;sum 则求和;依此类推。
在 AA3 单元格中输入表达式:=spl("=?.conj()."&Z3&"()",$B$3:Y3)
,第一个参数 "=?.conj().“&Z3&”()" 是动态拼出的 SPL 表达式,第二个参数 $B$3:Y3 传入从 B3 到 Y3 组成的数组。
传入参数 $B$3:Y3 中,第一个单元格加了 $ 符号,因为算的是累计汇总,在向下复制该表达式时要保持始终从 B3 单元格开始累计,该单元格不能变迁。
把 AA3 单元格的表达式拖动复制到每一行,最后算出所有行的累计汇总值。