Access VBAの「予期せぬエラー」を根絶する!`CurrentData.AllTables`による防御的プログラミングの極意
こんにちは。現場の最前線でAccessと格闘してきたエンジニアとして、今日は皆さんに「プログラムが途中で突然死しないための究極の作法」を伝授します。
Access VBAを書き始めると、必ず一度はぶつかる壁があります。それは「存在しないテーブルにアクセスしてエラーになり、処理が強制終了する」という問題です。
「テーブルがあるか確認して、なければ作る」
「リンクテーブルが切れていないか確認する」
これらを制御できるようになれば、あなたはもう「マクロの記録」を卒業した、立派なAccess開発者です。今日はその第一歩を、一緒に踏み出しましょう。
—
1. なぜ「いきなりアクセス」は危険なのか?
例えば、このようなコードを書いたことはありませんか?
‘ 悪い例:存在確認なしでいきなり削除
DoCmd.DeleteObject acTable, “T_一時集計”
もし「T_一時集計」というテーブルが何らかの理由で消えていたら、Accessは無慈悲に「実行時エラー 7874」を叩きつけ、処理を停止させます。
ユーザーが使うツールでこんなエラーが出たら、信頼はガタ落ちです。我々エンジニアが目指すべきは、エラーで止まるコードではなく、「何が起きてもスマートに分岐する、しなやかなコード」です。
—
2. `CurrentData.AllTables` という「地図」を手に入れる
Accessには、現在データベース内にある全てのテーブルを把握するための「地図」が備わっています。それが `Application.CurrentData.AllTables` コレクションです。
このコレクションを使うと、「そのテーブルが今存在するかどうか」を、実際にアクセスする前に確認できるのです。
基本的な存在確認のテンプレート
まずは、この「防御的プログラミング」の基本形を覚えてください。
Public Sub SafeTableDelete()
Dim tableName As String
tableName = “T_一時集計”
‘ CurrentData.AllTables にテーブル名が含まれているかチェック
If CurrentData.AllTables.Exists(tableName) Then
‘ 存在する場合のみ削除を実行
DoCmd.DeleteObject acTable, tableName
Debug.Print tableName & ” を削除しました。”
Else
‘ 存在しない場合は、エラーを吐かせずログだけ残す(または何もしない)
Debug.Print tableName & ” は存在しません。処理をスキップします。”
End If
End Sub
このコードのポイント
1. `Exists` メソッド: これが今回の主役です。文字列として渡した名前が、現在のDB内に存在するかを Boolean(True/False)で返してくれます。
2. エラーの未然防止: `DeleteObject` を呼ぶ前に確認するため、実行時エラーが発生するリスクがゼロになります。
—
3. なぜ「CurrentDb」ではなく「CurrentData」なのか?
ここで少しだけ本質的な話をしましょう。
- `CurrentDb`: データベースの「中身(データや構造)」を操作するためのオブジェクト。
- `CurrentData`: データベースの「構成物(テーブルやクエリの定義)」にアクセスするためのオブジェクト。
「テーブルが存在するかどうか」を知るには、データの操作用である `CurrentDb` よりも、定義の管理用である `CurrentData` を使う方が、Accessの内部構造的にも非常に効率的で理にかなっているのです。
—
4. 【応用編】リンクテーブルの接続チェックにも使える
現場でよくあるのが、「外部のSQL Serverや別のMDBにリンクしているテーブルが、サーバー切断などで見えなくなる」トラブルです。これも `AllTables` で制御できます。
Public Sub CheckLinkTableStatus()
Dim tbl As AccessObject
‘ 全テーブルをループしてチェック
For Each tbl In CurrentData.AllTables
‘ リンクテーブルのみを対象にする
If tbl.Connect <> “” Then
‘ ここでエラー制御付きの接続確認を行うのがプロの技
Debug.Print “テーブル名: ” & tbl.Name & ” / 接続文字列: ” & tbl.Connect
End If
Next tbl
End Sub
—
エンジニアからのメッセージ
プログラミングの美しさは、「いかにエラーを発生させないか」という工夫に宿ります。
初心者のうちは「動けばいい」と考えがちですが、中級者への扉は「もし存在しなかったら?」「もし通信が切れたら?」という「もしも(What-if)」を想像することから始まります。
`CurrentData.AllTables` を使った防御的な書き方を身につければ、あなたの作るAccessツールは、ユーザーにとって「勝手に止まらない、信頼できる相棒」になります。
さあ、まずはあなたの既存のコードに、この「存在チェック」を組み込んでみてください。これだけで、Access VBAの景色がガラッと変わるはずですよ。
また次回の講義でお会いしましょう。健闘を祈ります!
