我知道在 Excel 中可以使用rand()
函数生成随机数,并且每次按下F9,该表上的所有rand()
结果都会刷新。
但是,现在我需要使用 VBA 重复生成随机数,并控制它,以便随机数不会刷新,除非代码命令如此。
例如我有
- 范围 A1~A100,我想要生成随机数;
- B列是计算的地方,Excel“规划求解”函数的一些计算通过VBA执行;
- 我希望在 C 列记录 1,000 次计算,每次都从 B 列开始;
- 最终结果是C列的平均值。
现在我的问题是
- 我不知道如何使用 VBA 刷新 A 列中的单元格,我该怎么做?
- 我注意到,在 VBA 解算器函数期间,随着 B 列中的单元格更新,每次更新时,A 列的随机数都会刷新 - 我该如何抑制这种情况?
答案1
下面的 VBA 将在活动工作表的 1 到 100 单元格中粘贴一个随机数。每次运行宏时,单元格都会更新
Sub GenerateRandom()
Dim i As Long
For i = 1 To 100
Range("A" & i) = rnd()
Next i
End Sub
ALT+F8至View Macros
注意:您可以运行其他计算(包括公式),A 列中的数字不会改变。您必须手动更改它们或重新运行上述宏。希望这能有所帮助
答案2
我在工作表上插入了一个“按钮”表单控件(必须选中选项->自定义功能区->主选项卡下的复选框以启用开发人员选项卡),并且在每次单击时运行此宏:
Public Sub ran()
Dim a As Range
For i = 1 To 100
Dim r As Integer
r = Int(Timer * Rnd()) 'truncate the random number to an integer
Cells(i, 1).Value = r 'set the value in the cell to this random number
Next i
End Sub
Rnd() 会生成一个范围在 [0, 1) 内的数字,因此我只需将其乘以系统计时器(使用百分之一秒)并使用 Int() 将其四舍五入为整数即可。如果您想要小数,则可以省略 Int(),并可以选择设置最小-最大范围,您可以执行以下操作
r = (max - min) * r + min
...后你得到了计时器种子。
答案3
- 我认为 Excel 默认在某些单元格发生变化时自动更新所有单元格。您可以在设置中取消此设置
- 首先,您应该知道,在 Excel 中反复生成随机数会导致非常短的循环,之后数字会重复出现。在 Excel 的更高版本中,这种情况可能已经发生了变化(但我对此表示怀疑),但在 Excel 97 中,我看到了一个长度为 4 的循环!即,在四次生成 100 个随机数之后,它生成的是完全相同的 100 个随机数。您必须巧妙地设置种子。其次,您可以通过录制宏来生成所需的 VBA 代码,在宏中使用数据分析工具库 (VBA) 插件随机数生成来生成随机数:它用数字填充单元格,而不是 rand() 函数。要在 XL2007-VBA 中添加工具库:
AddIns("Analysis ToolPak - VBA").Installed = True
在单元格 A1:A100 中获取 100 个随机数:
Application.Run "ATPVBAEN.XLAM!Random", ActiveSheet.Range("$A$1"), 1, 100 _ , 1, , 0, 1
答案4
按 F9 不会从 VBA 函数中生成新的随机值,但按Ctrl+Alt+F9(Excel 的“全局重新计算”组合键)将会。