ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

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

  [复制链接]

TA的精华主题

TA的得分主题

发表于 2014-4-17 23:12 | 显示全部楼层
本帖已被收录到知识树中,索引项:其他结构和算法
香川群子 发表于 2013-9-24 10:25
我的代码是不可能有错误的。是你的要求有问题。

你的10个原始数据中0重复了3次……你想要得到什么样 ...

关于这个10取3的不重复排列数到底孰对孰错?备注:10个元素中3个相同的,其余7个元素与之不同,且彼此不同的情况。???

TA的精华主题

TA的得分主题

发表于 2014-4-18 00:18 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
不明觉厉。。。。。。。。。。。。。。。

TA的精华主题

TA的得分主题

 楼主| 发表于 2014-4-18 13:30 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
aoe1981 发表于 2014-4-17 23:12
关于这个10取3的不重复排列数到底孰对孰错?备注:10个元素中3个相同的,其余7个元素与之不同,且彼此不同 ...

没有附件无法判断

TA的精华主题

TA的得分主题

 楼主| 发表于 2014-4-18 13:31 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
aoe1981 发表于 2014-4-17 23:12
关于这个10取3的不重复排列数到底孰对孰错?备注:10个元素中3个相同的,其余7个元素与之不同,且彼此不同 ...

完全不知道你说的是什么东西。

TA的精华主题

TA的得分主题

 楼主| 发表于 2014-4-18 13:59 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
aoe1981 发表于 2014-4-14 23:54
  “但如果需要排除3个重复的0,则只有64个不重复组合结果,或者274个不重复排列结果。”——摘自55楼  ...

10个数中3个相同,其余7个不同。
它们的排列组合排除重复结果以后的所有组合,是应该有 358个。你说的是对的。


TA的精华主题

TA的得分主题

发表于 2014-4-18 14:36 | 显示全部楼层
香川群子 发表于 2014-4-18 13:59
10个数中3个相同,其余7个不同。
它们的排列组合排除重复结果以后的所有组合,是应该有 358个。你说的是 ...

哦,一般来说,逻辑推理想得的似乎没有实验罗列来的可靠……主要是从55楼看来,您的结果是代码罗列出来的……这下算是蹋实了……

TA的精华主题

TA的得分主题

发表于 2014-5-19 16:07 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
厉害,好好研究一下

TA的精华主题

TA的得分主题

发表于 2014-5-22 00:38 | 显示全部楼层
香川群子 发表于 2014-4-18 13:59
10个数中3个相同,其余7个不同。
它们的排列组合排除重复结果以后的所有组合,是应该有 358个。你说的是 ...

香川群子老师,有几个问题非常想请教您,首先是如何组合附件中的数据(ab2:ag35),每组6个。谢谢了!(希望运行尽量地快,我的电脑内存为512的)

组合了.rar

18.8 KB, 下载次数: 43

TA的精华主题

TA的得分主题

 楼主| 发表于 2014-5-22 08:34 | 显示全部楼层
zhu918918 发表于 2014-5-22 00:38
香川群子老师,有几个问题非常想请教您,首先是如何组合附件中的数据(ab2:ag35),每组6个。谢谢了!(希望 ...

附件要求很简单,其实是典型的【香川多列组合】。

但是结果数比较多,附件例子中组合结果数=15*16*15*19*16*3=3,283,200 可以填满3列多。

TA的精华主题

TA的得分主题

 楼主| 发表于 2014-5-22 09:31 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
zhu918918 发表于 2014-5-22 00:38
香川群子老师,有几个问题非常想请教您,首先是如何组合附件中的数据(ab2:ag35),每组6个。谢谢了!(希望 ...

代码如附件。

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


请在AB列中输入原始数据的行序号,如果输入错误或留有空白间隔将影响原始数据读取。
  1. Dim sj&(), jg&(), m&, n&, k&, cnt&, cnt2&
  2. Sub MultiColumnCombin() 'by kagawa
  3.    
  4.     sj0 = [aa1].CurrentRegion.Offset(1, 1)
  5.     '以AA1列中序号的行数决定原始数据区域大小。所以序号不能错!
  6.    
  7.     m = UBound(sj0) - 1: n = UBound(sj0, 2) - 1
  8.     ReDim sj&(1 To m, 1 To n)
  9.     For j = 1 To n
  10.         k = 0
  11.         For i = 1 To m
  12.             If sj0(i, j) Then k = k + 1: sj(k, j) = sj0(i, j)
  13.         Next
  14.         If k > l Then l = k
  15.     Next
  16.     '以上把数据转为Long型数值 可以提高计算速度。
  17.     m = l 'm更新为有效最大行数l 减少无效循环次数。

  18.     cnt = [ai1]: ReDim jg&(cnt, 1 To n)
  19.     '根据AI1中指定数值作为输出行数 如5万行,或100万行都可以。这样2003和2007都可以适用了。
  20.     cnt2 = 1: [iv1].End(1).Offset(, 2) = cnt2
  21.    
  22.     k = 0: Call dgMN(1) '递归计算 并输出整数行的结果
  23.     If k Then [iv1].End(1).Offset(1, 1).Resize(k, n) = jg '输出最后零数行的结果
  24. End Sub

  25. Sub dgMN(j&) '递归过程代码
  26.     Dim i&, l&
  27.     For i = 1 To m '循环本列
  28.         If sj(i, j) = 0 Then Exit For '为空时退出
  29.         jg(k, j) = sj(i, j) '填入组合数据
  30.         If j = n Then '已经到最后一列(=n)时
  31.             For l = 1 To n
  32.                 If jg(k, l) Then Exit For Else jg(k, l) = jg(k - 1, l)
  33.                 '循环检查如果本列为空则复制上一列数据 不为空则可退出
  34.             Next
  35.             k = k + 1
  36.             If k = cnt Then '如果满足整数行则输出结果
  37.                 k = 0: [iv1].End(1).Offset(1, 1).Resize(cnt, n) = jg
  38.                 cnt2 = cnt2 + 1: [iv1].End(1).Offset(, 1 + n) = cnt2
  39.             End If
  40.         Else
  41.             Call dgMN(j + 1) '递归到下一列
  42.         End If
  43.     Next
  44. End Sub
复制代码
MultiColumnCombin.zip (13.25 KB, 下载次数: 154)


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

本版积分规则

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

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

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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