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の列数が、テーブルのフィールド数より多くないか

見出しを直せない場合は、作業用テーブルに取り込んでから、追加クエリで既存テーブルへ移す方法があります。名前の違いを追加クエリ側で吸収できます。

なお、型が合わずに変換できなかった値は、実行時エラーにならず、「…_インポート エラー」のような名前のテーブルに記録されることがあります。エラーが出なくても、取り込み後に件数を確かめ、このテーブルが作られていないかを確認してください。

確認順のまとめ

  1. エラー番号・メッセージ・実際の引数を、Debug.Printで記録する
  2. 定義名が「詳細設定」の定義一覧にあるか。保存されたインポート操作と混同していないか
  3. テーブル・クエリが存在するか。パラメータクエリになっていないか
  4. ファイルとフォルダが存在するか。フルパスやUNCパスで指定しているか
  5. ファイルが開かれたままになっていないか。読み取り専用・権限・同期の問題がないか
  6. 拡張子が.csvか.txtか
  7. 取り込み先のフィールド名と列数が合っているか

VBAではなくインポートウィザードの操作中に「インデックスが有効範囲にありません」と出る場合は、見出し行や列数が原因のことが多いため、別の手順で切り分けてください。

おすすめの記事