ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[求助] vba数组,组合

[复制链接]

TA的精华主题

TA的得分主题

发表于 2015-9-19 21:17 | 显示全部楼层 |阅读模式
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
1.jpg 把选号表格中的六行组合成组合表格那样
每一组都是不能有重复数字,并按行1 2 3 4 5 6的方式从小到大组合



2.jpg




样.rar

11.81 KB, 下载次数: 17

TA的精华主题

TA的得分主题

发表于 2015-9-19 22:59 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
还好,运行了一下没死机。

现在的结果是:
1. 多列组合 排除组合内数字重复 如 2,3,4,8,16,16
2. 从小到大排序 如 6,4,11,10,17,15 改为 4,6,10,11,15,17 后输出
3. 用字典排除重复的组合。

香川多列组合应用.rar

16.9 KB, 下载次数: 273

评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2015-9-19 21:21 | 显示全部楼层
这个问题最好请教“香川群子"老师,排序、组合等方面的权威

TA的精华主题

TA的得分主题

发表于 2015-9-19 22:04 | 显示全部楼层
问题不难,属于典型的【香川多列组合】

但是,你现在6行14列元素的组合,总数=14^6=7,529,536 即750多万……比33选6的组合结果还要多。

其中会有大量的重复。
如果要求每一个组合中的6个数字从小到大排序,然后排除重复……估计最后结果也就是回到Combin(33,6)=1,107,568 这么多了。

所以,你的要求毫无意义。

TA的精华主题

TA的得分主题

发表于 2015-9-19 22:12 | 显示全部楼层
如果从小到大排序,那么只有 4,665,702 即467万个组合。(含重复)



TA的精华主题

TA的得分主题

发表于 2015-9-19 22:25 | 显示全部楼层
本帖最后由 香川群子 于 2015-9-19 23:05 编辑

代码是简单的,但这么750多万个巨量的组合,输出成了问题……一般会死机吧。


原始数据应该转置为14行6列。
行数可以任意增减,每一列中元素个数可以不同(末尾可以是任意数量的空白单元格)

  1. Dim sj, jg(), a(1 To 33), d, m&, n&, k&, tms#
  2. Sub MultiCombin() '香川多列组合
  3.     tms = Timer
  4.     sj = [a1].CurrentRegion '读入多行6列数据
  5.    
  6.     m = UBound(sj): n = UBound(sj, 2) '读取最大行数m、总列数n(=6)
  7.    
  8.     Set d = CreateObject("Scripting.Dictionary") '设置字典排除重复
  9.     Open ActiveWorkbook.Path & "\Result.txt" For Output As #1 '输出组合结果到Txt文件 (输出到工作表会死机)
  10.     k = 0: Call dgMN(1) '调用递归过程
  11.     Close #1 '关闭Txt文件
  12.    
  13.     Application.StatusBar = Format(Timer - tms, "0.0s ") & d.Count & "/" & k
  14.     MsgBox Format(Timer - tms, "0.00s ") & d.Count & "/" & k '运行结束,提醒程序耗时、排序后字典中不重复组合数 / 组内不重复组合总数
  15. End Sub

  16. Sub dgMN(j&)
  17.     Dim i&
  18.     For i = 1 To m '遍历各行
  19.         t = sj(i, j): If t = "" Then Exit For '到本列末尾空白时退出
  20.         If a(t) = "" Then '如该元素状态为空 则可以提取组合
  21.             a(t) = t
  22.             If j < n Then
  23.                 Call dgMN(j + 1)
  24.             Else
  25.                 k = k + 1: s2 = WorksheetFunction.Trim(Join(a)) '提取从小到大排序的组合结果
  26.                 If Not d.Exists(s2) Then d(s2) = "": Print #1, s2 '用字典排除重复 然后输出到Txt文件
  27.                 If k Mod 10000 = 0 Then Application.StatusBar = Format(Timer - tms, "0.0s ") & d.Count & "/" & k & "..." & s
  28.                 DoEvents '每1万个组合 在状态栏上更新显示进度
  29.             End If
  30.             a(t) = ""
  31.         End If
  32.     Next
  33. End Sub
复制代码

TA的精华主题

TA的得分主题

 楼主| 发表于 2015-9-20 10:00 | 显示全部楼层
香川群子 发表于 2015-9-19 22:04
问题不难,属于典型的【香川多列组合】

但是,你现在6行14列元素的组合,总数=14^6=7,529,536 即750多万 ...

呵呵。我这个就是彩票的,所以还想要增加个缩水的和定胆的

TA的精华主题

TA的得分主题

 楼主| 发表于 2015-9-20 10:19 | 显示全部楼层
本帖最后由 哦哈尼哈尼 于 2015-9-20 10:20 编辑
香川群子 发表于 2015-9-19 22:59
还好,运行了一下没死机。

现在的结果是:

可以在此基础上帮我增加几个缩水条件吗。1,胆码组:由1到33个红球号码组成,选择一组用户认为要出现的号码,并设置要出现的个数,组合起来确定出号条件。2\红球和值范围例(21到183) 3\定位和尾(1到10个)4\红球第一位和第六位的差(1到10个)5、AC值(1到11个)

TA的精华主题

TA的得分主题

发表于 2015-9-20 19:32 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2018-10-13 17:28 | 显示全部楼层
香川群子 发表于 2015-9-19 22:25
代码是简单的,但这么750多万个巨量的组合,输出成了问题……一般会死机吧。

老师你好,我不需要排除重复的话应该怎么写?
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2025-1-17 00:05 , Processed in 0.025907 second(s), 12 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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