Access VBAの「迷子」をなくす:存在しないテーブルを華麗にかわす防御的プログラミング
こんにちは。日々の業務自動化に情熱を燃やすエンジニアです。
Access VBAを使っていて、「突然のランタイムエラーでプログラムが止まった…」という経験はありませんか? 特に、バックエンド(データ)とフロントエンド(画面)が分かれている場合、「リンクテーブルが見当たらない」というエラーは、いわば「定番の罠」です。
マクロの記録から一歩踏み出し、プロフェッショナルなコードを書くためには、「プログラムを信じすぎないこと」が重要です。今日は、`Application.CurrentData.AllTables` を使って、テーブルが存在するかを事前にチェックし、エラーを未然に防ぐ「防御的プログラミング」の極意を伝授します。
—
なぜ「エラーハンドリング」が必要なのか?
初心者のうちは、「動けば正義」と考えがちです。しかし、Accessはネットワーク環境やユーザーの操作によって、状況が常に変化します。
- テーブルが誤って削除された
- リンク先のファイルが移動した
- 一時テーブルを作る予定が、まだ作成されていない
こうした状況でいきなり処理を実行すると、Accessは「そんなテーブルはないよ!」と悲鳴を上げ、プログラムを強制終了させます。これを防ぐのが、「確認してから実行する」というシンプルな作法です。
—
魔法のオブジェクト:`AllTables` を使いこなす
Access VBAには、現在読み込まれているすべてのテーブルを管理する `AllTables` というコレクションが存在します。これを使えば、テーブルの「名簿」を照会するような感覚で、存在確認が可能です。
実践:テーブル存在チェックのテンプレート
まずは、このコードを読んでみてください。これが現場で最も汎用性の高い「防御の基本形」です。
Public Function IsTableExists(tableName As String) As Boolean
‘ — 役割: 指定したテーブルが存在するかを判定する —
‘ Application.CurrentData.AllTables は、全テーブルの情報を保持するコレクションです
Dim tbl As AccessObject
IsTableExists = False ‘ 初期値は「見つからない」に設定
‘ 全テーブルを一つずつチェック
For Each tbl In Application.CurrentData.AllTables
If tbl.Name = tableName Then
IsTableExists = True ‘ 見つかったらTrueを返す
Exit For ‘ 見つかった時点でループを抜ける(効率化!)
End If
Next tbl
End Function
—
なぜこの書き方なのか?(エンジニアの視点)
このコードには、プロが大切にしている「3つの美学」が詰まっています。
1. 「早期脱出(Exit For)」の原則:
テーブルが100個あっても、探しているテーブルが最初に見つかれば、残りの99個を調べる必要はありません。無駄な処理を省くことは、パフォーマンスの基本です。
2. 真偽値(Boolean)の活用:
関数を `Boolean` 型にすることで、他の処理で `If IsTableExists(“T_受注”) Then …` と直感的に呼び出せます。
3. カプセル化:
「存在チェック」という一つの機能を独立した関数にすることで、コードの再利用性が劇的に向上します。
—
実践編:エラーを回避する「賢い処理」
では、この関数を実際にどう使うのか。テーブルが存在する場合のみデータを削除(空にする)する処理を見てみましょう。
Sub SafeDeleteTableData()
Dim targetTable As String
targetTable = “T_一時集計テーブル”
‘ 存在確認関数を呼び出す
If IsTableExists(targetTable) Then
‘ 存在する場合のみ、安全に処理を実行
DoCmd.RunSQL “DELETE FROM ” & targetTable
MsgBox “データを削除しました。”
Else
‘ 存在しない場合は、エラーを出さずに親切な通知を出す
MsgBox “注意: ” & targetTable & ” が見つかりません。処理をスキップします。”
End If
End Sub
—
陥りやすい罠:これだけは注意!
初学者がよくやるミスは、`On Error Resume Next` (エラーが発生しても無視して進め)を乱用することです。
これをやると、「テーブルがないから処理がスキップされたのか」それとも「別の重大なエラーが起きたのか」が分からなくなります。「エラーを無視する」のではなく「エラーが起きないように条件分岐する」のが、一流のエンジニアの流儀です。
—
最後に:自動化は「安心」を作る作業
Access VBAは、あなたの代わりに「確認」と「判断」をしてくれる優秀な助手です。今回紹介した `AllTables` を使った防御的な書き方は、まさにその助手に「空気を読ませる」ための技術です。
まずはこのコードをコピペして、お手元のAccessで動かしてみてください。「エラーが出ない」という安心感こそが、安定した業務自動化システムの第一歩ですよ。
ここをクリアしたあなたは、もう「マクロの記録」に頼るだけのユーザーではありません。次は、この防御的な思考を持って、よりダイナミックなシステム構築に挑戦していきましょう!
応援しています。分からないことがあれば、いつでもまた聞きに来てくださいね。
