ACCESS インポートをエラーをVBAで検知する方法
![インポートをエラーをVBAで検知する方法](https://tasukete-access.com/wp-content/uploads/2024/07/ブログサムネイル_インポートをエラーをVBAで検知する方法.png)
ACCESSにExcelやcsvファイルをインポートする際、データ型の違いなどでエラーが出ることが良くあります。
手動でインポートしていれば、インポートエラー発生時にエラーテーブルが作成されるので分かるのですが、VBAでインポート処理を作っているとインポートエラーに気づくことが難しくなります。
そこで、今回はインポートをエラーをVBAで検知する方法をご紹介します。
こんにちは。
はこにわガジェット (@hakoniwagadget) です。
ACCESSを使った売上管理、顧客管理などのデータベース開発を行っています。
ACCESSは基本機能だけでも十分便利ですが、VBAを使うことで格段に使いやすいデータベースを作成可能です。
この記事ではACCESSでのVBAの使い方をご紹介していきます。
インポートエラーの検知方法
ACCESSでは外部からファイルをインポートした際、エラーが発生するとエラー内容が記載されたインポートエラーテーブルが自動生成されます。
そのため、インポート処理後に名前に「インポート エラー」が含まれるテーブルの有無をチェックすることでインポートエラーが発生したか否かを判断することができます。
ACCESSのインポートエラー
ExcelやcsvからACCESSにデータをインポートする際、インポートがうまくいかないケースがあります。
原因として一番多いのがデータ型の違いですね。
例えば、ACCESSでは数値型として設定しているフィールドに、テキスト型のデータをインポートするとエラーとなってしまいます。
インポートを手動で行っている場合は、インポートエラーをメッセージで知ることができます。
![](https://tasukete-access.com/wp-content/uploads/2024/07/import_02.png)
また、インポートエラーテーブルが自動で作成されるので、どのレコードの何が悪かったのかを知ることもできます。
![](https://tasukete-access.com/wp-content/uploads/2024/07/import_03.png)
VBAでのインポートエラー
一方でVBAでインポート処理を作成していると、こうしたエラーへの対処が難しくなります。
上記と同じテーブル、同じインポートファイルを使って、VBAでインポートを行う処理を作成しました。
Private Sub インポート_ボタン_Click()
DoCmd.TransferText acImportDelim, "test_インポート定義", "test_インポート", FileName, False
End Sub
上記のプロシージャで同じcsvファイルをインポートするとインポートエラーテーブルは作成されるのですが、エラーメッセージが表示されません。
![](https://tasukete-access.com/wp-content/uploads/2024/07/import_04.png)
これでは、利用者がインポートエラーに気づけずに困ってしまいますね。
インポートエラーを検知するVBAのプロシージャ
そこで、インポートエラーを検知するプロシージャを作成しました。
上記の通りインポートエラーが発生するとエラーテーブルが生成されます。
そのため、エラーテーブルの有無をチェックし、エラーテーブルが存在した場合はアラートを表示した上で、エラーテーブルを削除するという処理をしています。
Public Function CleanUpImportErrorTable() As Integer
'■■■インポートエラー時にエラーテーブルを削除する■■■
CleanUpImportErrorTable = 0
Dim currentDataBase As Database
Dim tableDefinition As Variant
Set currentDataBase = CurrentDb
For Each tableDefinition In currentDataBase.TableDefs
If (InStr(tableDefinition.Name, "インポート エラー") > 0) Then
DoCmd.DeleteObject acTable, tableDefinition.Name
End If
Next
Set currentDataBase = Nothing
End Function
コードを解説します。まず、
For Each tableDefinition In currentDataBase.TableDefs
の部分で、ACCESSデータベース内に存在するすべてのテーブルに対してループ処理を実行しています。
その上で、
If (InStr(tableDefinition.Name, "インポート エラー") > 0) Then
の部分で、If文を使ってテーブル名に「インポート エラー」が含まれるテーブルがあるかどうかを判定しています。
このテーブルがあった場合に、インポートエラーが発生したと判定しているわけです。
その後、
DoCmd.DeleteObject acTable, tableDefinition.Name
でインポートエラーテーブルを削除しています。
実際の運用では、ここでメッセージボックス関数でインポートエラーが発生した旨のメッセージを表示し、中途半端にインポートされたテーブル内のデータを削除しておくのが良いでしょう。
以上、インポートをエラーをVBAで検知する方法をご紹介しました。
ACCESSを使いこなせば、業務の効率化や自動化が実現できます。
しかし、自分でACCESSを学ぶには時間がない、難しそうで不安、という方も多いでしょう。
そんな時は、ACCESS開発歴20年以上、過去に100以上のACCESSデータベースを開発してきた私(@hakoniwagadget)にお任せください。
ACCESSの新規開発、既存のACCESSの修正、ACCESSの操作レッスンなど様々なサービスをご提供しています。
ご興味のある方は下記のサービス一覧をご覧ください。
![サービス一覧](https://tasukete-access.com/wp-content/uploads/2021/03/サービス一覧.jpg)
最後までお読みいただき、ありがとうございました。