【入門編】Application.CurrentData.AllTablesを使用した存在しないテーブルへのアクセス回避とエラーハンドリング – Access VBA解析バイブル

スポンサーリンク

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の景色がガラッと変わるはずですよ。

また次回の講義でお会いしましょう。健闘を祈ります!

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