ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[求助] 求助大神棘手难题:数列组合运算,找出数列中运算结果小于误差的所有组合。

[复制链接]

TA的精华主题

TA的得分主题

发表于 2020-3-9 14:08 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
本帖最后由 micch 于 2020-3-9 14:41 编辑

水平不够,瞎写一个吧。列出的结果到是不多。因为组合的时候,按每个计算式只组合一次,不会重复出现进行的组合。

比如A+B,x3+x6=22和x1+x4=21.4,误差不到0.9是可以组合的,但是因为21.4和x3+x8=21已经组合过了,所以结果里就没有x3+x6这个计算式了。

  1. Sub test()
  2.     Dim arr, ar, brr(1 To 33333, 1 To 10), d, x%, i%, j%, k%, r&, n&, m%, s
  3.     w = [b2].Value
  4.     arr = Range("A5", [b5].End(4))
  5.     x = UBound(arr)
  6.     Set d = CreateObject("scripting.dictionary")
  7.    
  8.         For i = 1 To 9 Step 2
  9.                             Set d(i) = CreateObject("scripting.dictionary")
  10.         Next
  11.         For i = 1 To x
  12.             For k = i To x '组合1
  13.                             d(1)(arr(i, 1) + "+" + arr(k, 1)) = arr(i, 2) + arr(k, 2)
  14.                 For j = k To x '组合4
  15.                             d(7)(arr(i, 1) + "+" + arr(k, 1) + "+" + arr(j, 1)) = arr(i, 2) + arr(k, 2) + arr(j, 2)
  16.         Next j, k, i
  17.         For Each s In d(1).keys '组合2
  18.             For i = 1 To x
  19.                 If InStr(s, arr(i, 1)) = 0 Then
  20.                             If d(1)(s) - arr(i, 2) >= 0 Then d(3)(s + "-" + arr(i, 1)) = d(1)(s) - arr(i, 2)
  21.                     For k = i To x '组合3
  22.                         If InStr(s, arr(k, 1)) = 0 Then
  23.                             If d(1)(s) - arr(i, 2) - arr(k, 2) >= 0 Then d(5)(s + "-" + arr(i, 1) + "-" + arr(k, 1)) = d(1)(s) - arr(i, 2) - arr(k, 2)
  24.                         End If
  25.                     Next
  26.                 End If
  27.         Next i, s
  28.         For Each s In d(7).keys '组合5
  29.             For i = 1 To x
  30.                 If InStr(s, arr(i, 1)) = 0 Then
  31.                     For k = i To x
  32.                         If InStr(s, arr(k, 1)) = 0 Then
  33.                             If d(7)(s) - arr(i, 2) - arr(k, 2) >= 0 Then d(9)(s + "-" + arr(i, 1) + "-" + arr(k, 1)) = d(7)(s) - arr(i, 2) - arr(k, 2)
  34.                         End If
  35.                     Next
  36.                 End If
  37.         Next i, s
  38.    
  39.         For i = 1 To 9 Step 2
  40.                     ar = Application.Transpose(Array(d(i).keys, d(i).items))
  41.                     r = 0
  42.                     Call px(ar, brr, r, 0, w, i)
  43.         Next
  44.     [c5:l9999].ClearContents
  45.     [c5].Resize(r, 10) = brr
  46. End Sub
  47. Sub px(ar, brr, r, n, w, m)
  48.     For i = 1 To UBound(ar)
  49.     For k = i + 1 To UBound(ar)
  50.                     If ar(i, 2) > ar(k, 2) Then
  51.                         t = ar(i, 1): ar(i, 1) = ar(k, 1): ar(k, 1) = t
  52.                         y = ar(i, 2): ar(i, 2) = ar(k, 2): ar(k, 2) = y
  53.                     End If
  54.     Next k, i
  55.     For i = 1 To UBound(ar) - 1
  56.             If ar(i + 1, 2) - ar(i, 2) <= w Then
  57.                         a = ar(i, 2): r = r + 1: n = n + 1
  58.                         brr(r, m) = "第 " & n & " 组"
  59.                         r = r + 1
  60.                         brr(r, m) = ar(i, 1): brr(r, 1 + m) = ar(i, 2)
  61.                         r = r + 1
  62.                         brr(r, m) = ar(i + 1, 1): brr(r, m + 1) = ar(i + 1, 2)
  63.                         Do
  64.                                 i = i + 1
  65.                                 If ar(i + 1, 2) - a <= w Then
  66.                                             r = r + 1
  67.                                             brr(r, m) = ar(i + 1, 1): brr(r, m + 1) = ar(i + 1, 2)
  68.                                 Else
  69.                                             Exit Do
  70.                                 End If
  71.                         Loop
  72.             End If
  73.     Next
  74. End Sub
复制代码


评分

2

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2020-3-9 21:09 | 显示全部楼层
micch 发表于 2020-3-9 14:08
水平不够,瞎写一个吧。列出的结果到是不多。因为组合的时候,按每个计算式只组合一次,不会重复出现进行的 ...

能在VBA版等到您的回复,非常感谢!
代码非常棒!

TA的精华主题

TA的得分主题

 楼主| 发表于 2020-3-14 16:16 | 显示全部楼层
micch 发表于 2020-3-9 14:08
水平不够,瞎写一个吧。列出的结果到是不多。因为组合的时候,按每个计算式只组合一次,不会重复出现进行的 ...

micch老师,非常感谢您的代码,非常管用
这段时间运行了一些数据,当每组少于15个时电脑还比较容易运行,数据多了就老死机。
所以准备把这个五个组合拆成5组代码,分别运行。拆了很多回,每次总出现错误引用,控变量等问题。请问如何拆分合适?
多次麻烦您,再次感谢!

TA的精华主题

TA的得分主题

 楼主| 发表于 2020-3-17 11:01 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
有没有哪位好心的大神能帮忙拆分一下啊,
小白一个,万分感谢

TA的精华主题

TA的得分主题

发表于 2020-3-17 13:30 | 显示全部楼层
本帖最后由 yjh_27 于 2020-3-17 14:03 编辑
lumou 发表于 2020-3-17 11:01
有没有哪位好心的大神能帮忙拆分一下啊,
小白一个,万分感谢

我32L 附件不需拆分。只是组合5的
改组合3,只要把c  循环删除,相关逻辑判断删除即可。

其他同理。
不会连删除都不会吧

数列组合计算.rar

109.81 KB, 下载次数: 8

评分

1

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2020-3-17 18:26 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
yjh_27 发表于 2020-3-17 13:30
我32L 附件不需拆分。只是组合5的
改组合3,只要把c  循环删除,相关逻辑判断删除即可。

非常感谢,VBA小白一个,同实验室的人都不太会,所以只好上来请教。
另外,运行了一下,发现最多只能运算9个数,多了就不运算了。而我的数据中,有的一组有20多个数据。
这个该怎么修改一下?麻烦了!

TA的精华主题

TA的得分主题

发表于 2020-3-17 23:15 | 显示全部楼层
lumou 发表于 2020-3-17 18:26
非常感谢,VBA小白一个,同实验室的人都不太会,所以只好上来请教。
另外,运行了一下,发现最多只能运 ...

arr = [a5:b13]
改这里

评分

1

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2020-3-18 15:02 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
yjh_27 发表于 2020-3-17 23:15
arr = [a5:b13]
改这里

明白了。
我手上有好几十组数据,后期可能还有更多。但每组数据数量不太相同,我改了一下,发下每组数据如果不同,那么每次都要改这个参数。
该哪个参数,能一次性解决这个问题码?
再次感谢!

TA的精华主题

TA的得分主题

发表于 2020-3-18 15:09 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
lumou 发表于 2020-3-18 15:02
明白了。
我手上有好几十组数据,后期可能还有更多。但每组数据数量不太相同,我改了一下,发下每组数据 ...

套用41L

arr = Range("A5", [b5].End(4))

评分

1

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2020-3-18 18:35 | 显示全部楼层
yjh_27 发表于 2020-3-18 15:09
套用41L

arr = Range("A5", .End(4))

可以聊,再次感谢您耐心的答复!
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2024-11-17 07:31 , Processed in 0.040318 second(s), 8 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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