DoCmd.TransferTextの実行時エラーは、メッセージに原因の手がかりが含まれていることが多いです。それでも、番号だけでは、どの引数が悪いのか分かりにくいことがあります。この記事では、エラー番号とメッセージから原因の当たりを付ける方法をまとめます。確かめる順番は、定義名、テーブル・クエリ名、ファイルパス、ファイルの状態、拡張子、フィールドです。
なお、エラー番号やメッセージの文言は、Accessのバージョンや環境によって異なることがあります。以下の番号は目安とし、実際に表示されたメッセージの内容を優先してください。
最初にやること:番号・メッセージ・実際の引数を記録する
エラーが出たら、まず次の3つを控えます。
- エラー番号(Err.Number)
- メッセージ全文(Err.Description)
- TransferTextに実際に渡った引数の値
変数で組み立てたパスや名前は、思っている値と違うことがよくあります。実行直前にイミディエイトウィンドウへ出力しておくと、確認が早くなります。
Sub ImportUriage()
Dim specName As String
Dim tableName As String
Dim filePath As String
On Error GoTo EH
specName = "売上CSV定義"
tableName = "T_売上"
filePath = CurrentProject.Path & "\in\uriage.csv"
Debug.Print "定義名: [" & specName & "]"
Debug.Print "テーブル名: [" & tableName & "]"
Debug.Print "パス: [" & filePath & "]"
Debug.Print "ファイルあり: " & (Len(Dir(filePath)) > 0)
DoCmd.TransferText acImportDelim, specName, tableName, filePath, True
Exit Sub
EH:
Debug.Print "エラー " & Err.Number & ": " & Err.Description
End Sub
値を [ ] で囲んで出力しているのは、前後の余分なスペースや空文字に気づきやすくするためです。
エラー番号ごとの当たりの付け方
| 番号(目安) | メッセージの要旨 | 主に疑う箇所 |
|---|---|---|
| 3625 | 指定したインポート/エクスポート定義がない | 定義名 |
| 3011 | オブジェクトが見つからない | ファイルパス・ファイル名、テーブル・クエリ名 |
| 7874 | オブジェクトが見つからない | テーブル・クエリ名 |
| 3044 | 正しいパスではない | フォルダのパス |
| 3051 | ファイルを開けない、または書き込めない | ファイルの使用中・権限・読み取り専用 |
| 31519 | このファイルはインポートできない | 拡張子、ファイルの形式 |
| 2391 | 取り込み先テーブルにそのフィールドがない | フィールド名の対応 |
表にない番号が出た場合も、メッセージに出てくる名前やパスが、どの引数の値なのかを照らし合わせると、確認する箇所を絞り込めます。
1. 定義名を確認する(3625など)
TransferTextの第2引数には、インポート/エクスポートウィザードの「詳細設定」で保存した定義の名前を指定します。
- 定義名のつづり、全角・半角、前後のスペースが一致しているか
- 外部データタブの「保存されたインポート操作」の名前を指定していないか。保存されたインポート操作はDoCmd.RunSavedImportExportで実行するもので、TransferTextの定義名とは別物です
- 別のデータベースで作った定義を当てにしていないか。定義はデータベースごとに保存されます
保存されている定義の一覧は、インポートウィザードの「詳細設定」の画面にある「定義」ボタンから確認できます。
第1引数の種類と定義の形式が合っていない場合も、エラーになることがあります。たとえば、区切り記号付きの定義を固定長(acImportFixed)で呼び出す場合です。
2. テーブル名・クエリ名を確認する(3011、7874など)
- エクスポートでは、第3引数のテーブル・クエリが、ナビゲーションウィンドウに同じ名前で存在するか
- インポートで既存テーブルに追加するつもりなら、テーブル名のつづりが合っているか。存在しない名前を指定すると、新しいテーブルが作られることがあります
- 変数に代入した値に、余分なスペースや記号が入っていないか
- エクスポートするクエリが、実行時に値の入力を求めるパラメータクエリになっていないか。この種のクエリはエクスポートで失敗することがあるため、条件を固定したクエリを別に用意します
存在の確認はコードでもできます。
Function TableExists(ByVal name As String) As Boolean
Dim tdf As DAO.TableDef
For Each tdf In CurrentDb.TableDefs
If tdf.Name = name Then
TableExists = True
Exit Function
End If
Next
End Function
クエリの場合は、CurrentDb.QueryDefsを同じように調べます。
3. ファイルパスとファイル名を確認する(3011、3044など)
- ファイルが本当にあるか:Dir関数で確認する。インポートでファイルが見つからないと、3011のエラーになることがあります
- フォルダがあるか:エクスポートでは、出力先のフォルダがないと失敗します。出力先のフォルダは自動では作られないため、先に作っておきます
- フルパスで指定しているか:CurrentProject.Pathを使うと、データベースと同じフォルダを基準にパスを組み立てられます
- ネットワークドライブの割り当てに頼っていないか:別のPCや自動実行では、ドライブ文字が割り当てられていないことがあります。UNCパス(\サーバー名\共有名\…)で指定するほうが安定します
- ファイル名に余分なピリオドがないか:「売上.2026.10.csv」のように、ピリオドを複数含むファイル名で失敗する例があります。いったん「売上_202610.csv」のような名前に変えて試します
4. ファイルの使用中・読み取り専用を確認する(3051など)
- 対象のCSVを、Excelなどで開いたままにしていないか
- エクスポート先にある同名のファイルが、読み取り専用になっていないか
- 出力先のフォルダに書き込み権限があるか
- OneDriveなどの同期フォルダで、同期中のファイルを上書きしようとしていないか
ファイルを閉じても解消しない場合は、出力先をローカルの別フォルダに変えて試します。権限や同期の問題かどうかを切り分けられます。
5. 拡張子を確認する(31519など)
Accessは、テキストのインポート・エクスポートで扱える拡張子を制限しています。「.dat」「.log」のような拡張子や、拡張子のないファイルを指定すると、「このファイルはインポートできない」という内容のエラーで止まることがあります。
- インポートでは、ファイルを「.csv」か「.txt」の拡張子でコピーし、そのパスで試す
- エクスポートでも、出力ファイル名の拡張子を「.csv」か「.txt」にする
設定を変えて、許可する拡張子を増やす方法もあります。ただしレジストリの変更が必要です。組織で管理されているPCでは管理者に確認し、公式情報で手順を確かめてから行ってください。運用上は、拡張子をそろえるほうが安全です。
6. 取り込み先にないフィールドを確認する(2391など)
既存のテーブルに取り込むときは、CSVの見出しや定義の列名が、取り込み先テーブルのフィールドと対応している必要があります。対応していないと止まります。
- 第5引数(HasFieldNames)をTrueにしている場合、CSVの1行目の名前とテーブルのフィールド名が一致しているか
- 定義を使っている場合、定義の列名とテーブルのフィールド名が一致しているか。どちらの名前が使われるかは、定義と引数の組み合わせで変わることがあるため、両方を確認します
- CSVの列数が、テーブルのフィールド数より多くないか
見出しを直せない場合は、作業用テーブルに取り込んでから、追加クエリで既存テーブルへ移す方法があります。名前の違いを追加クエリ側で吸収できます。
なお、型が合わずに変換できなかった値は、実行時エラーにならず、「…_インポート エラー」のような名前のテーブルに記録されることがあります。エラーが出なくても、取り込み後に件数を確かめ、このテーブルが作られていないかを確認してください。
確認順のまとめ
- エラー番号・メッセージ・実際の引数を、Debug.Printで記録する
- 定義名が「詳細設定」の定義一覧にあるか。保存されたインポート操作と混同していないか
- テーブル・クエリが存在するか。パラメータクエリになっていないか
- ファイルとフォルダが存在するか。フルパスやUNCパスで指定しているか
- ファイルが開かれたままになっていないか。読み取り専用・権限・同期の問題がないか
- 拡張子が.csvか.txtか
- 取り込み先のフィールド名と列数が合っているか
VBAではなくインポートウィザードの操作中に「インデックスが有効範囲にありません」と出る場合は、見出し行や列数が原因のことが多いため、別の手順で切り分けてください。
