Excel精英培训网

 找回密码
 注册
数据透视表40+个常用小技巧,让你一次学会!
楼主: mmc998

[已解决]33个数中生成不 重复6个数

[复制链接]
发表于 2014-10-6 02:01 | 显示全部楼层
试着做过,现在连文件都没有了。
回复

使用道具 举报

发表于 2014-10-6 10:38 | 显示全部楼层
0.1s  即可生成 Combin(33,6) = 1107568 个组合……但已经超过工作表最大行数 1048576行。
回复

使用道具 举报

 楼主| 发表于 2014-10-6 23:53 | 显示全部楼层
香川群子 发表于 2014-10-6 10:38
0.1s  即可生成 Combin(33,6) = 1107568 个组合……但已经超过工作表最大行数 1048576行。

做 两个 表可以吗
回复

使用道具 举报

 楼主| 发表于 2014-10-7 00:18 | 显示全部楼层
xdragon 发表于 2014-10-5 23:39
最终结果在re这个数组里,由于33选6有110多w组合,一次性无法导出到单元格。如果需要请回复哈

怎么能出来呀
回复

使用道具 举报

 楼主| 发表于 2014-10-7 00:19 | 显示全部楼层
xdragon 发表于 2014-10-5 23:39
最终结果在re这个数组里,由于33选6有110多w组合,一次性无法导出到单元格。如果需要请回复哈

需要呀
回复

使用道具 举报

发表于 2014-10-7 02:24 | 显示全部楼层    本楼为最佳答案   
本帖最后由 xdragon 于 2014-10-7 02:33 编辑
  1. Dim ttl%, chs%, rnd_array%(), t_array%(), cbn&, irow&, cnt&

  2. Sub test()
  3.    ttl = 5: chs = 3
  4.    cbn = Application.WorksheetFunction.Combin(ttl, chs)
  5.    irow = Rows.Count
  6.    If cbn > irow Then ReDim rnd_array%(1 To irow, 1 To chs) Else ReDim rnd_array%(1 To cbn, 1 To chs)
  7.    ReDim t_array%(1 To chs)
  8.    Call dgzh(1, 0)
  9. End Sub

  10. Sub dgzh(yn%, n%)
  11.    Dim i%, j%
  12.    For i = n + 1 To ttl - chs + yn
  13.        If yn <= chs Then
  14.           t_array(yn) = i
  15.           Call dgzh(yn + 1, i)
  16.        Else
  17.           cnt = cnt + 1
  18.           For j = 1 To chs
  19.              rnd_array(cnt, j) = t_array(j)
  20.           Next
  21.           If cnt Mod irow = 0 Or cnt = cbn Then
  22.               Call array_to_range
  23.           End If
  24.           Exit Sub
  25.        End If
  26.    Next
  27. End Sub

  28. Sub array_to_range()
  29.     Static shtcnt%
  30.     shtcnt = shtcnt + 1
  31.     If Sheets.Count < shtcnt Then Sheets.Add , Sheets(Sheets.Count)
  32.     Sheets(shtcnt).Cells.Clear
  33.     Sheets(shtcnt).Range("A1").Resize(cnt, chs) = rnd_array
  34.     cbn = cbn - irow
  35.     If cbn > 0 Then
  36.        ReDim rnd_array(1 To IIf(cbn > irow, irow, cbn), 1 To UBound(rnd_array, 2))
  37.     Else
  38.        shtcnt = 0
  39.        Erase rnd_array
  40.     End If
  41.     cnt = 0
  42. End Sub
复制代码

评分

参与人数 1 +6 收起 理由
张雄友 + 6 太强大了。

查看全部评分

回复

使用道具 举报

 楼主| 发表于 2014-10-7 07:13 | 显示全部楼层
xdragon 发表于 2014-10-7 02:24

怎么用呀
回复

使用道具 举报

发表于 2014-10-7 21:50 | 显示全部楼层
xdragon 发表于 2014-10-7 02:24

只在一个表生成可以吗?如达到EXCEL 最大行数 rows.count 时,隔一空列再输出,可以吗?
回复

使用道具 举报

发表于 2014-10-7 22:04 | 显示全部楼层
xdragon 发表于 2014-10-7 02:24

16个表就会出现可用资源不足了。
  1. Dim ttl&, chs&, rnd_array&(), t_array&(), cbn&, irow&, cnt&

  2. Sub 多列组合()
  3.    ttl = 50: chs = 5
  4.    cbn = Application.WorksheetFunction.Combin(ttl, chs)
  5.    irow = Rows.Count
  6.    If cbn > irow Then ReDim rnd_array&(1 To irow, 1 To chs) Else ReDim rnd_array&(1 To cbn, 1 To chs)
  7.    ReDim t_array&(1 To chs)
  8.    Call dgzh(1, 0)
  9. End Sub

  10. Sub dgzh(yn&, n&)
  11.    Dim i&, j&
  12.    For i = n + 1 To ttl - chs + yn
  13.        If yn <= chs Then
  14.           t_array(yn) = i
  15.           Call dgzh(yn + 1, i)
  16.        Else
  17.           cnt = cnt + 1
  18.           For j = 1 To chs
  19.              rnd_array(cnt, j) = t_array(j)
  20.           Next
  21.           If cnt Mod irow = 0 Or cnt = cbn Then
  22.               Call array_to_range
  23.           End If
  24.           Exit Sub
  25.        End If
  26.    Next
  27. End Sub

  28. Sub array_to_range()
  29.     Static shtcnt%
  30.     shtcnt = shtcnt + 1
  31.     If Sheets.Count < shtcnt Then Sheets.Add , Sheets(Sheets.Count)
  32.     Sheets(shtcnt).Cells.Clear
  33.     Sheets(shtcnt).Range("A1").Resize(cnt, chs) = rnd_array
  34.     cbn = cbn - irow
  35.     If cbn > 0 Then
  36.        ReDim rnd_array(1 To IIf(cbn > irow, irow, cbn), 1 To UBound(rnd_array, 2))
  37.     Else
  38.        shtcnt = 0
  39.        Erase rnd_array
  40.     End If
  41.     cnt = 0
  42. End Sub
复制代码

可用资源不足.rar

10.91 KB, 下载次数: 7

回复

使用道具 举报

发表于 2014-10-7 23:59 | 显示全部楼层
张雄友 发表于 2014-10-7 22:04
16个表就会出现可用资源不足了。

我这里测试通过了。33个表
如果是列存放的话,可能你的工作表列数不够51选5就会不够了。

评分

参与人数 1 +6 收起 理由
张雄友 + 6 递归过程可以提速就好了。

查看全部评分

回复

使用道具 举报

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

本版积分规则

小黑屋|手机版|Archiver|Excel精英培训 ( 豫ICP备11015029号 )

GMT+8, 2024-5-2 16:18 , Processed in 0.332857 second(s), 14 queries , Gzip On, Yac On.

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

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