2017-04-07 3 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

지난 6 개 질문에 대한 답변을 수락하지 않았다는 사실을 귀하의 프로필에서 확인한 것 같습니다. 당신이받은 도움에 대한 감사를 표하는 시간을 가지십시오. – SJR

+3

아이러니 한 느낌이 너무 강렬한가요? 아니면 스택 오버플로라는 사이트에이 특별한 질문입니까? – CLR

+1

거기에 스택 오버플로가 있다고 생각합니다! – Blenikos

답변

-1

내 코드는 다음과 같습니다

. 어떤 행이 행이 열에서

S.을 행 번호가없는 경우에도 당신은 다음 또한 OnTime 하나 이상을 예약하는 열 S.의 값으로 행 번호가있는 경우, 루프에서

, 당신은 OnTime을 예약하는

따라서 5000 개의 행 중 200 개의 값이 일치하면 10 초 후에 201 개의 예약 된 호출을 매크로에 설정하게됩니다. 201 개의 이벤트가 발생하면 (10 초 내에 발생한 상황에 따라) 40000 개 이상의 이벤트가 발생할 수 있습니다. (1,000000000000000000 이상의 이벤트가 대기하고있는 행 번호와 일치하는 열 S의 값 만 하나 행이 된 경우에도 10 분 후 당신은 끝날 것입니다.)

번 이상 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 
관련 문제