アクセスで作成したテーブルにVBAを利用してCSVデータをインポートすると、
『貼り付け先のテーブルには’F1’フィールドがありません』
のエラーが発生する場合があります。
このエラーはヘッダ(見出し行)が存在しないCSVをVBAでインポートする際に発生します。
ヘッダーが存在しないCSVを取り込む時は『インポート定義』を設定すればCSVの取り込みが出来るようになります。
そこで今回は、
- ヘッダ無しのCSV(「インポート定義」が必要)
- ヘッダ有りのCSV(「インポート定義」が不要)
この2つのCSVをそれぞれVBAでインポートする手順を解説します。
CSVファイルをインポートするための事前準備
CSVデータの取り込みを確認するために用意したのは以下の通りです。




使用するメソッド
★構文★
Docmd.TransferText(TransferType, SpecificationName, TableName, FileName, HasFieldNames, HTMLTableName,CodePage)
★各パラメーターの解説
【TransferType[省略可能]】
変換の種類(区切りテキスト、固定長テキストなど)を指定します。
規定値は「acImportDelim」です。
【SpecificationName[省略可能]】
データベースに保存したインポート、もしくはエクスポートの定義名を文字列式で指定します。
【TableName[省略可能]】
インポート先、エクスポート先のAccessテーブル/クエリの名前を文字列式で指定します。
【FileName[省略可能]】
インポート、エクスポートを行うテキストファイルのパス名を文字列式で指定します。
【HasFieldNames[省略可能]】
インポート、エクスポートするときにテキストファイルの1行目をフィールド名とするか否かを指定します。
1行目を使用する場合は「True」、使用しない場合は「false」を使用します。
規定値は「false」です。
【HTMLTableName[省略可能]】
インポートまたはリンクする HTMLファイル内のテーブルまたはリストの名前を文字列式で指定します。
【CodePage[省略可能]】
コード ページの文字セットを示す長整数型 (Long) の値を指定します。
【参考:TransferTypeの種類】
定数 | 説明 |
acExportDelim | カンマ、タブなど区切り記号つきエクスポート |
acExportDelim | 固定長エクスポート |
acExportHTML | HTMLエクスポート |
acExportMerge Word | Word差し込みデータエクスポート |
acImportDelim | カンマ、タブなど区切り記号つきインポート(既定値) |
acImportFixed | 固定長インポート |
acImportHTML | HTMLインポート |
acLinkDelim | カンマ、タブなど区切り記号つきリンク |
acLinkFixed | 固定長リンク |
acLinkHTML | HTMLリンク |
CSVファイルをVBAでインポートする(ヘッダ情報あり)
フォームに作成した『データ取り込み』のボタンを押した際のクリックイベントに、以下のVBAを記述します。
[st-kaiwa2]ヘッダ情報ありのCSVを取り込む時は、『HasFieldNames』に『True』を設定しましょう。
ポイント
Private Sub btn取込_TR_Click()
‘=== CSVをテーブルにインポートする ===
‘ヘッダ有り
DoCmd.TransferText acImportDelim, , “発送データ_TR”, “C:\Access\Inport_data2.csv”, True
End Sub
VBAを保存、『データ取り込み』のボタンを押してCSVをインポートしてみます。

無事に『発送データ_TR』にCSVデータがインポートされました。
CSVファイルをVBAでインポートする(ヘッダ情報なし)
では次に、ヘッダ情報がないCSVファイル(Inport_data1.csv)をインポートしてみましょう。
『データ取り込み』のボタンを押した際のクリックイベントに、以下のVBAを記述します。
[st-kaiwa2]ヘッダ情報なしのCSVを取り込む時は、『HasFieldNames』に『False』を設定しましょう。
データ取り込み』のボタンを押した際のクリックイベントに、以下のVBAを記述します。
ポイント
Private Sub btn取込_TR_Click()
‘=== CSVをテーブルにインポートする ===
‘ヘッダ有り
DoCmd.TransferText acImportDelim, , “発送データ_TR”, “C:\Access\Inport_data2.csv”, False
End Sub
VBAを保存、『データ取り込み』のボタンを押してCSVをインポートすると、エラーが発生しました。

『HasFieldNames』に『False』を設定することは正解なのですが、ヘッダ情報がないため、CSVの項目をテーブルに設定できません。
それが原因となって『貼り付け先のテーブルには’F1’フィールドがありません』というエラーが発生しています。
このエラーは『SpecificationName』にインポート定義を設定することにより回避することができます。
CSV取り込み時のインポート定義を取得する手順
アクセスの『外部データ』→『新しいデータソース』→『ファイルから』→『テキストファイル』を選びます。

『外部データの取り込み』画面が開きます。
ファイル名の項目に、ヘッダ情報がないCSVファイルを指定して『OK』をクリック。

『区切り記号付き』を選択して『次へ』をクリック。

左下にある『設定』をクリック。

『インポート定義』の画面が開きます。
右側にある『保存』をクリックして、定義名を記述します。


ここで作成した定義名は、VBAで記述するので控えておきましょう。
『OK』を押して『インポート定義』の画面を閉じます。
あとは通常通りに進んで、ヘッダ無しのCSVファイルがテーブルにインポート出来るか確認してみて下さい。

作成したインポート定義をVBAに設定する
先ほど作成したインポート定義『CSVヘッダ無し』をVBAのパラメーター(SpecificationName)に設定します。
ポイント
Private Sub btn取込_TR_Click()
‘=== CSVをテーブルにインポートする ===
‘ヘッダ無し(インポート定義を設定)
DoCmd.TransferText acImportDelim, “CSVヘッダ無し”, “発送データ_TR”, “C:\Access\Inport_data1.csv”, False
End Sub
VBAを保存、『データ取り込み』のボタンを押してCSVをインポートしてみます。
インポート定義を設定したことにより、ヘッダ情報のないCSVファイルもVBAで取り込みできるようになりました。

システムにデータを取り込む際には、エクセルよりもCSVが利用されることが多いです。
ヘッダの有無にかかわらずVBAでインポートできると便利ですよ!