2017-04-07 61 views
-1

我运行下面的代码,这正是我想要的。 我与它的问题虽然是,当我保持工作表运行一段时间,如10分钟,我得到一个弹出错误消息说我已经用完了内存。用尽VBA内存

有什么我可以放在我的代码,我可以用来防止这种情况?

我的代码如下,

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 
+6

我刚刚从您的个人资料中注意到您没有接受任何对您最近六个问题的答案。你为什么不花点时间表示对你收到的帮助表示赞赏? – SJR

+3

这是一个过分敏锐的讽刺踢在这里或是这个特别的问题只是完美的网站称为堆栈溢出? – CLR

+1

我想你有一个堆栈溢出! – Blenikos

回答

-1

你溢几乎可以肯定是由这么多的调度事件引起的。

在你的循环,你正在计划一个OnTime如果有行有即使没有行有行号列S.

行号列S的值,你随后还安排一个更 OnTime

因此,如果您的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