我正在运行下面的代码,这正是我想要的。 我遇到的问题是,当我让工作表运行一段时间(如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
答案 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