VBAからSharePointに安定接続する最善手:ADODB/WebDAVの認証切れを防ぐWinHTTPプレ認証とOffice URI、長期解決はGraph+MSAL移行

Excel から SharePoint を操作する VBA が、ある時は動くのに別のタイミングで唐突に失敗する――「Access database engine でオブジェクトが見つからない」「ユーザーが認証されていないため要求を実行できない」。その共通原因は“失効した認証トークン”であることがほとんどです。本稿では、既存マクロを大きく壊さずに安定化させる実装パターンと、根本解決(Graph/REST への移行)までを一気通貫で解説します。

目次

現象の整理と前提

読者の前提シナリオは次のとおりです。

  • Excel から起動する VBA マクロが以下を行う:
    1. ADODB を使った SharePoint リストの CRUD(ACE OLEDB 経由)。
    2. FileSystemObject / WebDAV を使い、ドキュメント ライブラリを一時的にネットワーク ドライブへマップしてファイル I/O。
  • VBA は利用者の Windows 資格情報(職場/学校アカウント)をそのまま利用。
  • しばしば下記エラーで失敗し、片方が失敗するともう一方も必ず失敗:
    • リスト操作:「Microsoft Access database engine でオブジェクトが見つからない」
    • ドライブ マッピング:「ユーザーが認証されていないため要求を実行できない」
  • 手動で SharePoint の 「アプリで開く」(Excel デスクトップ) を実行してファイルを 1 度開くと、両方とも復活。

この挙動は、SharePoint Online の OAuth アクセス トークン(およそ 1 時間前後)が失効し、レガシー COM コンポーネント(ACE/ADODB・Windows WebDAV クライアント)側に自動更新機構がないために起こります。手動で「アプリで開く」を実行すると Office のモダン認証フローが発火し、バックグラウンドでトークンが更新される――それゆえ、突然動くのです。

なぜ発生するのか(技術的背景)

SharePoint Online はモダン認証(OAuth 2.0 / OpenID Connect)で保護され、Windows や Office は WAM(Web Account Manager)等を介してトークンを維持します。一方、

  • ACE OLEDB(ADODB) による「SharePoint リスト」の疑似テーブルアクセス(Provider=Microsoft.ACE.OLEDB.16.0;WSS;...)
  • WebDAV(Windows WebClient サービス) によるライブラリのドライブ マッピング

は、いずれもモダン認証トークンのライフサイクルを自律更新できず、有効なセッションが OS / Office で直近に確立されていることに依存します。このため、トークン失効タイミングとマクロ実行タイミングが重なると「オブジェクトが見つからない(実体にはアクセス不可)」「認証されていない」などの見かけ上のエラーが発生します。

また、条件付きアクセス(CA)で Sign-in frequency を短く設定している、WebClient サービスが停止している、プロキシや証明書でハンドシェイクが阻害される――といった要因も不安定化を助長します。

最短で効く対処アプローチ(要約)

解決アプローチ内容実装ポイント(キモ)
1. Office デスクトップ認証フローを自動発火Excel ファイルを ms-excel:ofe|u| スキームでサイレントに開くことで、Office のモダン認証を発火してトークン更新だけ済ませる。Shell "cmd /c start """" ""ms-excel:ofe|u|{SharePointファイルURL}""", vbHide
数秒待って自動クローズ。UI 表示を最小化。
2. マクロ開始前に WinHTTP でプレ認証VBA から WinHTTP でサイト ルートへ GET/HEAD を 1 回打つだけで、Windows 背景でトークンが更新される。Set req = CreateObject("WinHttp.WinHttpRequest.5.1")
req.Open "GET", {サイトURL}, False: req.Send
3. レガシー API を捨て Graph/REST へ移行ACE/ADODB・WebDAV をやめてMicrosoft Graph / SharePoint RESTへ。MSAL で AcquireTokenSilent によりトークン自動更新を実装し、根本的に失敗を排除。VBA から MSAL ライブラリ(COM ラッパ等)を呼び出し、PKCE or デバイスコードで初回サインイン→以降はサイレント取得。
4. OneDrive 同期の活用ドキュメント ライブラリを OneDrive クライアントでローカル同期すれば、VBA の I/O はただのローカルファイル操作に。WebDAV 依存を排除。ユーザー PC に対象ライブラリの同期設定を配布。パスは %UserProfile%\OneDrive - {組織名}\… を参照。
5. 環境診断WebClient サービスが稼働(自動/トリガー起動)しているか。 条件付きアクセスのサインイン頻度が短すぎないか。 プロキシ/SSL 検査で WebDAV/Graph が阻害されていないか。services.msc で WebClient を確認。CA のサインイン頻度/永続セッションの方針を見直し。

最小改修で効果が大きいのは「(2) WinHTTP プレ認証」、次点が「(1) Office URI」。将来的に投資できるなら(3) Graph/REST+MSALへ段階移行するのが最善です。ファイル操作だけなら(4) OneDrive 同期がもっとも堅い実装です。

実装例:Office 認証フローを「見えない形で」起動する

既存マクロの先頭で 2〜3 秒だけトークン更新をかけ、直後に本来の処理を走らせます。UI を最小化し、ユーザー体験を損なわない工夫を入れます。

'=== 1) Office URI スキームで Excel をサイレント起動してトークン更新 ===
Option Explicit

Public Sub RefreshOfficeTokenSilently()
Dim targetFileUrl As String
' SharePoint 上にある軽量な xlsx を 1 つ用意しておく(例:TokenRefresh.xlsx)
targetFileUrl = "{SharePointファイルURL}"  ' 例: {サイト}/Shared%20Documents/TokenRefresh.xlsx
Dim uri As String
uri = "ms-excel:ofe|u|" & targetFileUrl

' 現在のウィンドウを最小化(同一インスタンスで開かれる場合のチラつき対策)
Dim prevState As XlWindowState
prevState = Application.WindowState
Application.ScreenUpdating = False
Application.DisplayAlerts = False
Application.WindowState = xlMinimized

' Excel の URI 起動。コンソールは非表示。
Shell "cmd /c start """" """ & uri & """", vbHide

' 数秒だけ待ち、開いたブックを自動で閉じる(同一インスタンスで開かれた場合)
Dim beforeCount As Long
beforeCount = Application.Workbooks.Count

Dim t As Date
t = Now + TimeSerial(0, 0, 3) ' 3 秒待機(環境に応じて調整)
Application.Wait t

If Application.Workbooks.Count > beforeCount Then
    ' 直近で開かれたブックを閉じる
    On Error Resume Next
    Application.Workbooks(Application.Workbooks.Count).Close SaveChanges:=False
    On Error GoTo 0
End If

' UI 復元
Application.WindowState = prevState
Application.DisplayAlerts = True
Application.ScreenUpdating = True

End Sub 
  • 開くファイルは小容量かつ読み取り専用のダミーを推奨。
  • Word/PowerPoint を使用する場合は ms-word:ofe|u|、ms-powerpoint:ofe|u| を用いるだけです。
  • 組織ポリシーによっては最小化しても一瞬前面に出る場合があるため、ユーザー説明文を 1 行だけ表示する選択肢も現実的です。

実装例:WinHTTP での「プレ認証」

トークン更新は「保護リソースへ 1 回アクセスする」だけで十分です。Office を開かず、WinHTTP を 1 発打つ方式は無駄が少なく、もっともクリーンです。

'=== 2) WinHTTP によるプレ認証(推奨) ===
Option Explicit

Public Function PreAuthSharePoint(ByVal siteUrl As String, _
Optional ByVal timeoutSec As Long = 10) As Boolean
On Error GoTo EH
Dim req As Object ' WinHttp.WinHttpRequest
Set req = CreateObject("WinHttp.WinHttpRequest.5.1")

' ルートか、軽量な API エンドポイントへの GET/HEAD を推奨
req.Open "GET", siteUrl, False
req.SetRequestHeader "Accept", "*/*"
req.SetTimeouts 5000, 5000, timeoutSec * 1000, timeoutSec * 1000

' プロキシ環境の場合は必要に応じて設定(自動プロキシに任せるなら不要)
' req.SetProxy 0  ' 0=既定, 1=プロキシなし, 2=手動指定

req.Send

' 200〜399 なら到達確認として成功扱い。401 が返る場合も内部ではトークン交渉が進むため、
' いったん成功扱いとして後続の本処理で再評価するのが実務的。
PreAuthSharePoint = (req.Status >= 200 And req.Status < 500)
Exit Function

EH:
PreAuthSharePoint = False
End Function 

この関数を全ての ADODB/WebDAV 操作の直前に差し込み、さらに「失敗したらもう 1 回だけプレ認証→再試行」のリトライを入れると安定します。

堅牢化パターン:トークン前提のリトライと例外検知

'=== 失敗時に 1 回だけプレ認証してリトライする共通ラッパ ===
Option Explicit

Public Sub RunWithTokenAwareRetry()
Dim spSite As String
spSite = "{SharePointサイトURL}"  ' 例: {サイト}/

```
' 事前プレ認証(高速化のため)
Call PreAuthSharePoint(spSite, 8)

On Error GoTo RETRY_ONCE
' <ここで本来の処理>
Call DoAdoAndWebDavWork
Exit Sub
```

RETRY_ONCE:
If IsTokenError(Err) Then
Err.Clear
If PreAuthSharePoint(spSite, 8) Then
' プレ認証後に 1 回だけ再試行
On Error GoTo FAIL
Call DoAdoAndWebDavWork
Exit Sub
End If
End If
FAIL:
' ログを出す/ユーザー通知など
MsgBox "処理に失敗しました: " & Err.Description, vbExclamation
End Sub

Private Function IsTokenError(ByVal e As ErrObject) As Boolean
Dim m As String: m = LCase$(e.Description)
IsTokenError = (InStr(m, "認証") > 0) Or _
(InStr(m, "アクセス") > 0) Or _
(InStr(m, "オブジェクトが見つからない") > 0) Or _
(e.Number = -2147467259) ' 0x80004005 (E_FAIL)
End Function </code></pre>

</section>

<section>
  <h2>ADODB(ACE OLEDB)で SharePoint リストを扱うときの要点</h2>
  <p>ACE で SharePoint リストをテーブルのように扱う場合、接続文字列・列型・制約にいくつか注意があります。</p>
  <ul>
    <li>接続文字列の例:
      <pre><code>Provider=Microsoft.ACE.OLEDB.16.0;
WSS;IMEX=0;RetrieveIds=Yes;
DATABASE={サイトURL};
LIST={リストGUID}

※ {サイトURL}・{リストGUID} は実値を設定。GUID は波括弧付きを推奨。Person/Group や Lookup 列は内部的に ID 値を扱います。RetrieveIds=Yes を付け、必要に応じて関連列を設計側でフラット化(計算列/補助列)しておくと安定します。 INSERT/UPDATE/DELETE は制約の都合でエラーになりやすい列があります。基本は Title・数値・単一行テキストから着手し、複雑な列は REST に逃がすのが安全です。

SELECT(読み取り)の例

Option Explicit

Public Sub ReadListSample()
Dim cn As Object, rs As Object, sql As String
Set cn = CreateObject("ADODB.Connection")
Set rs = CreateObject("ADODB.Recordset")
Dim conn As String
conn = "Provider=Microsoft.ACE.OLEDB.16.0;" &amp; _
       "WSS;IMEX=0;RetrieveIds=Yes;" &amp; _
       "DATABASE={サイトURL};" &amp; _
       "LIST={リストGUID}"

cn.Open conn

sql = "SELECT [ID],[Title] FROM [リスト名] WHERE [Title]&lt;&gt;'' ORDER BY [ID]"
rs.Open sql, cn, 3, 1 ' 3=adOpenStatic, 1=adLockReadOnly

Do Until rs.EOF
    Debug.Print rs.Fields("ID").Value, rs.Fields("Title").Value
    rs.MoveNext
Loop

rs.Close: cn.Close

End Sub 

UPDATE(更新)の例

Public Sub UpdateListSample()
    Dim cn As Object
    Set cn = CreateObject("ADODB.Connection")
Dim conn As String
conn = "Provider=Microsoft.ACE.OLEDB.16.0;" &amp; _
       "WSS;IMEX=0;RetrieveIds=Yes;" &amp; _
       "DATABASE={サイトURL};" &amp; _
       "LIST={リストGUID}"
cn.Open conn

Dim sql As String
sql = "UPDATE [リスト名] SET [Title]='更新済' WHERE [ID]=1"

On Error GoTo EH
cn.Execute sql
cn.Close
Exit Sub

EH:
' トークン切れ等の例外は前述のリトライラッパで吸収する想定
MsgBox "更新失敗: " & Err.Description
End Sub 

WebDAV ドライブ マッピングの堅牢化

WebDAV は OS の WebClient サービスに依存します。サービス停止やトークン失効でエラー化しやすいため、実行時に「空きドライブの自動割当」「既存マッピングのクリーンアップ」「トークン前提のリトライ」をセットで入れておきます。

URL → WebDAV パス変換

Private Function ToDavPath(ByVal webUrl As String) As String
    Dim s As String, host As String, path As String, p As Long, isSsl As Boolean
s = webUrl
If LCase$(Left$(s, 8)) = "https://" Then
    isSsl = True: s = Mid$(s, 9)
ElseIf LCase$(Left$(s, 7)) = "http://" Then
    isSsl = False: s = Mid$(s, 8)
End If

p = InStr(1, s, "/")
If p = 0 Then
    host = s: path = ""
Else
    host = Left$(s, p - 1)
    path = Mid$(s, p + 1)
End If

If isSsl Then
    ToDavPath = "\\" &amp; host &amp; "@SSL\DavWWWRoot\" &amp; Replace(path, "/", "\")
Else
    ToDavPath = "\\" &amp; host &amp; "\DavWWWRoot\" &amp; Replace(path, "/", "\")
End If

End Function 

空いているドライブ文字の選択

Private Function PickFreeDriveLetter() As String
    Dim i As Integer
    For i = Asc("Z") To Asc("D") Step -1
        Dim d As String: d = Chr$(i) &amp; ":\"
        If Dir$(d, vbDirectory) = "" Then
            PickFreeDriveLetter = Chr$(i) &amp; ":"
            Exit Function
        End If
    Next i
    Err.Raise vbObjectError + 1000, , "空きドライブ文字が見つかりません。"
End Function

マッピングとクリーンアップ

Public Function MapTemporaryWebDav(ByVal webUrl As String, ByRef mappedDrive As String) As Boolean
    On Error GoTo EH
' 事前プレ認証で成功率を上げる
Call PreAuthSharePoint("{SharePointサイトURL}", 8)

Dim net As Object: Set net = CreateObject("WScript.Network")
mappedDrive = PickFreeDriveLetter()

' 同名が残っていれば強制解除
On Error Resume Next
net.RemoveNetworkDrive mappedDrive, True, True
On Error GoTo EH

Dim davPath As String: davPath = ToDavPath(webUrl)
net.MapNetworkDrive mappedDrive, davPath, False

MapTemporaryWebDav = True
Exit Function

EH:
MapTemporaryWebDav = False
End Function

Public Sub UnmapDrive(ByVal mappedDrive As String)
On Error Resume Next
CreateObject("WScript.Network").RemoveNetworkDrive mappedDrive, True, True
End Sub 

ファイルコピーの例

Public Sub CopyReportToLibrary()
    Dim drv As String
    If MapTemporaryWebDav("{ドキュメントライブラリURL}", drv) Then
        On Error GoTo FINALLY
        FileCopy ThisWorkbook.Path &amp; "\report.xlsx", drv &amp; "\report.xlsx"
FINALLY:
        Call UnmapDrive(drv)
        If Err.Number &lt;&gt; 0 Then
            MsgBox "コピー失敗: " &amp; Err.Description, vbExclamation
        End If
    Else
        MsgBox "WebDAV マッピングに失敗しました。", vbExclamation
    End If
End Sub

補足:WebDAV が安定しない環境では、OneDrive 同期へ切り替えてローカルパスへ直接書き込む方が確実です。

長期解決:Graph / SharePoint REST + MSAL へ移行する

レガシー API を前提とする限り「トークン更新できない」という根本問題から逃れられません。可能なら、リスト操作は Microsoft Graph または SharePoint REST に移行し、MSAL を用いて AcquireTokenSilent を実装しましょう。

設計の最短ルート

  1. Azure AD(Entra ID)で ネイティブ クライアント(Public client)のアプリ登録を行い、必要な委任許可(Sites.ReadWrite.All など)に管理者同意。
  2. VBA から COM 化した MSAL ラッパを呼ぶ、または デバイスコード フローを小さなヘルパー exe に実装して Shell 経由で呼び出す。
  3. 初回は AcquireTokenInteractive(あるいはデバイスコード)でサインイン・同意、以降は AcquireTokenSilent でリフレッシュ。トークンは DPAPI や資格情報マネージャーに安全に保存。
  4. HTTP 呼び出しは VBA なら WinHTTP または XMLHTTP を使用。Authorization: Bearer <access_token> をヘッダー付与。

VBA から Graph を叩く呼び出し骨子

Option Explicit

' MSAL ヘルパー(COM)に丸めた仮想インターフェイス例
Private Declare Function MsalAcquireToken Lib "MsalHelper.dll" ( _
ByVal Scopes As String, _
ByVal Silent As Long, _
ByVal AccessTokenOut As String, _
ByVal BufferLen As Long) As Long

Private Function GetAccessToken() As String
Dim scopes As String
scopes = "[https://graph.microsoft.com/.default](https://graph.microsoft.com/.default)" ' または "Sites.ReadWrite.All" 等のスコープ列
Dim buf As String * 4096
Dim rc As Long
rc = MsalAcquireToken(scopes, 1, buf, Len(buf))
If rc &lt;&gt; 0 Then
    ' サイレント失敗なら対話にフォールバック
    rc = MsalAcquireToken(scopes, 0, buf, Len(buf))
End If

GetAccessToken = Left$(buf, InStr(1, buf, vbNullChar) - 1)

End Function

Public Sub GraphSampleListRead()
Dim token As String: token = GetAccessToken()
Dim url As String
url = "https://graph.microsoft.com/v1.0/sites/{siteId}/lists/{listId}/items?expand=fields($select=Title)"

Dim req As Object: Set req = CreateObject("WinHttp.WinHttpRequest.5.1")
req.Open "GET", url, False
req.SetRequestHeader "Authorization", "Bearer " &amp; token
req.SetRequestHeader "Accept", "application/json"
req.Send

Debug.Print req.Status, req.ResponseText

End Sub 

上記は概念図です。実装では、MSAL ラッパ導入・トークンキャッシュ暗号化・スコープ最小化・エラーハンドリングを丁寧に行いましょう。一度移行してしまえば、トークン更新は自動化でき、夜間バッチや長時間処理でも安定します。

OneDrive 同期で WebDAV を卒業する

ファイル I/O が主ですか? ならば OneDrive 同期の一手で劇的に安定化します。ドキュメント ライブラリをユーザー端末へ同期してしまえば、VBA はローカルパスへ読み書きするだけで済みます。

  • 同期ルートは概ね %UserProfile%\OneDrive - {組織名}\{サイト名} - {ライブラリ名}。
  • VBA のコード変更は、WebDAV パス(Z:\ 等)を上記ローカルパスに差し替えるのみ。
  • 共同編集・バージョン管理・ロックなどは OneDrive クライアントがハンドリング。

唯一の注意点は「同期対象の配布(初期設定)」です。Intune 等で構成プロファイルを配布すると管理が容易になります。

診断チェックリスト(根本原因の切り分け)

症状考えられる原因対処
WebDAV で「認証されていない」トークン失効/WebClient 停止/プロキシで 401/407プレ認証(2)→再試行、WebClient 自動(トリガー)起動、プロキシ例外に sharepoint.com を追加
ADODB で「オブジェクトが見つからない」実体は存在するが ACL 取得不可(認証)/リスト GUID 誤りプレ認証→再試行、GUID 再確認、列名の特殊文字(全角/スペース/記号)回避
しばらく放置すると再発アクセストークン寿命(既定約 1h)/CA のサインイン頻度が短い処理直前にプレ認証、長時間処理はバッチの各節目で再プレ認証、CA 設定の見直し
社外からのみ失敗VPN/プロキシ/SSL インスペクションの影響インスペクション除外、証明書信頼、DavWWWRoot への例外設定

より良い設計のための実践知

  • 「ブラウザーで表示」だけでは更新されない:トークン更新は Office アプリのアクセスや API 呼び出しで発火しやすい。URI スキームまたは WinHTTP を使う理由はここにあります。
  • エラーメッセージはミスリードする:「オブジェクトが見つからない」は実体未検出というより、認可に弾かれた結果であることが多い。まずはトークンを疑う。
  • 列設計の見直し:ADODB 経由の CRUD は複雑列(複数選択 Lookup、Managed Metadata など)で詰まりがち。読み取りだけ ACE、書き込みは REST と役割分担すると安定します。
  • 長時間ジョブでは節目に再プレ認証:1 時間を超える処理や待機を挟むマクロでは、ループや章ごとに PreAuthSharePoint を呼ぶ。
  • ログを残す:最初の失敗を捕捉して Status/Body/Err.Number をファイル出力。再現性の低い不具合でも原因同定が速くなります。

安全性・ガバナンス上の注意

  • 資格情報のハードコーディング禁止:ユーザーの職場/学校アカウントに委譲する設計を守る。どうしてもアプリ権限が必要ならアプリ登録+証明書による秘匿管理を。
  • トークン保管の暗号化(移行時):MSAL のトークンキャッシュは既定で OS 保護下に置けます。自前で保存するなら DPAPI(ユーザー スコープ)を使用。
  • 最小権限の原則:Graph/REST への移行時は最小スコープ(例えば特定サイトに限定)や RSC(Resource Specific Consent)も検討。

統合サンプル:既存マクロを壊さず「前処理+再試行」を足す

Option Explicit

Public Sub Main()
Dim site As String, libUrl As String
site = "{SharePointサイトURL}"                 ' 例: {サイト}/
libUrl = "{ドキュメントライブラリURL}"           ' 例: {サイト}/Shared%20Documents/
' 1) 先手必勝のプレ認証
Call PreAuthSharePoint(site, 8)

' 2) ADODB の読み書き
On Error GoTo RETRY1
Call ReadListSample
Call UpdateListSample
GoTo NEXTSTEP

RETRY1:
If IsTokenError(Err) Then
Err.Clear
If PreAuthSharePoint(site, 8) Then
Resume
End If
End If
Err.Raise Err.Number, Err.Source, Err.Description

NEXTSTEP:
' 3) WebDAV マッピングでファイル I/O
Dim drv As String
On Error GoTo RETRY2
If MapTemporaryWebDav(libUrl, drv) Then
FileCopy ThisWorkbook.Path & "\out.xlsx", drv & "\out.xlsx"
UnmapDrive drv
End If
Exit Sub

RETRY2:
If IsTokenError(Err) Then
On Error GoTo 0
If PreAuthSharePoint(site, 8) And MapTemporaryWebDav(libUrl, drv) Then
Err.Clear
FileCopy ThisWorkbook.Path & "\out.xlsx", drv & "\out.xlsx"
UnmapDrive drv
Exit Sub
End If
End If
MsgBox "ファイル処理に失敗: " & Err.Description
End Sub 

このように、前処理の一打と1 回だけのリトライを入れるだけで、体感的な失敗率は激減します。

移行計画の現実解(段階的ロードマップ)

  1. 第 1 段階:本稿のプレ認証+リトライで安定化。運用を止めず即効性。
  2. 第 2 段階:ファイル I/O を OneDrive 同期へ移行(WebDAV 依存を除去)。
  3. 第 3 段階:読み取り API を REST/Graph に切替。書き込みは段階的に移行。
  4. 第 4 段階:全 CRUD を Graph/REST 化し、MSAL でサイレント更新。ACE/ADODB を撤去。

段階移行であれば、利用者影響を最小化しながら根本的な安定性と機能拡張性(監査、バッチ、拡張列への対応)を同時に手に入れられます。

よくある質問(FAQ)

「ブラウザーで SharePoint を開いているのに、なぜ効かない?」 ブラウザーのセッションと、Office/OS が使うトークン ストアは別物です。「アプリで開く」や WinHTTP 等の API 呼び出しが必要です。

<dt>「プレ認証は 1 回で十分?」</dt>
<dd>処理時間や CA 設定によります。<strong>長い処理では章ごとに再プレ認証</strong>を。失敗時のリトライも必須です。</dd>

<dt>「WebDAV は今後も使ってよい?」</dt>
<dd>短期運用は可。ただし、<strong>長期的には OneDrive 同期 or REST に移行</strong>してください。WebDAV は歴史的理由で脆弱になりがちです。</dd>

<dt>「ADODB は完全撤去すべき?」</dt>
<dd>読み取り専用で済む用途では当面併用も現実的。ただし、複雑な列やバッチ更新は REST/Graph が適任です。</dd>

まとめ

SharePoint に対する VBA の不定期な失敗は、ほぼ例外なくモダン認証トークンの失効・未更新が引き金です。最小改修で効くのは WinHTTP プレ認証、ついで Office URI スキーム。それでも根本問題は残るため、Graph/REST+MSAL への段階移行と、ファイル I/O の OneDrive 同期化で“落ちない仕組み”へ寄せていくのが最適解です。運用・開発双方の観点で、トークンのライフサイクルを設計に取り込むこと――これが 2025 年以降の SharePoint 自動化を安定させる最重要ポイントです。

付録:運用時のミニチューニング集

  • WebClient の起動種別:サービスのスタートアップを「手動(トリガー)」以上に。停止中だと WebDAV は即失敗します。
  • ネットワーク健全性:TLS 中間証明書の信頼、プロキシの例外(*.sharepoint.com)を確認。SSL インスペクションは極力除外。
  • Excel の自動保存無効化:トークン更新用ダミーファイルは読み取り専用、かつ自動保存対象から外す。
  • ログ粒度:Err.Number・Err.Description・WinHTTP Status を紐付けて記録。再現性の低い障害分析に効く。
  • エンドユーザー向けメッセージ:再試行時に「サインインを更新しています…」など短いトースト表示で不安を与えない。

要点の再掲(短縮版)

  • ACE/ADODB と WebDAV はトークン更新が苦手。突然の 401/404 もどきは大半がこれ。
  • WinHTTP でプレ認証 → 本処理 → 失敗時ワンリトライで劇的に安定。
  • ファイルは OneDrive 同期、API は Graph/REST+MSAL が長期の最適解。

この記事を書いた人

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

コメント

コメントする

目次