集算器中的宏,就是用来组成表达式的字符串,只不过这部分字符串通常是动态生成的。宏往往是一个参数的值或是表达式的计算结果。使用时,宏用符号${}括起来,集算器将先计算${…}里的…表达式,将计算结果作为宏字符串值替换${}。如:
|
A |
B |
1 |
[+,-,*,/] |
=A1(rand(4)+1) |
2 |
=rand(1000) |
=rand(1000) |
3 |
=A2${B1}B2 |
|
B1从A1的操作符列表中,随机获取一种四则运算符号,A2和B2随机生成两个1000以内的整数,在A3中计算四则运算的结果。
如B1、A2、B2中的结果如下:
那么,此时A3中即为计算236-393的结果:
其中,${B1}即为宏,使用时根据不同的符号动态拼成表达式。
需要注意的是,如果宏用在双引号括起的字符串中,则不会执行宏替换。如:
|
A |
B |
1 |
A"+"A |
" |
2 |
="aabb${A1}ccdd" |
|
3 |
=${B1}aabb${A1}ccdd" |
|
A2中的${A1}没有作用,最终A2中的结果就是引号中的字符串:
而在A3中,将左边的双引号改为另一个宏,此时这两个宏就都不在引号内了,宏是有效的,会被用来拼成表达式="aabbA"+"Accdd",计算后,A3中的结果如下:
从上面的使用中可以看到,宏与字符串参数不同,宏是表达式的一部分,常用在需要动态生成表达式时。
宏经常用来根据名称来动态调用不同的单元格值,调用不同的函数,或者动态使用不同参数等,这种需求有时候很难用固定的表达式来实现,使用宏是一种很方便的选择。如:
|
A |
B |
1 |
4779736 |
AL |
2 |
710231 |
AK |
3 |
6392017 |
AZ |
4 |
2915918 |
AR |
5 |
37253956 |
CA |
6 |
=[A1:A5].pselect(~>5000000) |
|
7 |
=B${string(A6)} |
|
在A6中,找到第一个人口大于5,000,000的数据所在的行;在A7的表达式中,根据这个行号取出B列中对应的单元格名称,从而获得该州的缩写。需要注意,宏中的表达式必须返回一个字符串,因此在A7中用宏生成单元格名称时,需要用string() 函数将A6中获得的行号转换为字符串。A6和A7中的结果如下:
需要注意的是,如果单元格中使用了宏,只会在第一次解析,因此,宏不适合循环使用,如:
|
A |
B |
1 |
4779736 |
AL |
2 |
710231 |
AK |
3 |
6392017 |
AZ |
4 |
2915918 |
AR |
5 |
37253956 |
CA |
6 |
=[A1:A5].pselect@a(~>5000000) |
|
7 |
=A6.(B${string(A6.~)}) |
|
此时,在A6中返回所有人口大于5,000,000的数据所在的行:
在A7中,根据A6中的序列循环,试图每次取出对应州的简称,结果如下:
由于宏中的字符只是在第一次解析表达式时置换,因此循环时获得的州简称全都是第一次完成宏替换时计算的结果AZ。
在使用宏时必须明确,宏是用来生成表达式的,不能用来生成命令语句,如for,func等。