Accessの「リンク切れ」に震えるのはもう終わり。起動時に自動修復する「魂のVBA」を授けよう
こんにちは。開発現場で日々、Accessのデータベースという「生き物」と対話しているエンジニアです。
Accessを使っていると、避けて通れないのが「リンクテーブルの接続切れ」。サーバーの引越しやフォルダ名の変更で、突然「テーブルが見つかりません」というエラー画面に遭遇したことはありませんか?
毎回手動で「リンクテーブルマネージャー」を開いて再設定する……。そんな非効率な作業は、今日で卒業しましょう。今回は、Access起動時に接続先を自動で再設定する「守護神」のようなコードを伝授します。
—
なぜ「CurrentDb」なのか?
Access VBAを語る上で避けて通れないのが、`CurrentDb` というオブジェクトです。これは「現在開いているデータベースそのもの」を指す、いわばAccessの心臓部。
- Application:Accessというソフト全体(アプリケーション)を操る司令塔。
- CurrentDb:今開いているデータの実体。テーブル定義(TableDefs)やクエリ定義(QueryDefs)を操作する現場監督。
今回は、この現場監督である`CurrentDb`を使って、テーブルの裏側にある「接続情報」を書き換えていきます。
—
自動修復のロジック:3つのステップ
今回のコードの心臓部は以下の通りです。
1. TableDefs(テーブル定義)にアクセスする:データベース内の全テーブルをリストアップ。
2. 「リンクテーブル」を見極める:ただのテーブルではなく、外部ファイルに接続しているものだけを抽出。
3. 接続文字列を上書きする:古いパスを新しいパスに書き換える。
ここで注意!陥りやすい罠
リンクテーブルには「接続文字列(Connect)」というプロパティがあります。ここには`DATABASE=C:\OldFolder\data.accdb`といった情報が格納されています。これを安易に書き換えると、Accessが「接続先が変わったぞ!」と認識し、自動的に再リンクを試みてくれるのです。
—
実装コード:起動時に走らせる「魔法」
このコードを標準モジュールに貼り付け、AutoExecマクロから呼び出すのが定石です。
Public Sub ReLinkAllTables()
Dim db As DAO.Database
Dim tdf As DAO.TableDef
Dim strNewPath As String
‘ 新しいバックエンドファイルのフルパスを指定
strNewPath = “\\ServerName\SharedFolder\Backend_Data.accdb”
Set db = CurrentDb
‘ 全テーブル定義をループ処理する
For Each tdf In db.TableDefs
‘ Connectプロパティが空ではない=リンクテーブルであると判断
If Len(tdf.Connect) > 0 Then
‘ 既存の接続文字列を新しいパスに差し替える
‘ ※「DATABASE=」以降を書き換えるのが定石
tdf.Connect = “;DATABASE=” & strNewPath
‘ 変更を反映するためにRefreshLinkメソッドを叩く
‘ ここが最も重要な「儀式」です
tdf.RefreshLink
Debug.Print “修復完了: ” & tdf.Name
End If
Next tdf
Set db = Nothing
MsgBox “リンクテーブルの修復が完了しました!”, vbInformation
End Sub
—
このコードを使いこなすためのヒント
1. エラーハンドリングを忘れずに
もしネットワークが切断されていたり、ファイルパスが間違っていたりすると、`RefreshLink`の瞬間にエラーが発生します。実運用では `On Error Resume Next` を適切に使い、ユーザーを驚かせない配慮が必要です。
2. なぜ `RefreshLink` が必要なのか?
`tdf.Connect` を書き換えるだけでは、Accessの内部メモリ上の設定が変わるだけです。`RefreshLink` を呼ぶことで初めて、Accessが実際に「そのファイルに接続しに行く」という動作を行います。この「儀式」を忘れると、設定は書き換わっているのにエラーが消えない……という悲劇に見舞われます。
3. パスの動的取得
上記のコードではパスを直書きしていますが、実際には「設定用テキストファイル」や「隠しテーブル」にパスを持たせておき、そこから読み込むようにすると、保守効率が劇的に向上します。
—
まとめ:Accessの支配者になろう
「リンク切れ」はAccessユーザーにとっての試練ですが、`TableDefs`と`RefreshLink`の仕組みさえ理解してしまえば、それは単なる「データ連携の更新」に過ぎません。
コードをコピペして終わりにするのではなく、「なぜこのオブジェクトを操作しているのか」という本質を感じ取ってみてください。これさえクリアすれば、あなたはもう初学者ではありません。Accessという巨大なデータベースを、自分の指先一つで制御できる「エンジニア」の入り口に立っているのです。
次は、クエリのSQLを動的に書き換えるテクニックに挑戦してみるのも面白いかもしれませんね。応援しています!
