AccessVBA:【DoCmd】【TransferText メソッド】CSVファイルのインポート・取込み
ここでは「TransferText メソッド」を使ったCSVの取込み方法について、2通りの取り込み方を説明していきます。
- CSVにヘッダー情報がある場合
- CSVにヘッダー情報がない場合
◆事前準備
ここでは事前にCSVを取り込む先のテーブルを以下のように作っておきます。
1.CSVにヘッダー情報がある場合
以下は「サンプル1」テーブルに、FilePathにあるCSVファイルを取り込みます。
CSVにはヘッダー情報があることが前提です。
なお、ヘッダー情報と取込み先のテーブルのヘッダー情報が一致したものにデータが追加されます。
1 2 3 4 5 6 7 8 9 |
Private Sub CSV取込み1_Click() Dim FilePath As String FilePath = "C:\Users\CVS取込み\サンプル1.csv" '//ヘッダー情報のあるCSVの取込み方法' '「サンプル1」テーブルに、FilePathのCSVを取り込む' DoCmd.TransferText acImportDelim, , "サンプル1", FilePath, True '//Trueはヘッダーありとして読み込む' End Sub |
以下はCSVファイルのサンプルです。1行目をヘッダー情報として取り扱います。
2.CSVにヘッダー情報がない場合
ここでは上記と同じく、「サンプル1」テーブルに、FilePathにあるCSVファイルを取り込みますが、このCSVにはヘッダー情報がありません。
ひとまず取り込むためのコードは以下のようになります。
1 2 3 4 5 6 7 8 9 |
Private Sub CSV取込み2_Click() Dim FilePath As String FilePath = "C:\Users\サンプル2_ヘッダーなし.csv" '//ヘッダー情報のないCSVの取込み方法' '「サンプル1」テーブルに、FilePathのCSVを取り込む、インポート定義は事前に作った「インポート定義_サンプル2」' DoCmd.TransferText acImportDelim, "インポート定義_サンプル2", "サンプル1", FilePath, False '//Falseはヘッダーなしとして読み込む' End Sub |
しかし「インポート定義」を設定していない場合、「ヘッダー情報がない状態」でCSVを取り込もうとすると、以下のようなエラーが出てしまいます。
これはヘッダー情報がないため、Accessが自動で割り振った「F1」として一つ目のヘッダーを読み込んだけれど、取込み先のテーブルには「F1」カラムがないのでエラーとなります。
なお、テーブルのカラム名に「F1」を作っておくと取込みは可能です。
この状況を解消するために、「インポート定義」を利用します。
「インポート定義」の作り方を次で説明します。
◆インポート定義の作り方
インポート定義は以下の手順で作成します。
- 「外部データ」タブの「インポートとリンク」の「テキストファイル」をクリックする。
- ウィザードに沿って進めていき、その途中でインポート定義を作成します。
- ウィザードを開く
- 「参照」ボタンを押して、取り込みたいCSVを選択する。
- テキストインポートウィザードが出てくるので、左下の「設定」ボタンをクリックする。
- 開いた画面を確認し、「保存」ボタンを押す。
- インポート定義を使う
Accessのタブの「外部データ」の「インポートとリンク」の「テキストファイル」をクリックする。
次に「レコードのコピーを次のテーブルに追加する」にチェックを入れて、取り込みたいテーブルを選択し、「OK」を押す。
インポート定義名を指定するところが出てくるので、任意の名称にして「OK」を押す。
※インポート定義名は忘れないようにメモしておく。忘れた場合、ウィザードをまた開いて、「保存」ではなく、「定義」ボタンを押すと確認できる。
これでインポート定義は作成されました。
この後は「次へ」を押して、ひとまずこのウィザードを終了させます。
もし取込みが失敗していたら、再度ウィザードを開いて、インポート定義を見直してください。
これでインポート定義ができたので「TransferText メソッド」でインポート定義を使うことが可能になります。
以下、上述のコードと同じものですが、7行目で作成したインポート定義を使っています。
1 2 3 4 5 6 7 8 9 |
Private Sub CSV取込み2_Click() Dim FilePath As String FilePath = "C:\Users\サンプル2_ヘッダーなし.csv" '//ヘッダー情報のないCSVの取込み方法' '「サンプル1」テーブルに、FilePathのCSVを取り込む、インポート定義は事前に作った「インポート定義_サンプル2」' DoCmd.TransferText acImportDelim, "インポート定義_サンプル2", "サンプル1", FilePath, False '//Falseはヘッダーなしとして読み込む' End Sub |