Access VBAの「インポートの闇」を光に変える!エラー監視の極意
こんにちは。現場で泥臭く、かつスマートな自動化を追求するエンジニアです。
Accessを使っていて、Excelからのデータ取り込み(`DoCmd.TransferSpreadsheet`)で頭を抱えたことはありませんか?
「正常に終わったはずなのに、なぜかテーブルが空っぽ」「気付かないうちに『インポートエラー』という不気味なテーブルが作られている」……これらは、Access開発者が必ず通る試練です。
今日は、そんな「インポートの裏側で起きているサイレントエラー」をVBAで検知し、ユーザーを迷子にさせないための堅牢な仕組みを伝授します。
—
なぜ「インポートエラーテーブル」が生まれるのか?
Accessはインポート時、データ型が合わなかったり、不正な値があったりすると、その行を無視して処理を続行し、代わりに「インポートエラー」という名の隠しテーブルを自動生成します。
初心者の方はここで躓きます。「エラーが出たのに、Accessが教えてくれない」からです。このままでは、データが欠損した状態で業務が進んでしまいます。これを「VBAで監視する」のが、一流のエンジニアへの第一歩です。
—
ステップ1:インポート処理をラップする
まず、単純にコマンドを叩くのではなく、エラーテーブルが存在するかどうかを判定するロジックを組み込みます。
Public Sub ImportExcelWithMonitoring(strPath As String, strTable As String)
On Error GoTo ErrorHandler
‘ 1. 事前に古いエラーテーブルがあれば削除しておく(クリーンな状態にする)
DeleteTableIfExists “インポートエラー”
‘ 2. インポート実行
DoCmd.TransferSpreadsheet acImport, acSpreadsheetTypeExcel12Xml, strTable, strPath, True
‘ 3. エラーテーブルが生成されたかチェック
If TableExists(“インポートエラー”) Then
MsgBox “取り込み中にエラーが発生しました。” & vbCrLf & _
“内容を確認してください。”, vbCritical, “注意”
‘ ここでエラーテーブルを開くか、ログを出力する処理へ
DoCmd.OpenTable “インポートエラー”
Else
MsgBox “取り込みが完了しました!”, vbInformation, “成功”
End If
Exit Sub
ErrorHandler:
MsgBox “致命的なエラー:” & Err.Description
End Sub
—
ステップ2:Accessオブジェクトモデルを支配する「共通関数」
ここで重要なのが、`CurrentDb.TableDefs` コレクションの使い方です。Accessのデータベース構造は、このコレクションを通すことで自由自在に操作できます。
‘ テーブルが存在するか確認する関数
Private Function TableExists(tableName As String) As Boolean
Dim tdf As TableDef
TableExists = False
‘ CurrentDbはデータベースへの窓口。ここから定義(TableDefs)を覗き見る
For Each tdf In CurrentDb.TableDefs
If tdf.Name = tableName Then
TableExists = True
Exit Function
End If
Next tdf
End Function
‘ テーブルを安全に削除する関数
Private Sub DeleteTableIfExists(tableName As String)
If TableExists(tableName) Then
DoCmd.DeleteObject acTable, tableName
End If
End Sub
—
このコードが「現場で強い」理由
1. 予防的保全: インポート前に古いエラーテーブルを確実に消すことで、「いつのエラーか分からない」という混乱を防ぎます。
2. オブジェクト指向的視点: `TableExists`のような小さな関数に分けることで、コードの再利用性が高まります。これは、将来的にアプリが大規模化しても崩れない「設計の基本」です。
3. ユーザーへの優しさ: エラー時にただ止まるのではなく、「何が起きたか」を明示的に伝える。これが、自動化エンジニアとしての「品格」です。
—
初学者が陥りやすい罠と対策
- 罠:エラーテーブルの「名前」が違う
- 対策:Accessの言語設定によってテーブル名は変わる場合があります。英語環境なら「ImportErrors」です。環境に応じて定数化しておくことをお勧めします。
- 罠:ファイルが使用中
- 対策:`TransferSpreadsheet`の前に、`Dir`関数でファイルが存在するか、あるいは開ける状態かを確認するワンクッションを挟むと、より完璧です。
—
さあ、次はあなたの番です
今回紹介したコードは、Access自動化の「心臓部」にあたる処理です。これを実装できれば、もうマクロの記録に頼る必要はありません。
「プログラムは、起きるはずのないエラーを想定したとき、初めて完成する」
この言葉を胸に、ぜひあなたの業務ツールに組み込んでみてください。分からないことがあれば、いつでもまた聞きに来てくださいね。あなたの挑戦を、心から応援しています!
