微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

VBA - 对于大范围的每个循环都很有效

如何解决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 举报,一经查实,本站将立刻删除。