ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

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

[复制链接]

TA的精华主题

TA的得分主题

发表于 2024-6-11 13:19 | 显示全部楼层 |阅读模式
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
本帖最后由 三票 于 2024-6-14 09:33 编辑

(求助VBA)复杂的条件组合

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

9.07 KB, 下载次数: 47

TA的精华主题

TA的得分主题

发表于 2024-6-11 15:33 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
假设符合条件1的有5组,条件2的两组,条件三的一组,结果是所有条件1+条件2+条件三的所有组合,还是最多的组排好其他较少的一次排满就行

TA的精华主题

TA的得分主题

 楼主| 发表于 2024-6-11 15:42 | 显示全部楼层
小凡、、、 发表于 2024-6-11 15:33
假设符合条件1的有5组,条件2的两组,条件三的一组,结果是所有条件1+条件2+条件三的所有组合,还是最多的 ...

结果是所有条件1+条件2+条件3的所有组合

TA的精华主题

TA的得分主题

发表于 2024-6-11 17:25 | 显示全部楼层
模拟结果中有2个50,52,53,54是错的
另一个是51,52,53,54

TA的精华主题

TA的得分主题

 楼主| 发表于 2024-6-11 17:49 来自手机 | 显示全部楼层
蓝桥玄霜 发表于 2024-6-11 17:25
模拟结果中有2个50,52,53,54是错的
另一个是51,52,53,54

50-52-53-54个位和值9,跨度4,质数2个

TA的精华主题

TA的得分主题

发表于 2024-6-11 20:21 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2024-6-12 09:33 | 显示全部楼层
  1. function main(){
  2.         let data=Range('c4:c83').CurrentRegion.Value2.flat().map(x=>Number(x));       
  3.         Range('I11:S1000').ClearContents();
  4.        
  5.         function 筛选(a,b,c,d,e){  //5个条件进行筛选
  6.                 let nums=data.filter(x=>Math.floor(x/10)==a);       
  7.                 let res=[],n=b;
  8.                 let [c1,c2]=c.split('~');
  9.                 let [d1,d2]=d.split('~');
  10.                 let [e1,e2]=e.split('~');

  11.                 function dg(nums,n,path){  //递归生成
  12.                         if(path.length==n){
  13.                                 res.push(path)
  14.                                 //Debug.Print(path.join(','))
  15.                                 return;
  16.                         }
  17.                         for(let x of nums){
  18.                                 let restnums=nums.filter(y=>y>x)
  19.                                 let nextpath=[...path,x]
  20.                                 dg(restnums,n,nextpath)
  21.                         }
  22.                 }
  23.                
  24.                 dg(nums,n,[])   //生成res
  25.                 let finalres=[]
  26.                 for(let x of res){
  27.                         if(test1(x,c1,c2) &&  test2(x,d1,d2) && test3(x,e1,e2)) {
  28.                                 finalres.push(x)       
  29.                         }
  30.                 }
  31.                 return finalres;                       
  32.         }
  33.        
  34.         let [a,b,c,d,e]=[5,4,'9~11','3~5','2~3']       
  35.         let res=筛选(a,b,c,d,e)
  36.        
  37.         let [a1,b1,c1,d1,e1]=[6,3,'10~18','2~5','2~3']
  38.         let res1=筛选(a1,b1,c1,d1,e1)
  39.        
  40.         let [a2,b2,c2,d2,e2]=[3,3,'14~24','2~5','0~0']
  41.         let res2=筛选(a2,b2,c2,d2,e2)
  42.        
  43.         let finalres=[];
  44.         for(let x of res){   //符合条件的三个数组相合
  45.                 for (let x1 of res1){
  46.                         for(let x2 of res2){
  47.                                 finalres.push([...x,...x1,...x2])
  48.                         }
  49.                 }
  50.         }
  51.         Range('I11').Resize(finalres.length,finalres[0].length).Value2=finalres
  52. }

  53. function test1(arr,t1,t2){   //组合结果个位数字和值是否在t1,t2之间
  54.         if(t1=='' && t2=='') return true;
  55.         let n=arr.reduce((s,x)=>s+=x%10,0) ;
  56.         return (n>=Number(t1) && n<=Number(t2));
  57. }
  58. function test2(arr,t1,t2){   //组合结果个位数字跨度是否在t1,t2之间
  59.         if(t1=='' && t2=='') return true;
  60.         let tmpar=arr.map(x=>x%10);
  61.         let n=Math.max(...tmpar)-Math.min(...tmpar);       
  62.         return (n>=Number(t1) && n<=Number(t2));
  63. }
  64. function test3(arr,t1,t2){   //个位质数个数是否在t1,t2之间
  65.         if(t1=='' && t2=='') return true;
  66.         let n=0;
  67.         for(let x of arr){
  68.                 let t=x%10;
  69.                 if(t==1 || t==2 || t==3 || t==5 || t==7) n+=1
  70.         }
  71.         return (n>=Number(t1) && n<=Number(t2));
  72. }
复制代码

TA的精华主题

TA的得分主题

发表于 2024-6-12 09:34 | 显示全部楼层
这个要用到递归,数组的拼接等,用js会方便很多。
请用wps测试。
给定条件有480组结果。
360截图20240612092920410.jpg

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

25.03 KB, 下载次数: 8

评分

2

查看全部评分

TA的精华主题

TA的得分主题

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

蓝版主:1、代码我写到模块里了,但运行时报错。找不到原因,您给看一下。2、就是组合个数条件的数字改变也能组出对应的结果。
1718161031235.png

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

21.64 KB, 下载次数: 6

TA的精华主题

TA的得分主题

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

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

25.21 KB, 下载次数: 20

评分

1

查看全部评分

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

本版积分规则

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

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

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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