こんにちは!現場でバリバリ使えるAccessの仕組み、一緒に楽しくマスターしていきましょう。
システムを運用していると、よくこんなトラブルが起きますよね。
「ファイルサーバーの共有フォルダの場所が変わった!」
「PCの入れ替えでドライブ割り当て(Zドライブなど)が変わっちゃった!」
これ、Accessの「リンクテーブル」を使っているシステムだと大惨事です。いざ起動したら「テーブルが見つかりません!」とエラーの嵐になり、1台ずつ手作業でリンクマネージャーを開いてパスを貼り直す……なんて、エンジニアの仕事としてはちょっと不毛ですよね。
今回は、「Access起動時に、VBAが自動でリンクテーブルの接続先(パス)を確認し、変わっていたらスッと自動修復してくれる堅牢な仕組み」を一緒に作っていきましょう。
ここをクリアすれば、Access VBAのオブジェクトモデルの理解が一気に深まります。優しく丁寧にお伝えするので、安心してついてきてくださいね!
—
1. なぜ「CurrentDb」と「TableDefs」を使うのか?
Access VBAでデータベースの中身を操作するとき、絶対に避けて通れないのがオブジェクトモデルの理解です。
- `CurrentDb`(カレント・データベース)
今まさに開いているAccessファイルそのものを指すオブジェクトです。
- `TableDefs`(テーブル・ディフィニションズ)
データベース内にある「テーブルの定義(設計図)」の集まり(コレクション)です。ここには、ローカルテーブルだけでなく、他のファイルと繋がっている「リンクテーブル」の情報もすべて入っています。
イメージとしては、`CurrentDb.TableDefs` は「我が家にある全ての合鍵の束」のようなもの。その束の中から、外部を指している合鍵(リンクテーブル)を1本ずつ取り出して、「今の宛先は合ってるかい?」とチェックしていくイメージです。
—
2. 全体設計:どうやって自動修復するのか?
今回の自動修復ツールのロジックは非常にシンプルです。
1. Accessが起動した瞬間(Autoexecマクロやスタートアップフォーム)にプログラムが発動。
2. `CurrentDb.TableDefs` をグルっと1周ループして、リンクテーブル(`Connect`プロパティに何か設定されているもの)を探す。
3. 見つかったリンクテーブルの接続先パスをチェックし、もし新サーバーのパスに書き換わっていたら、VBAのコードで書き換えて `RefreshLink` メソッドを実行!
4. 修復完了のログをそっと残す。
これだけです。では、実際のコードを見てみましょう。
—
3. 実装コード:起動時に走る「リンク自動修復モジュール」
標準モジュール(例:`modLinkRepair` など)を新規作成し、以下のコードをそのまま貼り付けてみてください。現場でそのままコピペして使えるように、たっぷりコメントを入れています。
Option Compare Database
Option Explicit
‘ ==============================================================================
‘ 処理名 : リンクテーブル接続先自動修復プロシージャ
‘ 概要 : ファイルサーバー移行等に伴うリンク切れを起動時に検知し自動修復する
‘ ==============================================================================
Public Sub AutoRepairLinkTables()
Dim db As DAO.Database
Dim tdf As DAO.TableDef
Dim oldPath As String
Dim newPath As String
Dim repairedCount As Long
‘ 【設定エリア】移行前の古いパス(の一部) と 新しいパスを指定します
‘ 例: 古い共有フォルダ名「\\OldServer\Data\」を、新しい「\\NewServer\Database\」に置き換える場合
oldPath = “\\OldServer\Data\”
newPath = “\\NewServer\Database\”
repairedCount = 0
On Error GoTo ErrorHandler
‘ 現在のデータベースオブジェクトを取得
Set db = CurrentDb
‘ すべてのテーブル定義(TableDefs)を走査する
For Each tdf In db.TableDefs
‘ Connectプロパティに文字列が入っているものは「リンクテーブル」とみなす
‘ (ローカルテーブルはConnectが空文字のためスルーされます)
If Len(tdf.Connect) > 0 Then
‘ デバッグ用(イミディエイトウィンドウに現在のリンク先を表示)
‘ Debug.Print “確認中: ” & tdf.Name & ” -> ” & tdf.Connect
‘ 接続文字列の中に、古いパスが含まれているかチェック
If InStr(1, tdf.Connect, oldPath, vbTextCompare) > 0 Then
‘ パスを新しいものに置換する
‘ ※AccessのリンクテーブルのConnectは “MS Access;DATABASE=ファイルパス” の形式になっています
tdf.Connect = Replace(tdf.Connect, oldPath, newPath, 1, -1, vbTextCompare)
‘ ★ここが最重要!変更した接続情報をテーブルに反映(リフレッシュ)させる
tdf.RefreshLink
repairedCount = repairedCount + 1
‘ ログ出力(必要に応じてコメントアウト解除)
‘ Debug.Print “【修復成功】” & tdf.Name & ” のパスを更新しました。”
End If
End If
Next tdf
‘ 後片付け
Set db = Nothing
‘ 結果報告(必要に応じてメッセージボックスを出してもOKです)
If repairedCount > 0 {
MsgBox “リンクテーブルの自動修復が完了しました。” & vbCrLf & _
“更新されたテーブル数: ” & repairedCount & “件”, vbInformation, “起動時チェック”
}
Exit Sub
ErrorHandler:
MsgBox “リンクテーブルの修復中にエラーが発生しました。” & vbCrLf & _
“エラー番号: ” & Err.Number & vbCrLf & _
“エラー内容: ” & Err.Description, vbCritical, “システムエラー”
If Not db Is Nothing Then Set db = Nothing
End Sub
—
4. このコードの「知るべきポイント」と陥りやすい罠
ここからは、一歩進んだチーフアーキテクトからの視点です。このコードがなぜ堅牢なのか、そして初心者がハマりがちなポイントを解説します。
① なぜ `TableDefs` なのか?(QueryDefsではない理由)
Access初心者がやりがちな間違いとして、「クエリからリンクテーブルを直そうとする」ケースがあります。しかし、外部データベースへの接続情報はあくまでテーブルの定義(TableDef)に紐づいています。ここを正確に捉えているのが、このコードが安定して動作する理由です。
② `RefreshLink` を忘れると死ぬ
コード内で `tdf.Connect = …` とパスを書き換えただけでは、実はAccessのメモリ上に一時保存されているだけで、データベースエンジンに「これで接続し直せ!」と命令していません。
ここで `tdf.RefreshLink` を実行して初めて、Accessが新しいパスのバックエンドファイル(`.accdb` や `.mdb`)にアクセスしに行き、実体とリンクを確立します。この1行を忘れないようにしましょう。
③ どこからこのプロシージャを呼び出すか?
作っただけでは動きません。以下のいずれかの方法で「起動時」に走らせます。
- 方法A:自動マクロを使う
`Autoexec` という名前のマクロを新規作成し、アクションに `プロシージャの実行` を選択。関数名に `AutoRepairLinkTables` と指定します。これでAccessを開いた瞬間に自動実行されます。
- 方法B:スタートアップフォームの `Form_Load` イベントを使う
最初に開くメイン画面の裏側で、`Call AutoRepairLinkTables` と呼び出します。ユーザーを待たせずに裏でコソッと直せるため、スマートな実務システムでよく使われる手法です。
—
まとめ:ここをクリアすれば、Access VBAの基本はバッチリ!
今回は、`CurrentDb.TableDefs` を使ったリンクテーブルの自動修復という、実務で100%役立つテクニックを解説しました。
- `CurrentDb` で今のデータベースを掴む
- `TableDefs` をループしてリンクテーブルを見つける
- `Connect` プロパティを書き換えて、`RefreshLink` で確定させる
この一連の流れが頭に入れば、あなたはもう「マクロの記録」に頼る初級者ではありません。立派なAccess自動化エンジニアの仲間入りです!
ファイルサーバーの移行やネットワーク環境の変更におびえる日々とは、今日でサヨナラしましょう。ぜひ、あなたの現場のシステムにも取り入れてみてくださいね。
