Как завершить сценарий VBA перед заявкой по расписанию в Excel 2010 - PullRequest
0 голосов
/ 12 марта 2019

У меня есть скрипт, который запускается при открытии рабочей книги, где я установил несколько раз, как показано ниже

Private Sub Workbook_Open()

Application.OnTime TimeValue("08:00:00"), "MasterMacro"
Application.OnTime TimeValue("10:30:00"), "MasterMacro"
Application.OnTime TimeValue("13:00:00"), "MasterMacro"

End Sub

В одном случае сценарий MasterMacro не будет завершен до следующего запуска ... так как я могу остановить его до следующего?

Ответы [ 2 ]

3 голосов
/ 12 марта 2019

Вы можете решить это с помощью флага, доступного как для вызывающей, так и для вызываемой стороны, например:

Private IsRunning As Boolean

Private Sub Workbook_Open()
    IsRunning = False

    Application.OnTime TimeValue("08:00:00"), "MasterMacro"
    Application.OnTime TimeValue("10:30:00"), "MasterMacro"
    Application.OnTime TimeValue("13:00:00"), "MasterMacro"

End Sub

Sub MasterMacro()
    If IsRunning Then
        Debug.Print "Is already running. Aborting."
        Exit Sub
    End If
    Debug.Print "Starting Master macro"
    IsRunning = True

    'Lengthy operation
    'goes here

    IsRunning = False
End Sub

Другой подход
Если главный макрос проверяет, запрашивается ли завершениевнутри своего цикла он может прервать цикл и разрешить следующий запуск основного макроса

Private TerminationRequested As Boolean

Private Sub Workbook_Open()
    TerminationRequested = False

    Application.OnTime TimeValue("08:00:00"), "MasterMacro"

    TerminateLongRunningOperation
    Application.OnTime TimeValue("10:30:00"), "MasterMacro"

    TerminateLongRunningOperation
    Application.OnTime TimeValue("13:00:00"), "MasterMacro"

End Sub

Sub TerminateLongRunningOperation()
    TerminationRequested = True
    Application.Wait Now + TimeValue("0:00:10")
End Sub

Sub MasterMacro()
    TerminationRequested = False

    For i = 1 To 10000
        If TerminationRequested Then Exit Sub

        ' One of many iterations
        ' goes here

    Next i
End Sub
0 голосов
/ 12 марта 2019

Вот пример, показывающий, как можно завершить выполнение кода до вызова события OnTime.

Поместите приведенный ниже код в модуль ThisWorkbook:

Private Sub Workbook_Open()

    Application.OnTime Now + TimeValue("00:00:01"), "EndlessLoop"
    Application.OnTime Now + TimeValue("00:00:08"), "TerminateRunning"

    Application.OnTime Now + TimeValue("00:00:11"), "EndlessLoop"
    Application.OnTime Now + TimeValue("00:00:18"), "TerminateRunning"

    Application.OnTime Now + TimeValue("00:00:21"), "EndlessLoop"
    Application.OnTime Now + TimeValue("00:00:28"), "TerminateRunning"

End Sub

Поместите нижекод для стандартного модуля:

Sub EndlessLoop()

    Do
        Cells(1, 1) = Timer
        DoEvents
    Loop

End Sub

Sub TerminateRunning()

    End

End Sub

Обратите внимание, что вы должны последовательно распределять оператор DoEvents по всему коду, чтобы события вступали в силу мгновенно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...