Excel VBAを使用したデータインポートの自動化とスケジュール設定方法

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も併用してください。

この記事を書いた人

実務の現場で詰まりがちなポイントを地図にするITブログ「IT trip」を運営。Windows/Office(Teams・Excel)からSQL、サーバ運用、ガジェットまで、再現性のある手順と“なぜそうなるか”を丁寧に解説します。読んだらすぐ試せること、そして迷った人の次の一歩が見えることを大切にしています。

コメント

コメントする

目次