Excel VBA程序开发

笨笨的求知者 Lv.2

关注
哪位大神帮忙写段代码,函数搞不定了。
对D列值进行凑数(对应A列值),返回B列编号。最好可进行多次模拟,手动输入下降值(输入0为原值,输入0.01,那么D2=2.92-0.01)再次取值(算法优先取原值,取不到时下降)。B列编号只允许出现一次。

bbe09a57-5159-43f0-919e-ee278374adbd.png


436阅读
12回复 倒序

quqiyuan Lv.7 2楼

规划求解的意思咯。。。

nie414006 Lv.3 3楼

去看香川大佬的帖子

笨笨的求知者 楼主 4楼

引用: nie414006 发表于 2025-11-10 20:23
去看香川大佬的帖子

一时半会儿也学不会

yes_cn Lv.2 5楼

每次用于凑数的只允许2个值,还是可以多个?
原值凑不出时,减0.01再凑,如果还凑不起,是否还要再减0.01?

笨笨的求知者 楼主 6楼

引用: yes_cn 发表于 2025-11-11 13:15
每次用于凑数的只允许2个值,还是可以多个?
原值凑不出时,减0.01再凑,如果还凑不起,是否还要再减0.01 ...

可以是多个,5个以内,原值凑不出时,减0.01再凑,这个值可以增加到0.1

半百 Lv.6 7楼

引用: 笨笨的求知者 发表于 2025-11-11 14:45
可以是多个,5个以内,原值凑不出时,减0.01再凑,这个值可以增加到0.1

模拟A列700个数字,D列30个,每组最多匹配10000次,实际测试几十次,全部能匹配上,最多匹配次数 r 不到2000次。请楼主测试更多数据
image.jpg

image.png

半百 Lv.6 8楼

  1. Sub 凑数()
  2. Set d = CreateObject("Scripting.dictionary")
  3. Set d1 = CreateObject("Scripting.dictionary")
  4. ar = [a1].CurrentRegion
  5. For i = 2 To UBound(ar)
  6.     d(ar(i, 2)) = ar(i, 1)
  7. Next
  8. br = [d2:e31]
  9. For i = 1 To UBound(br)
  10.     m = br(i, 1)
  11.     a = d.keys
  12.     b = d.items
  13.     r = 0
  14.     Do While r < 10000
  15.         For j = 1 To 5
  16.             n = Int(Rnd * UBound(a))
  17.             If Not d1.exists(n) Then
  18.                 d1(n) = ""
  19.                 s = s + b(n)
  20.                 ss = ss & "," & a(n)
  21.                 If s >= m Then Exit For
  22.             End If
  23.         Next
  24.         If s = m Then
  25.             br(i, 2) = Mid(ss, 2)
  26.             For Each k In Split(Mid(ss, 2), ",")
  27.                 d.Remove k
  28.             Next
  29.             r = 10000
  30.         End If
  31.         ss = ""
  32.         s = 0
  33.         d1.RemoveAll
  34.         r = r + 1
  35.     Loop
  36. Next
  37. [d2:e31] = br
  38. End Sub

laoye5403 Lv.2 9楼

引用: 半百 发表于 2025-11-11 16:12
模拟A列700个数字,D列30个,每组最多匹配10000次,实际测试几十次,全部能匹配上,最多匹配次数 r 不到2 ...

这个随机函数搭配字典,用的非常精妙!脑洞大开!!!!!!!!!

笨笨的求知者 楼主 10楼


非常感谢,经实测,只有极少数没有匹配到
加载更多