AccessのインポートウィザードでCSVを取り込もうとすると、「インデックスが有効範囲にありません」と表示されることがあります。このメッセージだけでは原因が分かりません。ウィザードがCSVの列を数えたり、列名を取り込み先に対応付けたりする段階で、想定と実際がずれたときに出ることがあります。ここでは、見出し行、行ごとの列数、取り込み先テーブルとの対応の順に、原因を切り分ける手順をまとめます。
作業前の準備
- 元のCSVは残しておき、コピーを使って確認・修正する
- CSVは、メモ帳など中身をそのまま見られるテキストエディターで開く。Excelで開いて保存し直すと、先頭の0や日付、引用符が変わることがあるため
- 取り込み先が既存のテーブルなら、そのテーブルのフィールド名と順番を控えておく
まず切り分け:見出しを使わずに新規テーブルへ取り込む
最初に、次の条件でもう一度インポートしてみます。
- 取り込み先を新しいテーブルにする
- 「先頭行をフィールド名として使う」のチェックを外す
- 区切り記号をカンマにし、文字列の引用符を「"」(ダブルクォーテーション)にする
結果を見て、次のように見当を付けます。
| 結果 | 疑う箇所 |
|---|---|
| 取り込めた | 見出し行のフィールド名、または既存テーブルとの対応 → 手順1・手順3へ |
| 取り込めたが、右端に一部の行だけ値が入った列がある | 行ごとの列数のずれ → 手順2へ |
| 同じエラーが出る | 列数のずれ、区切り記号・引用符の設定 → 手順2へ |
見出しなしで取り込んだ列には、Field1のような仮の名前が付きます。
手順1:見出し行のフィールド名を確認する
CSVの1行目を見て、次の点を確認します。
- 空欄の列名がないか:「氏名,,住所」のようにカンマが続く箇所や、行末が「,」で終わっている箇所は、名前のない列として扱われます。
- 同じ名前が2回以上出ていないか:「金額,金額」のような重複です。大文字・小文字の違いだけの名前も、同じ名前とみなされることがあります。
- フィールド名に使えない文字がないか:Accessのフィールド名には、ピリオド(.)、感嘆符(!)、アクサングラーブ(`)、角かっこ([ ])を使えません。先頭をスペースにすることもできません。
- 長すぎる名前がないか:フィールド名は64文字までです。
- 見えない文字が入っていないか:先頭の列名の前に余分な文字が付いて見える場合は、文字コードやBOMの扱いがずれている可能性があります。インポートウィザードの「詳細設定」で、コードページが元のファイルと合っているか確認します。
確実なのは、CSVのコピーで1行目だけを書き換える方法です。空欄の列には名前を付けます。重複した名前は「金額_税抜」「金額_税込」のように区別できる名前に変えます。使えない記号は、削除するかアンダースコアなどに置き換えます。
修正したら、「先頭行をフィールド名として使う」にチェックを入れて、もう一度インポートします。
手順2:行ごとの列数がそろっているか確認する
途中に見出しより列の多い行があると、取り込みに失敗することがあります。よくある原因は次のとおりです。
- 値の中のカンマが引用符で囲まれていない:「株式会社A,東京都港区1-2-3,ビル5F」のように、住所や金額の桁区切りにカンマが入っている
- 引用符の閉じ忘れ:「"東京都港区」のように片方だけ引用符があり、それ以降の区切りがずれる
- セル内改行:値の途中で改行されていて、1件が2行に分かれて見える
- 行末の余分なカンマ:一部の行だけ、末尾に「,」が付いている
列数のずれを見つける方法
- 最初の切り分けで見出しなしの取り込みができたなら、できたテーブルを開きます。右端の列に値が入っている行を、並べ替えやフィルターで探します。それが列の多い行です。
- 取り込めない場合は、CSVのコピーの後ろ半分を削って取り込めるか試します。成功か失敗かを見ながら範囲を半分ずつ絞り込むと、原因の行にたどり着けます。
- ExcelのPower Query(データ>テキストまたはCSVから)でプレビューし、右端の列に値が入っている行を探す方法もあります。
直し方
- カンマを含む値は、値全体をダブルクォーテーションで囲む
- 引用符の閉じ忘れは、出力元のデータで該当行を確認して直す
- 出力元のシステムで設定を変えられるなら、引用符付きで出し直すほうが手作業で直すより安全
インポートウィザードの「詳細設定」で、区切り記号と文字列の引用符の指定が実際のファイルと合っているかも確認します。引用符を「なし」にしていると、正しく囲まれた値でも、中のカンマで列が分かれてしまいます。
手順3:既存テーブルとの列の対応を確認する
「既存のテーブルにレコードを追加する」を選んでいる場合は、CSVの見出しの名前が、取り込み先テーブルのフィールド名と対応している必要があります。対応が取れていないと、このエラーや別のエラーで止まることがあります。
- CSVにあってテーブルにない列名がないか
- 名前の表記(全角・半角、スペース、記号)が完全に一致しているか
- CSVの列数が、テーブルのフィールド数より多くないか
確実な回避策は、いったん新しいテーブルへ取り込んでから、追加クエリで既存テーブルへ必要な列だけを入れる方法です。
- CSVを、新しい作業用テーブルに取り込む
- 作業用テーブルの件数と中身を確認する
- 追加クエリで、作業用テーブルの各列を既存テーブルの対応するフィールドに割り当てて実行する
- 確認が済んだら、作業用テーブルを削除する
毎回列名が少しずつ違うCSVを取り込む運用なら、この形にしておくと、見出しの違いを追加クエリ側で吸収できます。
保存したインポート定義を使っている場合
「詳細設定」で保存した定義を読み込んで取り込んでいる場合は、定義を作ったときと今のCSVとで、列の数や順番が変わっていないかを確認します。変わっているとずれが起きます。定義の列一覧と今のCSVの1行目を並べて比べ、違いがあれば定義を作り直します。
取り込めた後の確認
エラーが消えても、データが正しく入ったとは限りません。
- CSVの件数とテーブルのレコード数が一致するか。セル内改行があると、テキストエディターで見た行数と件数は一致しない点に注意する
- 「…_インポート エラー」のような名前のテーブルが作られていないか。作られていれば、型を変換できなかった行が記録されている
- 先頭の0が消えていないか、日付や金額が想定どおりの型で入っているか
- 文字化けしていないか
確認順のまとめ
- 見出しなしで、新規テーブルに取り込めるか試す
- 1行目のフィールド名を直す(空欄・重複・使えない記号・長さ)
- 行ごとの列数をそろえる(カンマ・引用符・セル内改行・行末のカンマ)
- 既存テーブルへの追加なら、作業用テーブルを経由する形に切り替える
- 件数と、インポートエラーのテーブルの有無で結果を確かめる
VBAのDoCmd.TransferTextで取り込んでいて、エラー番号付きで止まる場合は、確認する点が違います。その場合はエラー番号から原因を切り分けてください。
