ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[已解决] (求助VBA)复杂的条件组合

[复制链接]

TA的精华主题

TA的得分主题

 楼主| 发表于 2024-6-12 15:38 | 显示全部楼层

感谢蓝版主,还有点小问题:如果组合个数改变也能组合出对应个的结果就可以了
1718177473962.png

TA的精华主题

TA的得分主题

 楼主| 发表于 2024-6-12 17:10 来自手机 | 显示全部楼层
蓝桥玄霜 发表于 2024-6-12 15:17
请见附件。

组合个数改成范围比如3~4这样

TA的精华主题

TA的得分主题

 楼主| 发表于 2024-6-12 20:00 来自手机 | 显示全部楼层
蓝桥玄霜 发表于 2024-6-12 15:17
请见附件。

肯请蓝版主有时间做下修改:组合个数改成范围比如3~4这样

TA的精华主题

TA的得分主题

 楼主| 发表于 2024-6-12 22:05 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助

组合个数改成范围比如3~4

(求助VBA)复杂的条件组合(只做一个条件的).rar

22.33 KB, 下载次数: 4

TA的精华主题

TA的得分主题

发表于 2024-6-14 10:06 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
终于把JSA改成VBA了,那段递归用VBA真是不好写。
  1. Dim res(), s, data()
  2. Sub main_VBA()
  3.     data = Application.Transpose(Range("c4:c83"))
  4.     Range("T11:V1000").ClearContents

  5.     a = 5: b = 4: c = "9~11": d = "3~5": e = "2~3"
  6.     fr1 = 筛选(a, b, c, d, e)
  7.     Range("t11").Resize(UBound(fr1)) = Application.Transpose(fr1)
  8.    
  9.     a = 6: b = 3: c = "10~18": d = "2~5": e = "2~3"
  10.     fr2 = 筛选(a, b, c, d, e)
  11.     Range("U11").Resize(UBound(fr2)) = Application.Transpose(fr2)
  12.    
  13.     a = 3: b = 3: c = "14~24": d = "2~5": e = "0~0"
  14.     fr3 = 筛选(a, b, c, d, e)
  15.     Range("V11").Resize(UBound(fr3)) = Application.Transpose(fr3)
  16.    
  17.     ReDim frs(1 To UBound(fr1) * UBound(fr2) * UBound(fr3), 1 To 1)
  18.     For Each x1 In fr1   '//符合条件的三个数组相合
  19.         For Each x2 In fr2
  20.             For Each x3 In fr3
  21.                 i = i + 1
  22.                 frs(i, 1) = x1 & "," & x2 & "," & x3
  23.     Next x3, x2, x1
  24.     Range("W11").Resize(UBound(frs)) = frs
  25. End Sub
  26. Function 筛选(a, b, c, d, e) '5个条件进行筛选
  27.     For i = 1 To UBound(data)
  28.         x = Val(data(i))
  29.         If x \ 10 = a Then ss = ss & "," & data(i)
  30.     Next
  31.     nums = Split(Mid(ss, 2), ",")
  32.     s = 0
  33.     n = b
  34.     ReDim res(1 To UBound(nums) ^ n)
  35.     crr = Split(c, "~"): c1 = crr(0): c2 = crr(1)
  36.     drr = Split(d, "~"): d1 = drr(0): d2 = drr(1)
  37.     eerr = Split(e, "~"): e1 = eerr(0): e2 = eerr(1)
  38.    
  39.     Call dg(nums, n, "") '//生成res
  40.     ReDim finalres(1 To UBound(res))
  41.     For Each xx In res
  42.         x = Split(Mid(xx, 2), ",")
  43.         If test1(x, c1, c2) And test2(x, d1, d2) And test3(x, e1, e2) Then
  44.             k = k + 1
  45.             finalres(k) = Mid(xx, 2)
  46.         End If
  47.     Next
  48.     ReDim f(1 To k)
  49.     For i = 1 To k
  50.         f(i) = finalres(i)
  51.     Next
  52.     筛选 = f
  53. End Function

  54. Sub dg(nums, n, path) '递归生成,path=",1,2,3,4"样式,存入Res
  55.     If Len(path) - Len(Replace(path, ",", "")) = n Then
  56.         s = s + 1
  57.         res(s) = path
  58.         Exit Sub
  59.     End If
  60.     c = UBound(nums)
  61.     For i = 0 To c
  62.         x = nums(i)
  63.         If Len(x) = 0 Then Exit Sub
  64.         ReDim restnums(0 To c - i)
  65.         For j = i + 1 To UBound(nums)
  66.             restnums(j - i - 1) = nums(j)
  67.         Next
  68.         nextpath = path & "," & x
  69.         Call dg(restnums, n, nextpath)
  70.     Next
  71. End Sub

  72. Function test1(arr, t1, t2) As Boolean  '组合结果个位数字和值是否在t1,t2之间
  73.     If t1 = "" And t2 = "" Then test1 = True: Exit Function
  74.     For Each x In arr
  75.         n = n + Val(x) Mod 10
  76.     Next
  77.     If n >= Val(t1) And n <= Val(t2) Then test1 = True
  78. End Function
  79.    
  80. Function test2(arr, t1, t2) As Boolean '组合结果个位数字跨度是否在t1,t2之间
  81.     imax = 0: imin = 9
  82.     If t1 = "" And t2 = "" Then test2 = True: Exit Function
  83.     For Each x In arr
  84.         t = Val(x) Mod 10
  85.         If imax < t Then imax = t
  86.         If imin > t Then imin = t
  87.     Next
  88.     n = imax - imin
  89.     If n >= Val(t1) And n <= Val(t2) Then test2 = True
  90. End Function

  91. Function test3(arr, t1, t2) As Boolean '个位质数个数是否在t1,t2之间
  92.     If t1 = "" And t2 = "" Then test3 = True: Exit Function
  93.     For Each x In arr
  94.         t = Val(x) Mod 10
  95.         If t = 1 Or t = 2 Or t = 3 Or t = 5 Or t = 7 Then n = n + 1
  96.     Next
  97.     If n >= Val(t1) And n <= Val(t2) Then test3 = True
  98. End Function
复制代码

TA的精华主题

TA的得分主题

发表于 2024-6-14 10:07 | 显示全部楼层
VBA也做了一个。。。。。。。

(求助VBA)复杂的条件组.zip

46.39 KB, 下载次数: 6

评分

2

查看全部评分

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

本版积分规则

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

GMT+8, 2024-11-17 13:20 , Processed in 0.045196 second(s), 10 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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