ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 效率神器,一键搞定繁琐工作
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
让更多数据处理,一键完成 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
楼主: 香川群子

[原创] 史上最酷的Excel VBA 组合算法 代码

  [复制链接]

TA的精华主题

TA的得分主题

发表于 2014-5-22 16:38 | 显示全部楼层
本帖已被收录到知识树中,索引项:其他结构和算法
香川群子 发表于 2014-5-22 09:31
代码如附件。

附件为2003版,可自行转为2007版后使用。

谢谢香川群子老师!可能是我说错了。应该是不重复的排列,结果应该是48598个,一列可以排完的(我用的是2007版)。老师,按结果48598个如果是排列,怎么写代码?感谢您了!!!
另外,如果结果多于1048575时,超出部分写在aq2:av列,结果不应该多于2列的(最多为1344904个)
谢谢香川群子老师!!!

TA的精华主题

TA的得分主题

 楼主| 发表于 2014-5-22 17:15 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
zhu918918 发表于 2014-5-22 16:38
谢谢香川群子老师!可能是我说错了。应该是不重复的排列,结果应该是48598个,一列可以排完的(我用的是2 ...

去除重复……

疑问.1
那每一个组合中的数字能重复出现吗?
例如:4,4,4,7,7,31 算不算有效组合?

疑问.2
那同时还要求组合必须是从小到大排序吧?
例如: 18,16,17,15,14,31 算不算有效组合?



TA的精华主题

TA的得分主题

 楼主| 发表于 2014-5-22 21:59 | 显示全部楼层
按照从小到大,排除不重复组合时的代码及附件:
  1. Dim sj&(), jg&(), m&, n&, k&, t&, cnt&, cnt2&
  2. Sub MultiColumnCombin() 'by kagawa
  3.     tms = Timer
  4.     [ai1].CurrentRegion = ""
  5.     sj0 = [aa1].CurrentRegion.Offset(1, 1)
  6.     '以AA1列中序号的行数决定原始数据区域大小。所以序号不能错!
  7.    
  8.     m = UBound(sj0) - 1: n = UBound(sj0, 2) - 1
  9.     ReDim sj&(1 To m, 1 To n)
  10.     For j = 1 To n
  11.         k = 0
  12.         For i = 1 To m
  13.             If sj0(i, j) Then k = k + 1: sj(k, j) = sj0(i, j)
  14.         Next
  15.         If k > l Then l = k
  16.     Next
  17.     '以上把数据转为Long型数值 可以提高计算速度。
  18.     m = l 'm更新为有效最大行数l 减少无效循环次数。
  19.    
  20.     cnt = InputBox("指定输出行数 cnt=", "", WorksheetFunction.Round(Cells.Rows.Count, -4))
  21.     ReDim jg&(cnt, 1 To n)
  22.     '指定输出行数 如2003 5万行 或2007时 100万行。
  23.    
  24.     k = 0: t = 0: cnt2 = 0: Call dgMN(1) '递归计算 并输出整数行的结果
  25.     If k Then [aj1].Offset(1, (n + 1) * cnt2).Resize(k, n) = jg: [ai1].Offset(, (n + 1) * cnt2) = cnt2 + 1 '输出最后零数行的结果
  26.     MsgBox Format(Timer - tms, "0.00s ") & Format(cnt * cnt2 + k, "#,##0")
  27. End Sub

  28. Sub dgMN(j&) '递归过程代码
  29.     Dim l&
  30.     For i = 1 To m '循环本列
  31.         If sj(i, j) = 0 Then Exit For '本列为空时退出
  32.         If sj(i, j) > t Then '确保大于上一列的值t 即可排除重复组合
  33.             jg(k, j) = sj(i, j) '填入组合数据
  34.             If j = n Then '已经到最后一列(=n)时
  35.                 k = k + 1
  36.                 For l = 1 To n - 1
  37.                     jg(k, l) = jg(k - 1, l) '循环复制上一列数据
  38.                 Next
  39.                
  40.                 If k = cnt Then '如果满足整数行则输出结果
  41.                     [aj1].Offset(1, (n + 1) * cnt2).Resize(cnt, n) = jg
  42.                     [ai1].Offset(, (n + 1) * cnt2) = cnt2 + 1: cnt2 = cnt2 + 1
  43.                     For l = 1 To n - 1
  44.                         jg(0, l) = jg(k, l) '循环复制上一列数据
  45.                     Next
  46.                     k = 0
  47.                 End If
  48.             Else
  49.                 t = sj(i, j)
  50.                 Call dgMN(j + 1) '递归到下一列
  51.                 t = sj(i, j)
  52.             End If
  53.         End If
  54.     Next
  55. End Sub
复制代码

香川多列组合.rar

24.23 KB, 下载次数: 202

评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2014-5-22 23:46 | 显示全部楼层
香川群子 发表于 2014-5-22 17:15
去除重复……

疑问.1

香川群子老师:例中2组合不是有效的。组合要求是从小到大无重复排列的数:1 2 3 4 5 6(最小组合),最大:29 30 31 32 33 34 。1 1 2 3 4 5,1 2 3 4 5 1,20 19 18 17 16 15等都无效。
谢谢香川群子老师!!!

TA的精华主题

TA的得分主题

发表于 2014-5-22 23:57 | 显示全部楼层
香川群子 发表于 2014-5-22 21:59
按照从小到大,排除不重复组合时的代码及附件:

结果非常正确(已演算几个),速度非常惊人!!!香川群子老师,有其他方式联系吗(如qq)?因为问题多,电脑运行慢等诸不便原因,还望香川群子老师留个联系方式,多谢了,香川群子老师!!!

TA的精华主题

TA的得分主题

发表于 2014-5-25 15:25 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
香川群子 发表于 2014-5-22 21:59
按照从小到大,排除不重复组合时的代码及附件:

老师,请问:如何把它装在一个按钮中?我装了几次没有成功。谢谢了!!!

TA的精华主题

TA的得分主题

发表于 2014-5-30 22:39 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
写的不错!!!

TA的精华主题

TA的得分主题

发表于 2014-7-28 14:27 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2014-7-28 14:36 | 显示全部楼层
留个记号。。有空来膜拜下

TA的精华主题

TA的得分主题

发表于 2014-8-2 23:18 | 显示全部楼层
香川群子 发表于 2014-5-22 21:59
按照从小到大,排除不重复组合时的代码及附件:

见识了复川老师的神功,看看老师能否用VBA写出m因素n水平的所有排列组合

劳您费神了,感谢!!!

求VBA写出m因素n水平的所有排列组合.rar

14.06 KB, 下载次数: 78

您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2024-11-17 07:41 , Processed in 0.043203 second(s), 8 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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