已收录

殊途同归:不用Power Query,一个公式也能做九九乘法表

song
song WPS资深用户Lv.3 优质创作者WPS金话筒WPS寻令官

Lv.3优质创作者

WPS Query高级编辑器正式上线啦!HC.旋老师发布了用M函数制作九九乘法表的教程帖,我按照操作一步步实现后,也想分享给感兴趣的小伙伴——点击下方链接即可跳转查看↓

https://bbs.wps.cn/topic/101426

WPS Office使用版本:12.1.0.29670 64位


承接HC.旋老师用M函数做九九乘法表的思路,这里再补一个“零门槛”续篇:不用Power Query,不写M函数,只用一个公式就能在表格里铺出整张九九乘法口诀表。M函数版胜在能进Power Query做后续处理,公式版胜在即写即得、随手可用——两条路殊途同归,正好对照着看。

之前的教程我都是先写公式再去逐一介绍,这次我们换个方式,从0开始思考如何一步步实现。

第一步:先算出积c

在乘法算式a × b = c里,a、b为因数,c为积。观察口诀表:因数 a 随列增大,因数 b 随行增大。
要实现公式自动提取这两个数,可以用函数ROW 返回行号和 COLUMN返回列号。在A1单元格输入=COLUMN()*ROW(),即可计算得到积c。

第二步:把算式拼出来

九九乘法表需要把a和b都要写出来,我们用连接符&将abc按文本形式拼接起来:
=COLUMN()&"×"&ROW()&"="&COLUMN()*ROW()

第三步:用 IF 筛掉重复项

向下向右拖动填充,会出现 2×1=2 这种不符合乘法表的结果,在外面嵌套一个IF函数判断a≤b:=IF(COLUMN()<=ROW(),COLUMN()&"×"&ROW()&"="&COLUMN()*ROW(),"")

第四步:升级成区域数组,一个格子铺满

但这样还有两个缺点:①要两次填充;②必须从A1开始。解决办法是把 COLUMN()、ROW() 的参数写成 A1:I9 这个 9×9 区域,一个单元格就能溢出整张表,注意不要拖动,因为没有添加绝对引用,拖动会改变引用区域,保险起见可以添加上绝对引用,即$A$1:$I$9

最终我们得到一个公式,以实现九九乘法表:

=IF(ROW(A1:I9)>=COLUMN(A1:I9),COLUMN(A1:I9)&"×"&ROW(A1:I9)&"="&COLUMN(A1:I9)*ROW(A1:I9),"")


说到九九乘法表,让我想起以前帮别人做个一个随机生成加减法运算的表格,那么这样批量的表是如何做的呢?我们以生成随机的100以内的二次加减法为例,生成能铺满一页的算式。

100以内的二次加减法,也就是生成a±b±c=d的算式,abcd都为0到100的整数,且计算过程中不应该出现负数,那这样的算式应该怎么写公式呢。

第一步:先确定a

首先随机生成100以内的整数,可以用到RANDBETWEEN函数,它的作用是返回两个值(下限和上限)之间的随机整数,那么a就可以直接写为=RANDBETWEEN(0,100)。

第二步:生成中间的运算符

运算符是"+"还是"-",本质上就是二选一的判断,很像TRUE和FALSE,用IF函数去判断一个真假事件,然后输出"+"或"-"。=IF(RANDBETWEEN(0,1)=0,"+","-")这个公式的意思是判断随机生成的0或1是否等于0,是则生成"+",否则生成"-"。
我们还可以换一种写法:=IF(RAND()>0.5,"+","-"),可以通过调整阈值来控制生成的"+"和"-"的比例。

第三步:生成b并控制结果不超过范围

b同样可以使用=RANDBETWEEN(0,100)生成,但要注意的是,a±b的结果不能超过0到100这个范围,所以在写b的时候需要多一个判断条件来控制随机生成的上下限。
  若运算符为"+",b 取 0 到 100 -a的随机整数
  若运算符为"-",b 取 0 到 a 的随机整数
嵌套一个IF语句把两种情况合并:=IF(B2="+",RANDBETWEEN(0,100-A2),RANDBETWEEN(0,A2))

第四步:生成c并控制结果不超过范围

和写b的公式一样,不同的是需要先计算a±b后再套入到上一步写的公式中,使用连接符&将a、b和运算符连接起来,再用EVALUATE函数将文本表示的公式进行求值,这时候c的公式写为:=IF(D2="+",RANDBETWEEN(0,100-EVALUATE(A2&B2&C2)),RANDBETWEEN(0,EVALUATE(A2&B2&C2)))

第五步:将这些内容连接成文本

使用TEXTJOIN函数,将刚才生成的内容连接为文本,即可得到最终算式=TEXTJOIN("",TRUE,A2:E2)&"="。
如果需要备注答案,可以用=EVALUATE(A2&B2&C2&D2&E2)进行计算。

这样写好一行就是一个算式,按F9就能刷新,如果想要更多就往下填充即可。

到这里也只是实现了批量生成算式,但那么多辅助列,打印出来就很难看,如何把这些算式平铺在纸上呢?

第六步:将生成的算式平铺在一页上

新建一个工作表,调整好页边距后,将视图转换为页面布局或分页预览,使用WRAPROWS函数将刚才生成的一列算式转为指定列数的合计,WRAPROWS函数的功能是将一维数组含行转换为二维数组。
在A1单元格写上公式=WRAPROWS('2 100以内加减法'!G2:G100,4,""),就可以将刚才生成的算式转换为一个4列的区域。

但是这样有个局限,如果想生成更多,还得调整引用区域,如果之间引用整列,又会将所有的行都转换,就会得到一个1048576个单元格的区域,没有公式的单元格会显示为0,并且打印会全部打印出来,表格还会巨卡。
这个时候我们用FILTER函数将非空区域筛选出来,FILTER函数的功能是根据条件筛选出区域或数组,最终公式写为:
=WRAPROWS(FILTER('2 100以内加减法'!G:G,'2 100以内加减法'!G:G<>""),4,"")

设置好行高列宽、字体字号,即可完成一份100以内的加减法算式。

我们还可以把下限0和上限100定义为名称,通过改变上限和下线的数组以实现更多的应用场景,关于名称管理器是如何使用的,请大家关注我后续发帖(主要内容已基本完成,近期发布后会修改此处,添加跳转链接)。


本期的内容都很简单,按照步骤一步一步自己就能实现,因此没有放过多图片展示操作步骤,如果想要之间获取案例文件可以之间点击下方链接进行下载 ↓

https://www.kdocs.cn/l/ctyIs1lXMZuw


100以内的加减法,要是用WPS Query该怎么实现呢?隔空喊话HC.旋老师,快去出新教程吧~

浏览 124
1
11
分享
11 +1
9
1 +1
全部评论 9
 
LUKY
厉害!跟着song老师好好学习一下。
   广东省
举报
0
0
 
拾光漫行
向song老师学习=MAKEARRAY(9,9,LAMBDA(x,y,IF(y>x,"",y&"×"&x&"="&x*y)))
   重庆
举报
1
5
拾光漫行
=TEXTJOIN(MAP(ROW(A1:A2),LAMBDA(x,CHOOSE(RANDBETWEEN(1,2),"+","-"))),,MAP(ROW(A1:A3),LAMBDA(x,RANDBETWEEN(1,100))))&"=" 写个粗糙的
· 重庆
举报
0
0
 
HC.旋
HC.旋 WPS资深用户Lv.3 优质创作者WPS寻令官KVPWPS产品体验官

Lv.3 优质创作者

哈哈沙发
   福建省
举报
0
1
song
songWPS资深用户Lv.3 优质创作者WPS金话筒WPS寻令官

Lv.3优质创作者

还得是你
·
举报
0
0