耗尽VBA内存

时间:2017-04-07 08:28:09

标签: excel vba excel-vba

我正在运行下面的代码,这正是我想要的。 我遇到的问题是,当我让工作表运行一段时间(如10分钟)时,我会收到一条弹出错误消息,说我的内存耗尽。

我可以在我的代码中添加哪些东西来阻止这种情况吗?

我的代码如下,

Sub auto_open()
    Call ScheduleCopyPriceOver
End Sub


Sub ScheduleCopyPriceOver()
    TimeToRun = Now + TimeValue("00:00:10")
    Application.OnTime TimeToRun, "CopyPriceOver"
End Sub

Sub CopyPriceOver()
Dim lRow    As Long
Dim ws      As Worksheet

Set ws = ThisWorkbook.Sheets("Orders")


Application.ScreenUpdating = False



    For SRow = 1 To 5000
    If ws.Cells(SRow, 19) = SRow Then
        ws.Cells(SRow, 12).Select
        ActiveCell.FormulaR1C1 = "ready"
        Call ScheduleCopyPriceOver

     ElseIf ws.Cells(SRow, 20) = SRow Then
        ws.Cells(SRow, 12).Select
        ActiveCell.FormulaR1C1 = "cancel"


    End If
    Next

    Call ScheduleCopyPriceOver



End Sub

Sub auto_close()
    On Error Resume Next
    Application.OnTime TimeToRun, "CopyPriceOver", , False
End Sub

1 个答案:

答案 0 :(得分:-1)

您的溢出几乎肯定是由如此多的预定事件造成的。

在循环中,如果任何行的行号作为S列中的值,则计划OnTime。即使没有行具有行号,您也会再调度OnTime在S栏中。

因此,如果您的5000行中有200行具有匹配值,则您将在10秒内设置对该宏的201个预定调用。当这201个事件发生时,它们可能(取决于在10秒内发生的事件)产生另外40000个事件。 (即使只有一个行,其中S列的值与行号匹配,10分钟后最终将排队超过1,000,000,000,000,000,000个事件。)

无需多次重新安排CopyPriceOver代码,因此请从循环内删除Call ScheduleCopyPriceOver

For SRow = 1 To 5000
    If ws.Cells(SRow, 19).Value = SRow Then

        ws.Cells(SRow, 12).FormulaR1C1 = "ready"
        'Get rid of the next line
        'Call ScheduleCopyPriceOver

    ElseIf ws.Cells(SRow, 20).Value = SRow Then

        ws.Cells(SRow, 12).FormulaR1C1 = "cancel"

    End If
Next

Call ScheduleCopyPriceOver