ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[求助] 求高手指教:如何用VBA在EXCEL中生成双色球红球33选6的所有组合明细

[复制链接]

TA的精华主题

TA的得分主题

发表于 2012-2-5 23:02 | 显示全部楼层 |阅读模式
求高手指教:如何用VBA在EXCEL中生成双色球红球33选6的所有组合明细

TA的精华主题

TA的得分主题

发表于 2012-2-5 23:45 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
33选6,组合结果共=1,107,568

在2003中可以排满接近17列……

这么多组合明细,给了你也没有毛的用处。


如果需要生成组合的代码,
最简单最有效的是:
  1. Sub Combin_33_6()
  2.     Dim a%, b%, c%, d%, e%, f%, s$
  3.     For a = 1 To 33 - 5
  4.     For b = a + 1 To 33 - 4
  5.     For c = b + 1 To 33 - 3
  6.     For d = c + 1 To 33 - 2
  7.     For e = d + 1 To 33 - 1
  8.     For f = e + 1 To 33
  9.         s = a & ";" & b & ";" & c & ";" & d & ";" & e & ";" & f
  10.     Next f, e, d, c, b, a
  11.    
  12. End Sub
复制代码

TA的精华主题

TA的得分主题

发表于 2012-2-6 07:32 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助

TA的精华主题

TA的得分主题

 楼主| 发表于 2012-2-12 22:43 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
高手 按照你的启发:我编写了以下代码:
   Sub combin_33_6()
   Dim a, b, c, d, e, f As Integer
   Dim thecell As Range
   Sheets("sheet1").Select
    Set thecell = Range("a1")
       For a = 1 To 28                                                'a最小为1
      
           For b = a + 1 To 29                                        'b最小为2
                             If a = b Then b = b + 1
               For c = b + 1 To 30                                    'c最小为3
                             If b = c Then c = c + 1
                   For d = c + 1 To 31                                'd最小为4
                             If c = d Then d = d + 1
                      For e = d + 1 To 32                             'e最小为5
                     
                             If d = e Then e = e + 1
                         For f = e + 1 To 33                          'f最小为6
                             If e = f Then f = f + 1
                             thecell.Value = a
                             Set thecell = thecell.Offset(0, 1)    '  移位
                             thecell.Value = b
                             Set thecell = thecell.Offset(0, 1)
                             thecell.Value = c
                             Set thecell = thecell.Offset(0, 1)
                             thecell.Value = d
                             Set thecell = thecell.Offset(0, 1)
                             thecell.Value = e
                             Set thecell = thecell.Offset(0, 1)
                             thecell.Value = f
                             Set thecell = thecell.Offset(1, -5)  ' 重新定位,换行换列
                         Next f
                      Next e
                   Next d
                Next c
            Next b
        Next a
   
End Sub
      在向工作表中写入第1048576条记录后,无法再写入组合记录,我按照第1048576记录的组合值继续向第二张工作表追加,运行代码如下
  Sub combin_33_6_1()
   Dim a, b, c, d, e, f As Integer
   Dim thecell As Range
   Sheets("sheet2").Select
    Set thecell = Range("a1")
       For a = 12 To 28                                                'a最小为1
      
           For b = 17 To 29                                        'b最小为2
                             If a = b Then b = b + 1
               For c = 22 To 30                                    'c最小为3
                             If b = c Then c = c + 1
                   For d = 27 To 31                               'd最小为4
                             If c = d Then d = d + 1
                      For e = 28 To 32                             'e最小为5
                     
                             If d = e Then e = e + 1
                         For f = 33 To 33                          'f最小为6
                             If e = f Then f = f + 1
                             thecell.Value = a
                             Set thecell = thecell.Offset(0, 1)    '  移位
                             thecell.Value = b
                             Set thecell = thecell.Offset(0, 1)
                             thecell.Value = c
                             Set thecell = thecell.Offset(0, 1)
                             thecell.Value = d
                             Set thecell = thecell.Offset(0, 1)
                             thecell.Value = e
                             Set thecell = thecell.Offset(0, 1)
                             thecell.Value = f
                             Set thecell = thecell.Offset(1, -5)  ' 重新定位,换行换列
                         Next f
                      Next e
                   Next d
                Next c
            Next b
        Next a
   
End Sub

在第2张工作表中只有33450条记录,两个表加起来1082029条记录,与combin(33,6)=1107568 相差 25539 条 记录,请高手指教,如何找出错误。多谢高手!

TA的精华主题

TA的得分主题

发表于 2012-2-13 00:22 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
很简单,虽然第 1048576 个组合结果是:12,17,22,27,28,33 没错,

但在这以后的循环中,当a升到13时,b还是要从14开始……

然而,你的代码直接就规定b从17开始,那么
a=13,b=14,……
a=13,b=15,……
a=13,b=16,……

这些组合,就全部被你跳过去了。

TA的精华主题

TA的得分主题

发表于 2012-2-13 00:27 | 显示全部楼层
比如,序号1053305,即第2张表的第4729个组合,应该是:13,14,15,16,17,18

你去查一下,你的结果里有没有? 我想肯定是没有。呵呵。

TA的精华主题

TA的得分主题

发表于 2012-2-13 00:28 | 显示全部楼层
顺便说,你的代码改了以后,很愚蠢。

类似于 If a = b Then b = b + 1

这样的判断是不需要的,因为更本不可能发生。

TA的精华主题

TA的得分主题

发表于 2012-2-13 00:50 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
组合结果合并成一列,含输出结果的代码:
  1. Sub Combin_33_6()
  2.     Dim a%, b%, c%, d%, e%, f%, k&, l%, m&, s$
  3. '    m = 4 ^ 8 '2003版
  4.     m = 4 ^ 10 '2007版
  5.     ReDim r(1 To m, 1 To 1) '2003或2007版
  6.    
  7.     For a = 1 To 33 - 5
  8.     For b = a + 1 To 33 - 4
  9.     For c = b + 1 To 33 - 3
  10.     For d = c + 1 To 33 - 2
  11.     For e = d + 1 To 33 - 1
  12.     For f = e + 1 To 33
  13.         k = k + 1
  14.         If k > m Then
  15.             Cells(1, l * 2 + 1).Resize(m) = r
  16.             ReDim r(1 To m, 1 To 1) '2003或2007版
  17.             l = l + 1
  18.             k = 1
  19.         End If
  20.         r(k, 1) = a & ";" & b & ";" & c & ";" & d & ";" & e & ";" & f
  21.    
  22.     Next f, e, d, c, b, a
  23.     Cells(1, l * 2 + 1).Resize(k) = r
  24. End Sub
复制代码

TA的精华主题

TA的得分主题

发表于 2012-2-13 00:53 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
组合结果分成6列输出的代码:
  1. Sub Combin_33_6_6()
  2.     Dim a%, b%, c%, d%, e%, f%, k&, l%, m&, s$
  3. '    m = 4 ^ 8 '2003版
  4.     m = 4 ^ 10 '2007版
  5.     ReDim r(1 To m, 1 To 6) '2003或2007版
  6.    
  7.     For a = 1 To 33 - 5
  8.     For b = a + 1 To 33 - 4
  9.     For c = b + 1 To 33 - 3
  10.     For d = c + 1 To 33 - 2
  11.     For e = d + 1 To 33 - 1
  12.     For f = e + 1 To 33
  13.         k = k + 1
  14.         If k > m Then
  15.             Cells(1, l * 7 + 1).Resize(m, 6) = r
  16.             ReDim r(1 To m, 1 To 1) '2003或2007版
  17.             l = l + 1
  18.             k = 1
  19.         End If
  20.         r(k, 1) = a
  21.         r(k, 2) = b
  22.         r(k, 3) = c
  23.         r(k, 4) = d
  24.         r(k, 5) = e
  25.         r(k, 6) = f
  26.    
  27.     Next f, e, d, c, b, a
  28.     Cells(1, l * 7 + 1).Resize(k, 6) = r
  29. End Sub
复制代码

TA的精华主题

TA的得分主题

 楼主| 发表于 2012-2-13 23:24 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
香川群子 发表于 2012-2-13 00:28
顺便说,你的代码改了以后,很愚蠢。

类似于 If a = b Then b = b + 1

尊敬的高手:经过你的指点,我知道错误在第二长表的初始赋值上,经过思考我认为程序是不是能够这样写?,当接近1048576行时将输出结果输出到第二张表上,
故在程序开始设置一个行计数变量,但是程序运行好像进入死循环,不知道错在哪里,顺便告诉高手那句  If a = b Then b = b + 1 好像有必要,我就是看见生成的
数据中有  1,2,3,4,6,6  才写的,我的程序如下,烦高手赐教:
Sub combin_33_6()
   Dim a, b, c, d, e, f As Integer
   Dim thecell As Range
   Dim i As Long
   i = 0
   Sheets("sheet1").Select
    Set thecell = Range("a1")
       For a = 1 To 28                                                'a最小为1
      
           For b = a + 1 To 29                                        'b最小为2
                             If a = b Then b = b + 1
               For c = b + 1 To 30                                    'c最小为3
                             If b = c Then c = c + 1
                   For d = c + 1 To 31                                'd最小为4
                             If c = d Then d = d + 1
                      For e = d + 1 To 32                             'e最小为5
                     
                             If d = e Then e = e + 1
                         For f = e + 1 To 33                          'f最小为6
                             If e = f Then f = f + 1
                             i = i + 1
                             
                             If i < 1048575 Then
                             
                                     thecell.Value = a
                                     Set thecell = thecell.Offset(0, 1)    '  移位
                                     thecell.Value = b
                                     Set thecell = thecell.Offset(0, 1)
                                     thecell.Value = c
                                     Set thecell = thecell.Offset(0, 1)
                                     thecell.Value = d
                                     Set thecell = thecell.Offset(0, 1)
                                     thecell.Value = e
                                     Set thecell = thecell.Offset(0, 1)
                                     thecell.Value = f
                                      Set thecell = thecell.Offset(1, -5)  ' 重新定位,换行换列
                             Else
                                      Sheets("sheet2").Select
                                      Set thecell = Range("a1")
                                     thecell.Value = a
                                     Set thecell = thecell.Offset(0, 1)    '  移位
                                     thecell.Value = b
                                     Set thecell = thecell.Offset(0, 1)
                                     thecell.Value = c
                                     Set thecell = thecell.Offset(0, 1)
                                     thecell.Value = d
                                     Set thecell = thecell.Offset(0, 1)
                                     thecell.Value = e
                                     Set thecell = thecell.Offset(0, 1)
                                     thecell.Value = f
                                     Set thecell = thecell.Offset(1, -5)  ' 重新定位,换行换列
                             
                             End If
                             
                         Next f
                      Next e
                   Next d
                Next c
            Next b
        Next a
   
End Sub

不知道什么原因,程序运行很久,无法结束?
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2024-11-20 04:49 , Processed in 0.033984 second(s), 9 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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