Excel VBAを使用したデータインポートの自動化とスケジュール設定方法では、future時刻をNextImportへ保存し、LatestTime付きでRunImportを一回予約してRefreshAll開始を記録する。Application.OnTimeはExcel applicationが動作している条件でprocedureを予約する。OS task schedulerではなく、取消には登録時と同じEarliestTime・Procedureが必要になる。この記事はworkbook full path、NextImport、procedure名、connection一覧、control statusを予約keyにするを判断軸にして、記事固有のコード、合否、停止条件、復元を順序立てて説明します。
Outlook mailの予約ではなく、Excel process内のdata connection更新を時刻指定する。完了は「予約時刻後にcontrol statusが更新され、各connectionのrefresh完了・errorを別に確認できる」です。結果が空なら「connection 0件ならRefreshAllを成功importとせず、対象queryやtableの構成を確認する」として調べ、エラーを0件へ置き換えません。
import時刻と接続数を確認
future時刻をNextImportへ保存し、LatestTime付きでRunImportを一回予約してRefreshAll開始を記録する。Excelデータ更新のOnTime予約では、単にコマンドが終了したことではなく「予約時刻後にcontrol statusが更新され、各connectionのrefresh完了・errorを別に確認できる」を完了条件にします。Outlook mailの予約ではなく、Excel process内のdata connection更新を時刻指定する。
import時刻と接続数を確認に入る前に、対象、実行場所、権限、入力の由来を確認します。connection 0件ならRefreshAllを成功importとせず、対象queryやtableの構成を確認する。判定不能を成功へ丸めません。
NextImportをmodule変数へ保存
NextImportをmodule変数へ保存は変更や出力生成より先に行う観測です。workbook full path、NextImport、procedure名、connection一覧、control statusを予約keyにするを含む形で現状を保存し、後段のコードが同じ対象へ向くか確認します。
Option Explicit
Private Function QualifiedImportProcedure() As String
QualifiedImportProcedure = "'" & Replace(ThisWorkbook.Name, "'", "''") & "'!RunImport"
End Function
Private Function NewImportAttemptId() As String
Dim typeLib As Object, raw As String, details As String
On Error GoTo Failed
Set typeLib = CreateObject("Scriptlet.TypeLib")
raw = Replace$(Replace$(CStr(typeLib.GUID), "{", vbNullString), "}", vbNullString)
If Len(raw) <> 36 Then Err.Raise 5, , "GUID length mismatch"
NewImportAttemptId = "import-" & raw
Exit Function
Failed:
details = CStr(Err.Number) & " " & Err.Description
On Error GoTo 0
Err.Raise vbObjectError + 1830, "NewImportAttemptId", "AttemptIDを生成できません。予約しません: " & details
End Function
Private Sub PersistImportState(ByVal ws As Worksheet, ByVal expectedState As String, ByVal expectedAttemptId As String, ByVal expectedEarliest As Date, ByVal expectedProcedure As String, ByVal expectedLatest As Date, ByVal requireTuple As Boolean)
Dim saveNumber As Long, saveDescription As String
If Len(ThisWorkbook.Path) = 0 Then Err.Raise 5, , "未保存workbookでは耐久状態を作れません"
If ThisWorkbook.ReadOnly Then Err.Raise 5, , "read-only workbookでは耐久状態を作れません"
On Error Resume Next
ThisWorkbook.Save
saveNumber = Err.Number
saveDescription = Err.Description
Err.Clear
On Error GoTo 0
If saveNumber <> 0 Then Err.Raise vbObjectError + 1831, "PersistImportState", "ThisWorkbook.Save失敗: " & CStr(saveNumber) & " " & saveDescription
If Not ThisWorkbook.Saved Then Err.Raise vbObjectError + 1832, "PersistImportState", "Save後もThisWorkbook.Saved=Falseです"
If StrComp(CStr(ws.Range("B3").Value2), expectedState, vbBinaryCompare) <> 0 Then Err.Raise 5, , "保存後state再読不一致"
If StrComp(CStr(ws.Range("B7").Value2), expectedAttemptId, vbBinaryCompare) <> 0 Then Err.Raise 5, , "保存後AttemptID再読不一致"
If requireTuple Then
If Not IsDate(ws.Range("B4").Value) Or Not IsDate(ws.Range("B6").Value) Then Err.Raise 13, , "保存後OnTime日時がありません"
If CDbl(CDate(ws.Range("B4").Value)) <> CDbl(expectedEarliest) Then Err.Raise 5, , "保存後EarliestTime再読不一致"
If StrComp(CStr(ws.Range("B5").Value2), expectedProcedure, vbBinaryCompare) <> 0 Then Err.Raise 5, , "保存後Procedure再読不一致"
If CDbl(CDate(ws.Range("B6").Value)) <> CDbl(expectedLatest) Then Err.Raise 5, , "保存後LatestTime再読不一致"
Else
If Len(CStr(ws.Range("B4").Value2)) > 0 Or Len(CStr(ws.Range("B5").Value2)) > 0 Or Len(CStr(ws.Range("B6").Value2)) > 0 Then Err.Raise 5, , "terminal保存後もOnTime tupleが残っています"
End If
End Sub
Private Sub AssertImportScheduleIsClear(ByVal ws As Worksheet)
Dim state As String
state = Trim$(CStr(ws.Range("B3").Value2))
Select Case state
Case vbNullString, "Ready", "Cancelled", "Refreshed", "ExpiredNoCallback"
Case Else
Err.Raise 5, , "未解決stateをinspect/reconcileしてください。自動再予約しません: " & state
End Select
If Len(CStr(ws.Range("B4").Value2)) > 0 Or Len(CStr(ws.Range("B5").Value2)) > 0 Or Len(CStr(ws.Range("B6").Value2)) > 0 Then Err.Raise 5, , "保存OnTime tupleが残っています"
End Sub
Sub InspectImportPlan()
With ThisWorkbook.Worksheets("Control")
Debug.Print "requested=" & .Range("B2").Value2, "status=" & .Range("B3").Value2
Debug.Print "earliest=" & .Range("B4").Value2, "procedure=" & .Range("B5").Value2, "latest=" & .Range("B6").Value2
Debug.Print "attempt=" & .Range("B7").Value2, "completionApproval=" & .Range("B8").Value2, "resolutionApproval=" & .Range("B9").Value2
End With
Debug.Print "qualifiedProcedure=" & QualifiedImportProcedure(), "connections=" & ThisWorkbook.Connections.Count
Debug.Print "reopenPolicy=inspect-only; no automatic OnTime registration"
End Sub
Application.OnTimeはExcel applicationが動作している条件でprocedureを予約する。OS task schedulerではなく、取消には登録時と同じEarliestTime・Procedureが必要になる。Excelデータ更新のOnTime予約では取得不能、対象なし、値が空という三状態を分け、stderrや終了コードを捨てません。
未来時刻だけOnTime登録
未来時刻だけOnTime登録では「workbook full path、NextImport、procedure名、connection一覧、control statusを予約keyにする」という粒度で対象を特定します。Application.OnTimeはExcel applicationが動作している条件でprocedureを予約する。OS task schedulerではなく、取消には登録時と同じEarliestTime・Procedureが必要になる。表示名や先頭候補だけを採用しません。
Excelデータ更新のOnTime予約の対象が複数なら、候補数と除外理由を残します。Excelデータ更新のOnTime予約では実行ユーザー、OS・製品版、locale、カレントディレクトリも結果の解釈へ影響するため同時に記録します。
RunImportでRefreshAll
RunImportでRefreshAllではfuture時刻をNextImportへ保存し、LatestTime付きでRunImportを一回予約してRefreshAll開始を記録する。Excelデータ更新のOnTime予約のサンプルにあるパス、セル、ユーザー、時刻は検証用なので、直前に確認した承認値へ置き換えます。
Sub ScheduleImport()
Dim ws As Worksheet, earliestAt As Date, latestAt As Date, procedureName As String, attemptId As String
Dim failureText As String, persistText As String
Set ws = ThisWorkbook.Worksheets("Control")
AssertImportScheduleIsClear ws
If Not IsDate(ws.Range("B2").Value) Then Err.Raise 13, , "予定時刻が日付ではありません"
earliestAt = CDate(ws.Range("B2").Value)
latestAt = earliestAt + TimeSerial(0, 2, 0)
procedureName = QualifiedImportProcedure()
If earliestAt <= Now Then Err.Raise 5, , "未来時刻を指定してください"
attemptId = NewImportAttemptId()
ws.Range("B4").Value2 = earliestAt
ws.Range("B5").Value2 = procedureName
ws.Range("B6").Value2 = latestAt
ws.Range("B7").Value2 = attemptId
ws.Range("B8").ClearContents
ws.Range("B9").ClearContents
ws.Range("B3").Value2 = "Scheduling"
PersistImportState ws, "Scheduling", attemptId, earliestAt, procedureName, latestAt, True
On Error GoTo ScheduleUnknown
Application.OnTime EarliestTime:=earliestAt, Procedure:=procedureName, LatestTime:=latestAt, Schedule:=True
ws.Range("B3").Value2 = "Scheduled"
PersistImportState ws, "Scheduled", attemptId, earliestAt, procedureName, latestAt, True
Exit Sub
ScheduleUnknown:
failureText = CStr(Err.Number) & " " & Err.Description
On Error Resume Next
Err.Clear
ws.Range("B3").Value2 = "ScheduleUnknown"
PersistImportState ws, "ScheduleUnknown", attemptId, earliestAt, procedureName, latestAt, True
If Err.Number <> 0 Then persistText = "; unknown-state save also failed: " & CStr(Err.Number) & " " & Err.Description
On Error GoTo 0
Err.Raise vbObjectError + 1833, "ScheduleImport", "OnTime結果は未確定です。tupleを保持し自動再予約しません: " & failureText & persistText
End Sub
Sub RunImport()
Dim ws As Worksheet, earliestAt As Date, latestAt As Date, procedureName As String, attemptId As String
Dim failureText As String, persistText As String
Set ws = ThisWorkbook.Worksheets("Control")
procedureName = QualifiedImportProcedure()
If CStr(ws.Range("B3").Value2) <> "Scheduled" Then Err.Raise 5, , "durable Scheduled状態ではありません"
If Not IsDate(ws.Range("B4").Value) Or Not IsDate(ws.Range("B6").Value) Then Err.Raise 5, , "callback tupleがありません"
earliestAt = CDate(ws.Range("B4").Value)
latestAt = CDate(ws.Range("B6").Value)
attemptId = CStr(ws.Range("B7").Value2)
If Len(attemptId) = 0 Or CStr(ws.Range("B5").Value2) <> procedureName Then Err.Raise 5, , "callback tupleまたはAttemptIDが一致しません"
ws.Range("B3").Value2 = "Running"
PersistImportState ws, "Running", attemptId, earliestAt, procedureName, latestAt, True
On Error GoTo RefreshUnknown
ThisWorkbook.RefreshAll
ws.Range("B3").Value2 = "RefreshStarted"
PersistImportState ws, "RefreshStarted", attemptId, earliestAt, procedureName, latestAt, True
Exit Sub
RefreshUnknown:
failureText = CStr(Err.Number) & " " & Err.Description
On Error Resume Next
Err.Clear
ws.Range("B3").Value2 = "RefreshUnknown"
PersistImportState ws, "RefreshUnknown", attemptId, earliestAt, procedureName, latestAt, True
If Err.Number <> 0 Then persistText = "; unknown-state save also failed: " & CStr(Err.Number) & " " & Err.Description
On Error GoTo 0
Err.Raise vbObjectError + 1834, "RunImport", "RefreshAll結果は未確定です。tupleを保持します: " & failureText & persistText
End Sub
Sub CompleteVerifiedImport()
Dim ws As Worksheet, earliestAt As Date, latestAt As Date, procedureName As String, attemptId As String
Dim failureText As String, persistText As String
Set ws = ThisWorkbook.Worksheets("Control")
Select Case CStr(ws.Range("B3").Value2)
Case "Running", "RefreshStarted", "RefreshUnknown"
Case Else
Err.Raise 5, , "Running・RefreshStarted・RefreshUnknownだけを完了できます"
End Select
If Not IsDate(ws.Range("B4").Value) Or Not IsDate(ws.Range("B6").Value) Then Err.Raise 5, , "保持tupleがありません"
earliestAt = CDate(ws.Range("B4").Value)
procedureName = CStr(ws.Range("B5").Value2)
latestAt = CDate(ws.Range("B6").Value)
attemptId = CStr(ws.Range("B7").Value2)
If CStr(ws.Range("B8").Value2) <> "VerifiedComplete:" & attemptId Then Err.Raise 5, , "各connection完了確認をVerifiedComplete:<AttemptID>で明示してください"
On Error GoTo CompleteSaveUnknown
ws.Range("B3").Value2 = "Refreshed"
ws.Range("B4:B6").ClearContents
PersistImportState ws, "Refreshed", attemptId, earliestAt, procedureName, latestAt, False
Exit Sub
CompleteSaveUnknown:
failureText = CStr(Err.Number) & " " & Err.Description
On Error Resume Next
Err.Clear
ws.Range("B4").Value2 = earliestAt
ws.Range("B5").Value2 = procedureName
ws.Range("B6").Value2 = latestAt
ws.Range("B3").Value2 = "RefreshUnknown"
PersistImportState ws, "RefreshUnknown", attemptId, earliestAt, procedureName, latestAt, True
If Err.Number <> 0 Then persistText = "; unknown-state save also failed: " & CStr(Err.Number) & " " & Err.Description
On Error GoTo 0
Err.Raise vbObjectError + 1835, "CompleteVerifiedImport", "terminal save結果は未確定です: " & failureText & persistText
End Sub
workbookを閉じれば必ず実行されると期待しない。重複OnTimeを登録して同じimportを並列化しない。Excelデータ更新のOnTime予約で変更が発生する場合は、新規出力、no-clobber、WhatIf、下書き表示など利用可能な安全機構を先に使います。
LatestTimeで遅延上限を設定
workbookを閉じれば必ず実行されると期待しない。重複OnTimeを登録して同じimportを並列化しない。LatestTimeで遅延上限を設定に当てはまるときは中止理由、対象識別子、終了コードまたはErr.Number、直前に成功した段階を保存します。
connection 0件ならRefreshAllを成功importとせず、対象queryやtableの構成を確認する。Excelデータ更新のOnTime予約の再試行は原因を直し、同じ入力と対象を再確認してから行います。警告抑止や強制上書きで通しません。
Excel終了中は実行されない
Excel終了中は実行されないでは入力と出力を別々に再取得します。Excelデータ更新のOnTime予約の合格は、予約時刻後にcontrol statusが更新され、各connectionのrefresh完了・errorを別に確認できることです。件数だけでなく識別値と内容も照合します。
Sub CancelScheduledImport()
Dim ws As Worksheet, earliestAt As Date, latestAt As Date, procedureName As String, state As String, attemptId As String
Dim failureText As String, persistText As String
Set ws = ThisWorkbook.Worksheets("Control")
state = CStr(ws.Range("B3").Value2)
Select Case state
Case "Scheduled", "Scheduling", "ScheduleUnknown", "Cancelling", "CancelUnknown"
Case Else
Err.Raise 5, , "取消可能なdurable予約状態ではありません"
End Select
If Not IsDate(ws.Range("B4").Value) Or Not IsDate(ws.Range("B6").Value) Then Err.Raise 5, , "保存OnTime日時がありません"
earliestAt = CDate(ws.Range("B4").Value)
latestAt = CDate(ws.Range("B6").Value)
procedureName = CStr(ws.Range("B5").Value2)
attemptId = CStr(ws.Range("B7").Value2)
If procedureName <> QualifiedImportProcedure() Or Len(attemptId) = 0 Then Err.Raise 5, , "保存ProcedureまたはAttemptIDが一致しません"
ws.Range("B3").Value2 = "Cancelling"
PersistImportState ws, "Cancelling", attemptId, earliestAt, procedureName, latestAt, True
On Error GoTo CancelUnknown
Application.OnTime EarliestTime:=earliestAt, Procedure:=procedureName, Schedule:=False
ws.Range("B3").Value2 = "Cancelled"
ws.Range("B4:B6").ClearContents
PersistImportState ws, "Cancelled", attemptId, earliestAt, procedureName, latestAt, False
Exit Sub
CancelUnknown:
failureText = CStr(Err.Number) & " " & Err.Description
On Error Resume Next
Err.Clear
ws.Range("B4").Value2 = earliestAt
ws.Range("B5").Value2 = procedureName
ws.Range("B6").Value2 = latestAt
ws.Range("B3").Value2 = "CancelUnknown"
PersistImportState ws, "CancelUnknown", attemptId, earliestAt, procedureName, latestAt, True
If Err.Number <> 0 Then persistText = "; unknown-state save also failed: " & CStr(Err.Number) & " " & Err.Description
On Error GoTo 0
Err.Raise vbObjectError + 1836, "CancelScheduledImport", "取消結果は未確定です。同じtupleを保持します: " & failureText & persistText
End Sub
Sub ReconcileImportNoCallbackAfterLatestTime()
Dim ws As Worksheet, earliestAt As Date, latestAt As Date, procedureName As String, state As String, attemptId As String
Set ws = ThisWorkbook.Worksheets("Control")
state = CStr(ws.Range("B3").Value2)
Select Case state
Case "Scheduling", "ScheduleUnknown", "Cancelling", "CancelUnknown"
Case Else
Err.Raise 5, , "no-callback照合対象stateではありません"
End Select
If Not IsDate(ws.Range("B4").Value) Or Not IsDate(ws.Range("B6").Value) Then Err.Raise 5, , "保存OnTime tupleがありません"
earliestAt = CDate(ws.Range("B4").Value)
latestAt = CDate(ws.Range("B6").Value)
procedureName = CStr(ws.Range("B5").Value2)
attemptId = CStr(ws.Range("B7").Value2)
If Now <= latestAt Then Err.Raise 5, , "LatestTime経過前は0件を確定できません"
If CStr(ws.Range("B9").Value2) <> "ConfirmNoCallback:" & attemptId Then Err.Raise 5, , "B9へConfirmNoCallback:<AttemptID>の明示確認が必要です"
ws.Range("B3").Value2 = "ExpiredNoCallback"
ws.Range("B4:B6").ClearContents
PersistImportState ws, "ExpiredNoCallback", attemptId, earliestAt, procedureName, latestAt, False
End Sub
Sub VerifyImportScheduleState()
With ThisWorkbook.Worksheets("Control")
Debug.Print "state=" & .Range("B3").Value2, "attempt=" & .Range("B7").Value2
Debug.Print "earliest=" & .Range("B4").Value2, "procedure=" & .Range("B5").Value2, "latest=" & .Range("B6").Value2
Debug.Print "autoRetry=False", "saved=" & ThisWorkbook.Saved, "path=" & ThisWorkbook.Path
End With
End Sub
connection 0件ならRefreshAllを成功importとせず、対象queryやtableの構成を確認する。Excelデータ更新のOnTime予約の結果が期待と違えば追加変更を重ねず、入力、対象範囲、locale・時刻、権限、製品仕様の順に戻って調べます。
取消時は同じ時刻とprocedureを使う
長時間refreshは完了eventやquery状態を監視し、RefreshAll呼出し時点を完了にしない。Excelデータ更新のOnTime予約を反復するときは、正常、差分なし、対象なし、要承認、失敗を別の状態として記録します。
| 取消時は同じ時刻とprocedureを使うの主キー | workbook full path、NextImport、procedure名、connection一覧、control statusを予約keyにする |
| 採用条件 | 予約時刻後にcontrol statusが更新され、各connectionのrefresh完了・errorを別に確認できる |
| 空結果 | connection 0件ならRefreshAllを成功importとせず、対象queryやtableの構成を確認する |
| 中止条件 | workbookを閉じれば必ず実行されると期待しない。重複OnTimeを登録して同じimportを並列化しない |
import時刻と接続数を確認から証跡化する未来時刻だけOnTime登録
Excelデータ更新のOnTime予約の証跡は「workbook full path、NextImport、procedure名、connection一覧、control statusを予約keyにする」を主キーにします。import時刻と接続数を確認で確認した値と、実行直前・実行直後の値を同じ作業番号に保存し、表示名が似ている別対象や前回の結果を混ぜません。
NextImportをmodule変数へ保存で空結果を判定するRunImportでRefreshAll
Excelデータ更新のOnTime予約の空結果は「connection 0件ならRefreshAllを成功importとせず、対象queryやtableの構成を確認する」として扱います。NextImportをmodule変数へ保存で入力自体が存在するか、権限で見えていないか、条件に一致しないだけかを分け、0件という表示だけで成功・失敗を決めません。
取消時は同じ時刻とprocedureを使うから復旧可否を測るimport時刻と接続数を確認
Excelデータ更新のOnTime予約の復旧判断では「未実行予約は保存したNextImportとprocedureでSchedule:=Falseを呼び、statusをCancelledにする」を採用します。取消時は同じ時刻とprocedureを使うを再確認し、復旧後に「予約時刻後にcontrol statusが更新され、各connectionのrefresh完了・errorを別に確認できる」へ戻ったかを別の読み取り処理で測定します。
Excelデータ更新のOnTime予約の事前確認では、workbook full path、NextImport、procedure名、connection一覧、control statusを予約keyにするを画面表示や標準出力だけで済ませず、実行日時と一緒に作業記録へ写します。Application.OnTimeはExcel applicationが動作している条件でprocedureを予約する。OS task schedulerではなく、取消には登録時と同じEarliestTime・Procedureが必要になるという仕様があるため、似た名前の別対象、前回実行時の値、キャッシュされた表示を今回の対象と取り違えないことが重要です。
Excelデータ更新のOnTime予約のコードを実行した直後は、まず終了状態を保存し、その後に別の読み取り処理で「予約時刻後にcontrol statusが更新され、各connectionのrefresh完了・errorを別に確認できる」を確認します。Excelデータ更新のOnTime予約では同じコードの表示だけを合否判定に使うと部分成功や遅延反映を見逃すため、識別値、件数、内容の三点を照合します。
Excelデータ更新のOnTime予約で結果が得られない場合は、connection 0件ならRefreshAllを成功importとせず、対象queryやtableの構成を確認する。Excelデータ更新のOnTime予約ではこの状態と、権限拒否、入力形式の不一致、接続先や時刻の違いを一緒にしません。Excelデータ更新のOnTime予約の対象候補数、除外された候補、最後に成功した確認処理を残すと、再試行で同じ失敗を重ねずに済みます。
Excelデータ更新のOnTime予約を元へ戻す必要があるときは、未実行予約は保存したNextImportとprocedureでSchedule:=Falseを呼び、statusをCancelledにする。Excelデータ更新のOnTime予約の復元前にも変更後の識別値を再取得し、別担当者の更新が入っていないか確認します。Excelデータ更新のOnTime予約の復元結果も通常処理と同じ完了条件で測り、戻したつもりという報告だけで閉じません。
Excelデータ更新のOnTime予約を引き継ぐ記録には、長時間refreshは完了eventやquery状態を監視し、RefreshAll呼出し時点を完了にしない。特に「workbookを閉じれば必ず実行されると期待しない。重複OnTimeを登録して同じimportを並列化しない」に該当した場合は、実行を止めたこと自体を正しい結果として扱います。Excelデータ更新のOnTime予約の次回担当者が承認範囲と未処理対象を区別できるよう、作業番号と対象識別子を対応付けます。
Excelデータ更新のOnTime予約の作業記録には、開始前の対象候補、採用した識別値、実行したコード、終了後の実測、除外理由を同じ作業番号で保存します。「workbook full path、NextImport、procedure名、connection一覧、control statusを予約keyにする」を省くと別対象との比較になり得るため、日時、実行場所、製品版と一緒に残します。
Excel VBAを使用したデータインポートの自動化とスケジュール設定方法を定期運用へ組み込む場合も初回は対話的に確認します。正常は「予約時刻後にcontrol statusが更新され、各connectionのrefresh完了・errorを別に確認できる」、空結果は「connection 0件ならRefreshAllを成功importとせず、対象queryやtableの構成を確認する」、停止は「workbookを閉じれば必ず実行されると期待しない。重複OnTimeを登録して同じimportを並列化しない」として報告し、次の担当者が同じ条件で追試できるようにします。
クラッシュ・再起動の必須fault-injection fixture
OnTime直後fixture:Application.OnTimeが戻った直後、Scheduledのterminal save前にExcelを強制停止します。同じExcel sessionでworkbookを開き直した場合は、disk上のSchedulingまたはScheduleUnknownとEarliestTime・Procedure・LatestTime・AttemptIDが残り、ScheduleImportの再実行が拒否され、同じtupleでの取消後もcallback実行回数が1以下であることを確認します。取消が0件で失敗した場合はLatestTime経過後、B9へConfirmNoCallback:<AttemptID>を明示してReconcileImportNoCallbackAfterLatestTimeを実行するまで再承認しません。
RefreshAll直後fixture:RefreshAll後かつterminal save前に停止して再起動し、Running・RefreshStarted・RefreshUnknownのいずれかとtupleがdurableに残ること、別importを開始しないこと、各connection完了を確認してB8へVerifiedComplete:<AttemptID>を入れるまでtupleを消さないことを確認します。CompleteVerifiedImportは3状態すべてを回復できます。実workbookがない記事監査ではspecified-not-executedとして記録します。
公式情報・参考資料
Excelデータ更新のOnTime予約のコマンド、API、対応範囲は次の公式一次資料で確認しました。確認日は2026年7月17日です。Excelデータ更新のOnTime予約の実行環境にあるman、–help、VBA Object Browser、Get-Helpも併用してください。

コメント