问题描述
我对 VBA 相当陌生,正在尝试弄清楚如何在大范围 (500k) 中为每个循环使用 a。
我想根据具有以下格式的概率计算表格中的多个场景:
Group Type | Group 1 | Group 2 | Group 3.
Probability | 20% | 30% | 70%
Scenario 1 | 0 | 1 | 0
Scenario 2 | 0 | 0 | 1
....
Scenario 500k| 0 | 1 | 1
不幸的是,我的 For each 循环只能在高达 10k 的小范围内工作 - 你们有没有人知道我如何更好地使用它?
Sub ScenarioCalculation()
Dim propability As Double,random As Double,row As Long,col As Long
Application.ScreenUpdating = False
For col = 4 To 23
For row = 25 To 100
propability = Cells(12,col + 1).Value
random = 0# + Rnd * 1#
If random < propability Then
Cells(row + 1,col + 1).Value = 1
Else
Cells(row + 1,col + 1).Value = 0
End If
Next row
Next col
End Sub
解决方法
逐个单元操作相对较慢。您可以使用数组来提高性能。
这应该更快:
Sub ScenarioCalculation()
Const NUM_SCENARIOS As Long = 10000 ' for example
Dim propability As Double,random As Double,row As Long,col As Long,arr
Dim rng As Range,ws As Worksheet
Set ws = ActiveSheet 'for example
Application.ScreenUpdating = False
For col = 4 To 23
propability = ws.Cells(12,col + 1).Value 'only need to read this once...
Set rng = ws.Cells(25,col + 1).Resize(NUM_SCENARIOS)
arr = rng.Value 'create array from range
'populate the array
For row = 1 To UBound(arr,1)
random = 0# + Rnd * 1#
arr(row,1) = IIf(random < propability,1,0)
Next row
rng.Value = arr 'populate the range from the array
Next col
End Sub
,
创建一个长变量并使用范围:
Dim i As Long
Dim rng As Range
Dim probability as variant
Dim col as integer
Set rng = Range("B2")
For col = 0 to 20
probability=rng.offset(0,1).value
For i = 1 To 500000
random = 0# + Rnd * 1#
rng.offset(0,2 + col).value = iif(random<probability,0)
Set rng = rng.Offset(1,0)
Next
Next
通过这种方式,您可以使用 Excel 的内部功能来使用大量单元格并单独处理每一行。 正如@Tim Williams 所展示的:如果你把它放在一个
On Error Goto EndThisSub
Application.ScreenUpdating = False
....
EndThisSub:
Application.ScreenUpdating = True
它会快得多。