【入門編】Application.FileSearchの代替:FSOを用いたAccessファイル内のリンクテーブル再接続自動化 – Access VBA解析バイブル

スポンサーリンク

Access VBAの深淵へ:リンクテーブル再接続を完全自動化する「伝説のレシピ」

こんにちは。システム開発の現場で、長年Accessと格闘してきたエンジニアです。

Accessを使っていて、一番「悪夢」を感じる瞬間はいつでしょうか? そう、「バックエンド(データ)のファイルパスが変わって、リンクテーブルがすべて切れたとき」ですよね。いちいち手動で「リンクテーブルマネージャー」を叩くなんて、エンジニアの仕事ではありません。

かつて存在した `Application.FileSearch` はもう過去の遺物です。今日は、現代のAccess開発における「標準装備」とも言える `FileSystemObject (FSO)` を使い、リンクテーブルを自動修復する「魂のコード」を伝授します。

ここをクリアすれば、あなたはもう「マクロの記録」に頼る初心者ではありません。Accessの構造を支配する、真のアーキテクトへの第一歩です。

1. なぜ「手動」ではいけないのか?

Accessのリンクテーブルは、バックエンドの絶対パスを記憶しています。サーバーの移行やフォルダ名が変わった瞬間、Accessは迷子になります。

これを自動化する本質は、「DAO (Data Access Objects)」を使ってテーブル定義の `Connect` プロパティを強制的に書き換えることにあります。力仕事ではなく、頭脳で解決しましょう。

2. 準備するもの:FSOへの敬意

`FileSystemObject (FSO)` を使うには、参照設定が必要です。

1. VBAエディタを開く (`Alt + F11`)
2. メニューの [ツール] > [参照設定] を選択
3. 「Microsoft Scripting Runtime」 にチェックを入れてOK

これだけで、ファイルやフォルダを自在に操る「魔法の杖」が手に入ります。

3. リンクテーブル再接続の実装コード

以下のコードは、指定したフォルダ内にあるバックエンドファイルを検索し、すべてのリンクテーブルを再接続する堅牢なツールです。

‘ リンクテーブル再接続のコア・ロジック
Public Sub ReconnectTables(strNewPath As String)
Dim db As DAO.Database
Dim tdf As DAO.TableDef
Dim fso As Object

‘ FSOのインスタンス生成
Set fso = CreateObject(“Scripting.FileSystemObject”)

‘ ファイルパスの正当性チェック
If Not fso.FileExists(strNewPath) Then
MsgBox “バックエンドファイルが見つかりません: ” & strNewPath, vbCritical
Exit Sub
End If

Set db = CurrentDb

‘ 全テーブルをループしてリンクテーブルを特定
For Each tdf In db.TableDefs
‘ Connectプロパティが空でなければリンクテーブルと判断
If Len(tdf.Connect) > 0 Then
‘ 接続先を新しいパスに書き換える
tdf.Connect = “;DATABASE=” & strNewPath
tdf.RefreshLink
Debug.Print “再接続成功: ” & tdf.Name
End If
Next tdf

Set db = Nothing
MsgBox “リンクテーブルの更新が完了しました!”, vbInformation
End Sub

このコードの「本質」を理解する

  • `CurrentDb`: 現在開いているデータベースを指すオブジェクトです。`DAO`ライブラリの心臓部ですね。
  • `TableDefs`: データベース内の全テーブル定義の集合体。ここをループすることで、すべてのリンクを制御下に置けます。
  • `tdf.RefreshLink`: これが最も重要。プロパティを書き換えただけでは不十分です。このメソッドを呼ぶことで、初めてAccessが「新しい接続先」へ握手を求めに行きます。

4. 陥りやすい罠と解決策

初学者が必ず突き当たる壁がいくつかあります。

  • パスの指定ミス: ネットワークドライブの場合、`Z:\data.accdb` のような表記が環境によって変わることがあります。必ず `UNCパス(\\Server\Shared\data.accdb)` で指定するようにしましょう。
  • 読み取り専用属性: バックエンドファイルが読み取り専用になっていると、`RefreshLink` がエラーを吐きます。プロパティを確認する習慣を。
  • DAOの参照忘れ: `DAO` を明示的に使いたい場合は、参照設定で「Microsoft Office 16.0 Access database engine Object Library」が入っていることを確認してください。

5. 最後に:エンジニアとして生きるために

Access VBAは古い言語だと言われることもあります。しかし、「データのありかを制御し、自動化する」という設計思想は、どの言語、どのプラットフォームでも変わらない「普遍的な技術」です。

今回紹介した `TableDefs` を操作する手法をマスターすれば、次は「バックエンドの動的切り替え」や「リンクテーブルの自動生成」など、さらに高度な自動化へ進めます。

「困ったときに手作業で直す」のではなく、「困ったときのために自動化ツールを作っておく」。それが、私たちが目指すべきエンジニアの姿です。

もしコードが動かなかったら、それは「エラー」ではなく「学びのチャンス」です。ぜひ、デバッグウィンドウを眺めながら、Accessの深淵を楽しんでくださいね。


執筆者: 業務自動化アーキテクトより愛を込めて

タイトルとURLをコピーしました