3

ワークブックが最初に開かれる平日の午後 15 時 30 分に実行されるマクロを作成しました。ブックが閉じられると、次にマクロの実行がスケジュールされたときにブック自体を開こうとします。スケジューラを false に変更しようとしましたが、エラーが発生しました。以下のコード。なぜこれが機能しないのか、誰にもアイデアがありますか?

Private Sub Workbook_Open()
    Application.OnTime TimeValue("15:30:00"), "MacroTimeTest"
End Sub

public dtime as date

Sub MacroTimeTest()

    dtime = (Format(Application.Evaluate("workday(today(), 1)"), "DD/MM/YY") & " " & TimeValue("15:30:00"))

    'other code has been deleted doesn't affect dtime variable 
End Sub

Private Sub Workbook_BeforeClose(Cancel As Boolean)

    'I have tried replacing false with 0 etc but it didn't make a difference
    Application.OnTime earliesttime:=dtime, procedure:="MacroTimeTest", schedule:=False

End Sub
4

1 に答える 1

2

アクションをキャンセルできるように、時間を参照してください。アクションがまだ実行されていない場合にのみ、アクションをキャンセルできます。

ThisWorkbookのように入力して、シートが閉じられるまで 15:59 にマクロを実行します。

Option Explicit

Private Sub Workbook_BeforeClose(Cancel As Boolean)

    On Error GoTo CouldNotCancel

    Application.OnTime dTime, "MacroTimeTest", , False
    Debug.Print "Cancelled task to run at " & dTime

    Debug.Print "Workbook close"

    Exit Sub


CouldNotCancel:
    Debug.Print "No task to cancel"

End Sub 

Private Sub Workbook_Open()
    Debug.Print "Workbook open"

    dTime = TimeValue("15:59:00")

    Debug.Print "Next run time " & dTime
    Application.OnTime dTime, "MacroTimeTest"

End Sub

次に、マクロをモジュールに追加します

Option Explicit
Public dTime As Date
Public Sub MacroTimeTest()

    'schedule next run
    dTime = TimeValue("15:59:00")

    'schedule next run
    Debug.Print "Scheduling next run at " & dTime

    Application.OnTime dTime, "MacroTimeTest"

    Debug.Print "Running macro"

End Sub

このように、スケジュールされたタスクの作成に使用されたのと同じ値がdTime、スケジュールされたタスクをキャンセルするために使用されます。

MacroTimeTest のエラーなどにより、それ以上のタスクがスケジュールされていない場合は、ワークブックのクローズ イベントがエラーを処理します。

デバッグ出力を確認するには、VBA エディタ (Ctrl+G) の直接のウィンドウを見てください。

于 2009-11-04T16:03:01.120 に答える