【入門編】DoCmd.TransferSpreadsheetのインポートエラーテーブルを監視する自動例外処理 – Access VBA解析バイブル

スポンサーリンク

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自動化の「心臓部」にあたる処理です。これを実装できれば、もうマクロの記録に頼る必要はありません。

「プログラムは、起きるはずのないエラーを想定したとき、初めて完成する」

この言葉を胸に、ぜひあなたの業務ツールに組み込んでみてください。分からないことがあれば、いつでもまた聞きに来てくださいね。あなたの挑戦を、心から応援しています!

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