ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

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

[复制链接]

TA的精华主题

TA的得分主题

 楼主| 发表于 2023-7-21 08:59 | 显示全部楼层
tomxie 发表于 2023-7-21 00:21
SQL:1句9行最精简,119毫秒  最快

不错,辛苦了

TA的精华主题

TA的得分主题

发表于 2023-7-21 08:59 | 显示全部楼层
gfdhgw 发表于 2023-7-21 08:57
你好,这个组合内部排序的代码是什么?谢谢
  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.                         For k1 = 1 To n - 1
  47.                         For k2 = k1 + 1 To n
  48.                             If result(k, k1) > result(k, k2) Then
  49.                                 k3 = result(k, k1)
  50.                                 result(k, k1) = result(k, k2)
  51.                                 result(k, k2) = k3
  52.                             End If
  53.                         Next
  54.                         Next
  55.                         
  56.                     Next
  57.                     Next
  58.                     Next
  59.                     Next
  60.             End If
  61.     Next
  62.     Next
  63.     Next
  64.     Next
  65.     Range("k1").Resize(k, n).Value = result
  66.     MsgBox "组合数量: " & k & Chr(10) & "用时: " & Timer - tt
  67. End Sub
复制代码

TA的精华主题

TA的得分主题

发表于 2023-7-21 09:55 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2023-7-21 09:57 | 显示全部楼层
gfdhgw 发表于 2023-7-20 22:17
你好,你这个好像没有对同一组合内的数字排序后输出,如果第一列的数字比后面的大,输出就不是依次从小到大 ...

image.jpg


不定数据组合 - 排序不标色.7z

324.81 KB, 下载次数: 5

TA的精华主题

TA的得分主题

发表于 2023-7-21 10:35 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2023-7-21 10:37 | 显示全部楼层
tomxie 发表于 2023-7-21 09:03
我电脑上执行 好像 需要 0.68秒。

代码硬写的,很多无效的循环,速度我这边也不稳定,没排序的时候0.625,加了排序循环,反而变短了。

本来就是烂代码,也不纠结速度了。这个代码时候,将来讲代码结构和可读性,可维护性优化,用来做反面材料。

TA的精华主题

TA的得分主题

发表于 2023-7-21 14:14 | 显示全部楼层
r.png

不定数据组合230721.rar

27.85 KB, 下载次数: 20

评分

1

查看全部评分

TA的精华主题

TA的得分主题

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

JSA标色这么快?厉害了

TA的精华主题

TA的得分主题

发表于 2023-7-21 15:31 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
jz_l 发表于 2023-7-21 14:18
JSA标色这么快?厉害了

那里是JSA标色快,JSA除了单纯运算感觉比VBA快点,操作表格比VBA慢的不是一星半点(就看写入就知道至少慢一倍),第一次那个快是因为没排序,我的数据是按分组整体分区的,比较集中,统一标色,操作次数少罢了,后来知道要排序,试了试标色要2-3秒,直接删了。

话说老大一出手就知有没有啊,你怎么每次都能把VBA玩的运行速度玩的这么极致呢?直接甩几条街了。。。。。。

TA的精华主题

TA的得分主题

发表于 2023-7-21 16:42 | 显示全部楼层
wodewan 发表于 2023-7-21 15:31
那里是JSA标色快,JSA除了单纯运算感觉比VBA快点,操作表格比VBA慢的不是一星半点(就看写入就知道至少慢 ...

你这叫我怎么吹呢。。。
我亦无他,惟手熟尔
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2024-11-17 04:50 , Processed in 0.039790 second(s), 9 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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