怎么用excel把一组数据中几个数之和小于或等于另一个数,把这几个数筛选出来编成一

如:1.7、1.8、2.3、2.6、2.7、2.5、2.1、1.9、0.9、0.6这些数中,筛选出某几个数之和最接近6这个数,然后列成一组。

如果你的原始数据不是很多,一般小于20个数,可以用一种比较简单的解题思路,以你的举例为例:
1、将原始数据填入一个新建工作表(如sheet1)的A列(从A1开始填),在B1输入:=SMALL($A$1:$A$10,ROW(A1)) 回车,将公式下拉填充到B10,这样就将原始数据从小到大排了一下序;

2、先判断需要几个数相加最接近某个数(举例中是要最接近6),依次选中B1,B1和B2,B1、B2和B3,……,看工作表状态栏的求和结果,当结果刚好大于6时,看是选中了几个数,举例中选中B1到B5就大于6了,数组中最小的5个数的和都大于6了,说明几个数相加的个数不能大于或等于5,再依次选中B10,B10和B9,B10、B9和B8,……,看看工作表状态栏的求和结果,要选中几个才会大于6,按举例是要选中B10、B9和B8时才大于6,数组中最大的3个数相加才大于6,说明几个数相加的个数不能小于3,所以可以判断,满足要求的几个数的组合只能是3个数相加或者4个数相加;

3、分别编写3个数相加和4个数相加的VBA代码:
在工作表中,按alt+f11,打开VBA编辑器,在左上角的工程窗口双击数据所在工作表(如sheet1),在弹出的代码窗口中输入如下代码:

Sub choosecombo()
c = 3
For i = 1 To 8
For j = i + 1 To 9
For k = j + 1 To 10
a = Cells(i, 1) + Cells(j, 1) + Cells(k, 1)
If a = 6 Then
c = c + 1
Cells(1, c) = Cells(i, 1)
Cells(2, c) = Cells(j, 1)
Cells(3, c) = Cells(k, 1)
Cells(5, c) = a
End If
Next k
Next j
Next i
End Sub

Sub choosecombo2()
c = 3
For i = 1 To 7
For j = i + 1 To 8
For k = j + 1 To 9
For l = k + 1 To 10
a = Cells(i, 1) + Cells(j, 1) + Cells(k, 1) + Cells(l, 1)
If a = 6 Then
c = c + 1
Cells(12, c) = Cells(i, 1)
Cells(13, c) = Cells(j, 1)
Cells(14, c) = Cells(k, 1)
Cells(15, c) = Cells(l, 1)
Cells(17, c) = a
End If
Next l
Next k
Next j
Next i
End Sub

保存后关闭VBA编辑器

4、在工作表中依次点 工具→宏→宏,在弹出窗口中分别选中刚才编写的宏(宏名分别为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的电脑,每秒运算1024*1024*1024约等于10.7亿次,数据太大将会造成卡机或需要很长时间才能计算出结果。你的举例中共有10个数,最大组合为4,10的4次方才1万,所以能很快计算出结果。如果数据庞大,则需要用到运筹学软件Lingo和excel结合来处理该类问题,具体可参考:
http://club.excelhome.net/thread-392726-1-1.html
温馨提示:答案为网友推荐,仅供参考
相似回答