Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
List VBA从列表中提取值,直到总和在某个范围内_List_Excel_Vba - Fatal编程技术网

List VBA从列表中提取值,直到总和在某个范围内

List VBA从列表中提取值,直到总和在某个范围内,list,excel,vba,List,Excel,Vba,我有一个值列表,我需要从列表中提取值,直到总和在1200000到1300000之间。我最初将列表从最小值到最大值进行排序,然后执行EndxlUp,然后开始从列表底部删除值,直到总和小于1300000,但我遇到的问题是,我提取的最后一个数字相当大,因此总和将大大低于1200000。最好的方法是,如果我能编写som VB代码来查看我的列表,拉取值直到总和小于1300000,然后只拉取下一个值,如果它小于等于100000。。。如果下一个值大于100000,只需跳过并查看下一个值 这是我正在处理的数字的

我有一个值列表,我需要从列表中提取值,直到总和在1200000到1300000之间。我最初将列表从最小值到最大值进行排序,然后执行EndxlUp,然后开始从列表底部删除值,直到总和小于1300000,但我遇到的问题是,我提取的最后一个数字相当大,因此总和将大大低于1200000。最好的方法是,如果我能编写som VB代码来查看我的列表,拉取值直到总和小于1300000,然后只拉取下一个值,如果它小于等于100000。。。如果下一个值大于100000,只需跳过并查看下一个值

这是我正在处理的数字的当前列表:

236,800
13,300
7,100
2,500
5,600
5,900
11,700
33,100
172,200
17,400
43,900
1,200
2,100
1,900
500
600
3,700
23,300
53,300
32,900
10,100
3,300
400
500
11,500
7,700
3,700
1,700
700
6,300
26,400
22,700
12,400
5,500
700
500
1,000
500
25,200
700
900
41,400
328,700
900
1,800
329,100
6,100
47,700
500
5,100
11,900
300
12,800
0
200
31,100
900
500
2,500
8,500
5,600

谢谢

您正在处理子集和问题的变体。它几乎肯定是NP完全的,所以你不能期望一个简单的解决方案。如果数字列表很小,则解算器可以将其作为整数规划问题进行求解。在与包含列表的列相邻的列中,使用约束为0-1的变量,形成相应的乘积,将其值限制在1200000和1300000之间,并将第一个决策变量用作虚拟目标函数。如果列表太大,内置解算器无法处理那么多二进制变量,但您始终可以从解算器附加模块的制造商前线系统获得高级版本。如果包含对解算器加载项的引用,则所有这些都可以从VBA实现


或者,您可以使用启发式方法。有一个0和1的向量,确定要选择的元素。根据相应的总和与满足约束的接近程度对该向量进行评分。将0更改为1或将0更改为1会使总和更接近或远离满足约束。从一个随机向量开始。如果任何这样的改变有帮助的话,就做出最好的改变。做出这样的改变,直到没有进一步的改变。这是一个局部最优解。如果它满足约束,则完成。如果没有,请重新开始。如果这种随机开始的迭代爬山不起作用,你可以研究一种进化算法。你可以自己编写代码,或者看看进化优化的解算器版本是否有帮助。我对解算器的这一部分没有太多经验,也不知道它对问题大小或问题形成有什么样的限制。

此列表中有多少数字?列表是动态的。。JohnColeman可以有10到300个数字