ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[求助] 有点难度的不确定数据组合

[复制链接]

TA的精华主题

TA的得分主题

发表于 2023-7-20 16:23 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
c.png

不定数据组合230720.rar

20.36 KB, 下载次数: 22

评分

4

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2023-7-20 16:28 | 显示全部楼层

TA的精华主题

TA的得分主题

 楼主| 发表于 2023-7-20 16:58 | 显示全部楼层
tomxie 发表于 2023-7-20 16:51
SQL稍加精简,1句分为17行,上面的 VBA的好像超过150+行。

这个也很好,但是没办法直接在表格中应用,可惜了

TA的精华主题

TA的得分主题

发表于 2023-7-20 18:21 | 显示全部楼层

老大,用WPS的JSA瞎写了一个整体比VBA快一倍,数据没你快,标色比你快,哈哈

image.png

不定数据组合.7z

268.23 KB, 下载次数: 14

评分

3

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2023-7-20 20:36 | 显示全部楼层
wodewan 发表于 2023-7-20 18:21
老大,用WPS的JSA瞎写了一个整体比VBA快一倍,数据没你快,标色比你快,哈哈

也不错,谢谢

TA的精华主题

TA的得分主题

发表于 2023-7-20 21:44 | 显示全部楼层
image.png


直接递归,实在是太费脑子了,因为已知4列,干脆就直接写循环了。每一列的数量不固定,这个没办法只能递归取数,完了就是纯循环。


  1. Sub Main()
  2.     tt = Timer
  3.     ar = Range("a1:d8").Value
  4.     br = Range("f2:h5").Value
  5.     n = Range("i2").Value
  6.     ReDim cr(1 To 4)
  7.     For i = 1 To 4
  8.         cr(i) = GetNumofColumn(ar, i)
  9.     Next
  10.     ar = cr
  11.     ReDim result(1 To 50000, 1 To n)
  12.    
  13.     For i1 = br(1, 2) To br(1, 3)
  14.     For i2 = br(2, 2) To br(2, 3)
  15.     For i3 = br(3, 2) To br(3, 3)
  16.     For i4 = br(4, 2) To br(4, 3)
  17.             If i1 + i2 + i3 + i4 = n Then
  18.                 j = 0
  19.                 If i1 > 0 Then j = j + 1: cr(j) = CombinM_N(ar(1), i1)
  20.                 If i2 > 0 Then j = j + 1: cr(j) = CombinM_N(ar(2), i2)
  21.                 If i3 > 0 Then j = j + 1: cr(j) = CombinM_N(ar(3), i3)
  22.                 If i4 > 0 Then j = j + 1: cr(j) = CombinM_N(ar(4), i4)
  23.                 If j < 4 Then
  24.                     ReDim temp(1, 1)
  25.                     For i = j + 1 To 4
  26.                         cr(i) = temp
  27.                     Next
  28.                 End If
  29.                     For j1 = 1 To UBound(cr(1))
  30.                     For j2 = 1 To UBound(cr(2))
  31.                     For j3 = 1 To UBound(cr(3))
  32.                     For j4 = 1 To UBound(cr(4))
  33.                         k = k + 1
  34.                         For k1 = 1 To UBound(cr(1), 2)
  35.                             If k1 <= n Then result(k, k1) = cr(1)(j1, k1)
  36.                         Next
  37.                         For k2 = 1 To UBound(cr(2), 2)
  38.                             If k1 - 1 + k2 <= n Then result(k, k1 - 1 + k2) = cr(2)(j2, k2)
  39.                         Next
  40.                         For k3 = 1 To UBound(cr(3), 2)
  41.                             If k1 + k2 - 2 + k3 <= n Then result(k, k1 + k2 - 2 + k3) = cr(3)(j3, k3)
  42.                         Next
  43.                         For k4 = 1 To UBound(cr(4), 2)
  44.                             If k1 + k2 + k3 - 3 + k4 <= n Then result(k, k1 + k2 + k3 - 3 + k4) = cr(4)(j4, k4)
  45.                         Next
  46.                     Next
  47.                     Next
  48.                     Next
  49.                     Next
  50.             End If
  51.     Next
  52.     Next
  53.     Next
  54.     Next
  55.     Range("k1").Resize(k, n).Value = result
  56.     MsgBox "组合数量: " & k & Chr(10) & "用时: " & Timer - tt
  57. End Sub

  58. Function GetNumofColumn(ar, ByVal c)
  59.     Dim br()
  60.     ReDim br(1 To 1)
  61.     For i = 2 To UBound(ar)
  62.         If Len(ar(i, c)) = 0 Then
  63.         Exit For
  64.         Else
  65.         j = j + 1
  66.         ReDim Preserve br(1 To j)
  67.         br(j) = ar(1, c) & ar(i, c)
  68.         End If
  69.     Next
  70.     GetNumofColumn = br
  71. End Function

  72. Function CombinM_N(ar0, n0)
  73.     Dim k&, a&(), result(), m0&
  74.     If n0 > 0 Then
  75.     m0 = UBound(ar0)
  76.     k = Application.WorksheetFunction.Combin(m0, n0)
  77.     ReDim result(1 To k, 1 To n0)
  78.     k = 0
  79.     ReDim a(1 To n0)
  80.     Call DG(a, 0, 1, ar0, result, m0, n0, k)
  81.     Else
  82.     ReDim result(0, 0)
  83.     End If
  84.     CombinM_N = result
  85. End Function
  86. Sub DG(a&(), i&, t&, ar0, result, m, n, k)
  87.     Dim j&, l&
  88.     For j = i + 1 To m - n + t
  89.     a(t) = j
  90.     If t = n Then
  91.     k = k + 1
  92.     For l = 1 To n
  93.     result(k, l) = ar0(a(l))
  94.     Next
  95.     Else
  96.     Call DG(a, j, t + 1, ar0, result, m, n, k)
  97.     End If
  98.     Next
  99. End Sub


复制代码


评分

1

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2023-7-20 22:17 | 显示全部楼层
wodewan 发表于 2023-7-20 18:21
老大,用WPS的JSA瞎写了一个整体比VBA快一倍,数据没你快,标色比你快,哈哈

你好,你这个好像没有对同一组合内的数字排序后输出,如果第一列的数字比后面的大,输出就不是依次从小到大的顺序了,要在哪行加什么语句?

TA的精华主题

TA的得分主题

 楼主| 发表于 2023-7-20 22:18 | 显示全部楼层

你好,老师,这个好像没有对组合后的数字排序输出,如果第一列的数字比后面的大,输出就不是依次从小到大的顺序了,要在哪行加什么语句?

TA的精华主题

TA的得分主题

发表于 2023-7-20 22:38 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
image.png


加一个组合内部排序

TA的精华主题

TA的得分主题

 楼主| 发表于 2023-7-21 08:57 | 显示全部楼层
micch 发表于 2023-7-20 22:38
加一个组合内部排序

你好,这个组合内部排序的代码是什么?谢谢
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2024-9-21 06:56 , Processed in 0.043447 second(s), 8 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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