リンクテーブル再接続の神髄:Application.FileSearchの亡霊を葬り、FSOで堅牢な保守基盤を築く
Access開発の現場において、バックエンド(BE)のパス変更は、運用担当者にとって常に頭痛の種だ。「共有ドライブの構成が変わった」「サーバーが移行した」という一報が入るたび、何十ものリンクテーブルを手動で張り直す作業など、エンジニアのすることではない。
かつて存在した `Application.FileSearch` は、その脆弱な挙動と Office 2007 での廃止によって歴史の闇に消えた。今、我々が手にすべきは、FileSystemObject (FSO) を核とした堅牢かつメモリ効率を極めた再接続エンジンである。
本稿では、レガシーなAccess環境を揺るがないものに変える、プロフェッショナルな再接続ロジックの極意を伝授する。
—
1. なぜ「手作業」と「安易なコード」がシステムを殺すのか
多くの初級エンジニアは、テーブルリンクの再接続を「単に `TableDefs` をループさせてパスを書き換える」だけの作業と捉えている。しかし、真のアーキテクトは以下のリスクを常に考慮する。
- メモリリーク: DAOの `TableDef` オブジェクトや `Database` オブジェクトを明示的に解放しないことによる、Accessプロセスの肥大化。
- パスの不整合: UNCパスとローカルパスの混在、あるいは保護されたネットワーク上のファイルアクセス権限の未考慮。
- 例外処理の欠如: リンク先が存在しない場合の致命的なクラッシュ。
これらを解決するのは、VBAの「作法」そのものである。
—
2. 堅牢な再接続エンジンの実装
以下のコードは、FSOを用いてBEファイルの存在を厳密に検証し、DAOを適切に制御して再接続を行うためのテンプレートだ。
Option Compare Database
Option Explicit
‘ FSOは生成と破棄のサイクルを最小化し、メモリを汚染しない
Public Sub RefreshLinkedTables(ByVal strBackendPath As String)
Dim fso As Object
Dim db As DAO.Database
Dim tdf As DAO.TableDef
‘ 1. FSOのインスタンス化(Late Binding推奨:参照設定の差異によるコンパイルエラーを防ぐ)
Set fso = CreateObject(“Scripting.FileSystemObject”)
‘ 2. バックエンドファイルの存在を物理階層で厳密にチェック
If Not fso.FileExists(strBackendPath) Then
MsgBox “指定されたパスにバックエンドが見つかりません: ” & strBackendPath, vbCritical
GoTo Cleanup
End If
Set db = CurrentDb
‘ 3. テーブル定義の走査と再接続
‘ リンクテーブルのみを抽出し、Connectプロパティを更新する
For Each tdf In db.TableDefs
If Len(tdf.Connect) > 0 Then
‘ リンクテーブルであることを確認(Connectプロパティが空でない)
If Left(tdf.Connect, 10) = “;DATABASE=” Then
tdf.Connect = “;DATABASE=” & strBackendPath
tdf.RefreshLink
End If
End If
Next tdf
MsgBox “全テーブルの再接続が完了しました。”, vbInformation
Cleanup:
‘ 4. 明示的なメモリ解放(伝説的エンジニアの嗜み)
Set tdf = Nothing
Set db = Nothing
Set fso = Nothing
End Sub
—
3. シニアエンジニアが押さえるべき「極限の知見」
1) Late Binding(遅延バインディング)の採用
`Dim fso As Scripting.FileSystemObject` と参照設定(Microsoft Scripting Runtime)に依存する実装は避けるべきだ。配布先のOfficeのバージョンやビット数(32bit/64bit)の違いにより、参照設定が壊れるリスクを考慮せよ。`CreateObject` を用いた動的生成こそが、大規模運用における鉄則である。
2) パス解決の深淵:Windows APIの活用
ネットワークドライブのマッピングが切れている場合、UNCパス(`\\server\path\…`)への変換が必要になることがある。もしパスの解決が複雑化するなら、`WNetGetConnection` API を呼び出し、ドライブレターからUNCパスを抽出する機能を組み込むのがプロの流儀だ。
3) 実行時パフォーマンスの最適化
`TableDefs` のループ中に `RefreshLink` を呼ぶ際、BEファイルが巨大だと再接続のたびに検証が発生し、処理が重くなる。万が一のフリーズを防ぐため、`DoEvents` をループ内に適切に配置し、OS側のレスポンスを維持することを忘れてはならない。
—
結びに代えて
Accessは「古い技術」ではない。「適切に管理されていない技術」である。
リンクテーブルの管理一つ取っても、そこにエンジニアの哲学が宿る。今回示したコードは単なる再接続ツールではない。システムが環境の変化に耐えうるための「生命維持装置」である。
君たちが保守するシステムが、次の10年も安定して稼働し続けることを願っている。コードを書き換える際は、常にその後のメンテナンス性を想像せよ。それが、伝説への第一歩だ。
