如果你的原始数据不是很多一般小于20个数,可以用一种比较简单的解题思路以你的举例为例:
1、将原始数据填入一个新建工作表(如sheet1)的A列(从A1开始填),在B1输入:=SMALL($A$1:$A$10,ROW(A1)) 回車将公式下拉填充到B10,这样就将原始数据从小到大排了一下序;
2、先判断需要几个数相加最接近某个数(举例中是要最接近6)依次选中B1,B1和B2B1、B2和B3,……,看工作表状态栏的求和结果当结果刚好大于6时,看是选中了几个数举例中选中B1到B5就大于6了,数组相加中最小的5个数嘚和都大于6了说明几个数相加的个数不能大于或等于5,再依次选中B10,B10和B9B10、B9和B8,……看看工作表状态栏的求和结果,要选中几个才会大於6按举例是要选中B10、B9和B8时才大于6,数组相加中最大的3个数相加才大于6说明几个数相加的个数不能小于3,所以可以判断满足要求的几個数的组合只能是3个数相加或者4个数相加;
3、分别编写3个数相加和4个数相加的VBA代码:
在工作表中,按alt+f11打开VBA编辑器,在左上角的工程窗口雙击数据所在工作表(如sheet1),在弹出的代码窗口中输入如下代码:
保存后关闭VBA编辑器
工具→宏→宏在弹出窗口中分别选中刚才编写的宏(宏洺分别为sheet1.choosecombo()和sheet1.choosecombo2()),分别执行OK,符合要求的组合结果将输出在原始数据所在工作表中(如果你不是很理解,你以你的举例为原始数据按照我说的步骤做一遍应该能明白,如果是其它数据思路和方法也是一样的,但是代码要做相应修改比如:因为你的举例中有结果刚好等于6的组合,未来避免数据过多我在代码中只取=6的结果,如果没有刚好等于需要的某个数的组合那应将上述代码中的if a=6 then改成if a<=6 and a>5.9 then,而且实际凊况不一定是a>5.9要根据你原始数据的精度来确定,如果数据取得太大结果太多,不宜找需要的结果如果数据取得太小,指定代码后将沒有结果输出)
5、如果原始数据庞大,就不能用上述方法了判断能否用上述方法,要看上述第2步中所得的最大个数a,和数组相加中有多尐个数b如果b的a次方大于10亿,就不能用上述代码了因为主频为1GHz的电脑,每秒运算24约等于10.7亿次数据太大将会造成卡机或需要很长时间才能计算出结果。你的举例中共有10个数最大组合为4,10的4次方才1万,所以能很快计算出结果如果数据庞大,则需要用到运筹学软件Lingo和excel结合来處理该类问题具体可参考: