Excel から SharePoint を操作する VBA が、ある時は動くのに別のタイミングで唐突に失敗する――「Access database engine でオブジェクトが見つからない」「ユーザーが認証されていないため要求を実行できない」。その共通原因は“失効した認証トークン”であることがほとんどです。本稿では、既存マクロを大きく壊さずに安定化させる実装パターンと、根本解決(Graph/REST への移行)までを一気通貫で解説します。
現象の整理と前提
読者の前提シナリオは次のとおりです。
- Excel から起動する VBA マクロが以下を行う:
- ADODB を使った SharePoint リストの CRUD(ACE OLEDB 経由)。
- 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;" & _
"WSS;IMEX=0;RetrieveIds=Yes;" & _
"DATABASE={サイトURL};" & _
"LIST={リストGUID}"
cn.Open conn
sql = "SELECT [ID],[Title] FROM [リスト名] WHERE [Title]<>'' 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;" & _
"WSS;IMEX=0;RetrieveIds=Yes;" & _
"DATABASE={サイトURL};" & _
"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 = "\\" & host & "@SSL\DavWWWRoot\" & Replace(path, "/", "\")
Else
ToDavPath = "\\" & host & "\DavWWWRoot\" & 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) & ":\"
If Dir$(d, vbDirectory) = "" Then
PickFreeDriveLetter = Chr$(i) & ":"
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 & "\report.xlsx", drv & "\report.xlsx"
FINALLY:
Call UnmapDrive(drv)
If Err.Number <> 0 Then
MsgBox "コピー失敗: " & 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 を実装しましょう。
設計の最短ルート
- Azure AD(Entra ID)で ネイティブ クライアント(Public client)のアプリ登録を行い、必要な委任許可(Sites.ReadWrite.All など)に管理者同意。
- VBA から COM 化した MSAL ラッパを呼ぶ、または デバイスコード フローを小さなヘルパー exe に実装して
Shell経由で呼び出す。 - 初回は AcquireTokenInteractive(あるいはデバイスコード)でサインイン・同意、以降は AcquireTokenSilent でリフレッシュ。トークンは DPAPI や資格情報マネージャーに安全に保存。
- 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 <> 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 " & 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 段階:本稿のプレ認証+リトライで安定化。運用を止めず即効性。
- 第 2 段階:ファイル I/O を OneDrive 同期へ移行(WebDAV 依存を除去)。
- 第 3 段階:読み取り API を REST/Graph に切替。書き込みは段階的に移行。
- 第 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 が長期の最適解。

コメント