ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 Excel Home精品图文教程库
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
300集Office 2010微视频教程 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
查看: 3778|回复: 28

[分享] 聊聊多组相同大小的数组元素的所有组合与Mod、Int的那些事

[复制链接]
回帖奖励 100 财富 回复本帖可获得 5 财富奖励! 每人限 1 次

TA的精华主题

TA的得分主题

发表于 2021-5-14 12:00 | 显示全部楼层 |阅读模式
本帖最后由 魚。。 于 2021-5-19 17:45 编辑

论坛亲爱的小伙伴们,大家好。
      从我注册ExcelHome至今,我在论坛里也摸爬滚打那么两几年了,明里暗里的学习了论坛版主、大佬、前辈、E友们的各种招式技能。从一个小小白也算变成小白了。也借此表示感谢。今天算是与大家分享知识体会的第一帖。希望能与所有Excel爱好者一起学习进步。
      今天要和大家分享的是昨天在论坛回帖时遇到的——列出多组数的所有组合情况,用到了基础的:intmod配合行列来生数字序列的知识内容。具体往下看吧。
      既然是分享,也考虑和两年前的我一样在这里初来乍到时懵懵懂懂的时候,所以,还是一步一步来。当然,专家,老师们就可以直接跳过了,或者就跳过 整篇吧。如果之前已经有老师有此类似研究,也可以引荐一下,这里就当复习了。

首先来望望Row函数:
ROW(reference)
Reference为需要得到其行号的单元格或单元格区域。
如果省略reference,则是对函数ROW所在单元格的引用。
比如:
公式:=ROW(A1)
返回A1单元格所在行的行号:1
公式:=ROW(1:10)
返回110行的行号:={1;2;3;4;5;6;7;8;9;10}
图片1.png
如果省略参数:那么公式在哪行就返回哪行的行号:
如下图:在B2单元格输入公式:=ROW()
返回B2单元格的行号:2
image.png
Row就说这么多吧(再聊肉,怕被打)。
另外还有个Column 函数。返回列号的。就是个横竖问题。不重复说了。

接下来我们再聊聊 Int 函数在今天我们需要用到的功能。(取整)
直接上图:
生成指定数量的序列:
image.png
首先,用Row生成序列,然后除以个数,再取整。
仔细一看,你是不是该说:“小鱼同学,你这不是瞎搞么,欺负我们眼神不好吗?”E列取出来的内容,完全不对嘛。
赶紧改正一下,因为开头就不对了呀,数字/2 再取整,第一个当然要用2/2 得到才对嘛:
所以:公式:=Int(Row(a2)/2)
image.png
Int结束。
Mod开始:
Mod,求魚函数,不是求魚,是求余。
语法:MOD(number,divisor)
参数:
Number 为被除数。
Divisor 为除数
直接说今天的用途:
生成循环序列:
image.png
首先,还是Row,没肉不香嘛。
然后用Row出来的序列除以要循环到的数:5,就会得到对应的余数,余数就会在规定范围内循环了。
这次我知道你要说什么了。D列结果又崴了。5呢
这次处理就不只是开头了,要来个内外处理。余数比除数小,(小学学的嘛)还有可能没有余数会得到0,那么除以5,我们可以得到的余数当然是:0,1,2,3,4  要得到1,2,3,4,5 全部加1就好了嘛。但是还有个问题,D列那些数,全部加1,也不对嘛。不就成了2,3,4,5,1了么。所以,这次里边的肉也要加工一下了。直接看公式把:
公式:=Mod(Row(a1)-1,5)+1
image.png
要讲的函数,终于讲完了。文采又欠佳,把我这艺术生逼得啊。
剩下的内容,换个楼层,放2楼。

聊聊多组相同大小的数组的所有组合_魚.rar

163.94 KB, 下载次数: 22

评分

11

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2021-5-14 12:18 | 显示全部楼层
本帖最后由 魚。。 于 2021-5-19 17:47 编辑

接下来要把Int和Mod约起来玩一下了:
这次我想得到这样的序列:1,1,2,2,3,3,1,1,2,2,3,3 ……
首选,每个数重复了2次,之前用的Int,然后整体又再循环,刚讲完的求魚:
image.png
=MOD(INT(ROW(A2)/2)-1,3)+1
通过两人的配合,得到了我想要的结果。
以上说了许多偏废话的内容(因为90%的小伙伴应该都比我熟)

接下来得严肃点,要聊聊今天想分享给大家的一点小运用。
刚才这个公式:=MOD(INT(ROW(A2)/2)-1,3)+1
Row里边开始的行号是准备重复多少次的次数,“/” 号后边也是一样的。
Mod的第二参数是数字循环的上限,要循环到3,所以是3
若重复个数用 n 来表示,当n=1的时候,也就是不需要重复元素
那么 =MOD(INT(ROW(A1)/n)-1,3)+1 就等同于 =MOD(ROW(A1)-1,3)+1
若循环里最大值用 m表示,当 结果个数 <= n*m 的时候
比如 n =2m =3 ,当结果数量 <= 6
那么 =MOD(INT(ROW(A2)/n)-1,m)+1=INT(ROW(A2)/n) 得到的结果就是一样的
切回主题:《多组相同大小数组的所有组合》:
QQ图片20210514092323.png
我们看一下公式统一之后,3列公式的区别主要就是INT里边的行数,和除数:
=MOD(INT(ROW(9:9)/9)-1,3)+1
=MOD(INT(ROW(3:3)/3)-1,3)+1
=MOD(INT(ROW(1:1)/1)-1,3)+1
观察一下可以得到变化规律:前一列是后边一列的3倍。也就是3的一组求幂运算:
9=3^2,3=3^1,1=3^0
那3是什么呢,3就是数据源一共有多少行需要组合。
而2,1,0 是列的变化,所以我们只要通过列号的变化,就可以统一公式了
然后我们再来看一下,mod第二参数里边的3
=MOD(INT(ROW(9:9)/9)-1,3)+1
这里的3是循环最大值,如果数据源有4行数据,那么这里自然就是要循环到4了,所以这个3是也是数据源的行数。
这样的话,若我们用 r 表示数据源的行数。
可以得到这个结果:
=MOD(INT(r^2/r^2)-1,r)+1
=MOD(INT(r^1/r^1)-1,r)+1
=MOD(INT(r^0/r^0)-1,r)+1
那么里边2,1,0 如果通过函数生成呢。前边说了一下Column函数嘛
用数据源的列数 c 分别减去column(a1),column(b1),column(c1)就可以得到啦
所以又得到了这个结果:
=MOD(INT(r^(c-column(a1))/r^(c-column(a1)))-1,r)+1
=MOD(INT(r^(c-column(b1))/r^(c-column(b1)))-1,r)+1
=MOD(INT(r^(c-column(c1))/r^(c-column(c1)))-1,r)+1
所以我们在P列输入公式:
=MOD(INT(r^(c-column(a1))/r^(c-column(a1)))-1,r)+1
右拉之后,也就得到后两个公式了
那么公式下拉的时候,别忘了还要生成序列呢,所以这时候又要肉肉了。
=MOD(INT((ROW(A1)-1+r^(c-column(a1)))/r^(c-column(a1)))-1,r)+1
      至于为什么要row(a1)-1,自然是因为要从0开始加,因为初始行已经用r^(c-column(a1))处理好了,也可以用row()-公式所在的行号。灵活运用就不多说了。
序列我们构建好了,剩下就是引用了。
Index,offset等自己挑一个吧。比如:
=OFFSET(a$1,MOD(INT((ROW(A1)-1+r^(c-column(a1)))/r^(c-column(a1)))-1,r)+1,)
      最后完善一下,因为整体全部循环完一次后,还会再来一次。别忘了第一列也是套了mod的。所以加个判断:当行数超过组合结果的数量,就不显示了呗。
组合结果有多少怎么知道的:(前边说过了,不说你应该也知道了)
我就这样写了:
=if(row(a1)>r^c,"",OFFSET(a$1,MOD(INT((ROW(A1)-1+r^(c-column(a1)))/r^(c-column(a1)))-1,r)+1,))
把r ,c 换成行数,列数,也就出结果了。行数,列数可以用单元格引用。或者直接counta等动态获取。就不过多阐述了。
      基础的东西,被我写了嫩么多,有点班门弄斧的感觉。不管了,第一个分享帖嘛,以后学业又成了,再和大家分享讨论。涉及相关知识不完善,不合理的地方,欢迎大家讨论、指正。针对这一类型有其他好的方法,也欢迎老师们借此附件需求进行赐教以助学习。
      End,谢谢!

评分

2

查看全部评分

TA的精华主题

TA的得分主题

发表于 2021-5-14 13:37 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册

回帖奖励 +2 财富

回复本帖可获得 2 ¥财富奖励! 每人限 1 次
求教:怎么设置的.....我怎么找不到呢

TA的精华主题

TA的得分主题

 楼主| 发表于 2021-5-14 13:51 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
image.png

黑黑,真的假的,海神不知道的,莫非是新功能,我看最下边有这个选项。就点进去整了一个,以前好像确实也没见过

TA的精华主题

TA的得分主题

发表于 2021-5-14 13:56 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
我真没有~!!
版主没有的吗.png

TA的精华主题

TA的得分主题

 楼主| 发表于 2021-5-14 13:57 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册

咦,确实,这是什么原理。而且这个奖励设置的时候,还可以设置中奖概率。我设了100%

TA的精华主题

TA的得分主题

发表于 2021-5-14 13:59 | 显示全部楼层
本帖最后由 象山海鲜 于 2021-5-14 14:03 编辑
魚。。 发表于 2021-5-14 13:57
咦,确实,这是什么原理。而且这个奖励设置的时候,还可以设置中奖概率。我设了100%

可能和用户组有关吧.....
就看你们玩也好

找到了
铁杆.png
只有 铁杆有这个功能

TA的精华主题

TA的得分主题

发表于 2021-5-14 14:02 | 显示全部楼层

TA的精华主题

TA的得分主题

 楼主| 发表于 2021-5-14 14:06 | 显示全部楼层
象山海鲜 发表于 2021-5-14 13:59
可能和用户组有关吧.....
就看你们玩也好

image.png

原来是这样的,版主专门发奖励,都不带收的

TA的精华主题

TA的得分主题

 楼主| 发表于 2021-5-14 14:08 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
624134745 发表于 2021-5-14 14:02
老师开始上课了呀,支持支持!

哪里哪里,基础分享。
我说灰灰老师怎么没有财富奖励,原来我没设置对,次数没有选。
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2024-3-29 09:02 , Processed in 0.057749 second(s), 15 queries , Gzip On, Redis On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

沪公网安备 31011702000001号 沪ICP备11019229号-2

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:李志群律师

快速回复 返回顶部 返回列表