我们先来看看这个例子要解决的技术问题吧,如下图一样,在A2到C20这个范围,是随机生成的一序列数字!

该序列数字是随机生成的,范围是从1到3,即大于等于1而小于等于3这个范围的随机数。如下图一样,随机数函数使用RANDBETWEEN。

现在,我们要解决的问题是,如何保证让这些随机生成的这些数,它们的总和满足大于等于140这个值呢?随机数容易生成,但是满足这个总和就比较困难了。
很多人都明白,只要我们双击单元格,那么,函数就会重新计算,所以,就会重新得到一序列的随机数。我们可以不断的双击单元格直到满足大于等于140为止,但是,这种概率是比较小的,也就是说,你双击一百次或一千次,也不一定就能得到这些随机数的总和刚好大于等于140。
所以,我们得重新寻找另外一种方法,让电子表格不断的产生随机数,只要满足这个条件就停止产生随机数,由此我们就能得到想要的一序列随机数了。
分析了问题之后,我们需要解决的问题就是,让随机公式不断的重新刷新计算,直到满足需要为止。按照原理,我们可以按下F9,就能让公式重新计算以产生不同的随机数,但是,这样相当费劲。所以,最好的办法还是VBA合适,因为它能够代劳我们。
像下图一样,在工作表里面增加一个按钮。

最后,给按钮添加如下图的代码即可。

为方便大家的学习,代码粘贴如下:
Dim iFlag As Boolean
iFlag = True
Do While iFlag
If (WorksheetFunction.Sum(Range("A1:C20")) >= 140) Then
iFlag = False
Exit Sub
Else
ActiveSheet.Calculate
End If
Loop
其中,ActiveSheet.Calculate的功能是让函数重新计算,这样就能产生不同的随机数了。
If (WorksheetFunction.Sum(Range("A1:C20")) >= 140) Then,这就是随机数要满足的条件,总必须大于等于140