アクセスで作成したテーブルにVBAを利用してCSVデータをインポートすると、

『貼り付け先のテーブルには’F1’フィールドがありません』

のエラーが発生する場合があります。

このエラーはヘッダ(見出し行)が存在しないCSVをVBAでインポートする際に発生します。
ヘッダーが存在しないCSVを取り込む時は『インポート定義』を設定すればCSVの取り込みが出来るようになります。

そこで今回は、

  • ヘッダ無しのCSV(「インポート定義」が必要)
  • ヘッダ有りのCSV(「インポート定義」が不要)

この2つのCSVをそれぞれVBAでインポートする手順を解説します。

CSVファイルをインポートするための事前準備

CSVデータの取り込みを確認するために用意したのは以下の通りです。

CSVを格納するテーブル:発送データ_TR
VBAを記述するトリガーとなるフォーム:カード発送
CSVデータ(ヘッダ情報なし):Inport_data1.csv
CSVデータ(ヘッダ情報あり):Inport_data2.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』を設定しましょう。

[/st-kaiwa2]

ポイント

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』を設定しましょう。

[/st-kaiwa2]

データ取り込み』のボタンを押した際のクリックイベントに、以下の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を取り込み

システムにデータを取り込む際には、エクセルよりもCSVが利用されることが多いです。

ヘッダの有無にかかわらずVBAでインポートできると便利ですよ!