如何解决VBA - 对于大范围的每个循环都很有效
我对 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
它会快得多。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。