アクセスVBAでエクセルやCSVをインポートするには

アクセス担当のまみです。

毎回エクセルやCSVのフォーマットが決まっているデータの取り込みを手動でやっていたりしませんか?

せっかくデータを取り込んだのに、ファイルを削除し忘れていて、同じデータを取り込んじゃったりとか・・・

重複したデータを正常な状態に戻すのってとっても苦労しますね・・・

何かいい方法ないのかなぁなんて思って。

 

実は、ボタン1つでデータをインポートしてくれて、データを取り込んだらファイルを削除してくれる。そんな機能をVBAのコードを書くことで、可能になります!

今回はインポートの方法をご紹介しますね。

 

Contents

ファイルを準備しよう

 

まずはファイル名「インポート」で新規にファイルを作成しましょう。

 

アクセスの使い方!ファイルを開く方法と保存の仕方

2018年9月1日

 

テーブル1は使用しないので削除しておきましょう。

 

①「作成」タブから②「フォームデザイン」を選択し、表示されたフォームに③ボタンを4つ配置します。

 

アクセスVBAでフォームにボタンを配置しよう

2018年9月18日

 

デザインはお任せしますので、名前と標題を下記のとおりそろえておきましょう。

 

1つ目のボタンのプロパティーシート

名前 btnエクセル
標題 エクセルをインポート

 

2つ目のボタンのプロパティーシート

名前 btn先頭
標題 先頭行を項目名に

 

3つ目のボタンのプロパティーシート

名前 btnCSV
標題 CSVをインポート

 

4つ目のボタンのプロパティーシート

名前 btn削除
標題 ファイルを削除

 

それから、インポート用のエクセルとCSVを用意しましょう。

私は下記の記事で作成した「住所録」ファイルからエクスポートしました。

 

アクセスVBAテーブルとクエリをエクスポートしよう!

2018年10月17日

 

エクセルをインポート

 

ではさっそく「btnエクセル」からコードを追加していきましょう。

(はてな君)
コードを書く位置ならわかるよ!クリック時のとこでしょ!

 

①「btnエクセル」を選択した状態で、②「イベント」タブからクリック時に「イベントプロシージャ」を選択してコードの画面を表示しましょう。

「Private Sub btnエクセル_Click()」と「End Sub」の間に下記のコードを追加します。

    DoCmd.TransferSpreadsheet acImportDelim, 10, "T_住所録", "D:¥住所録.xlsx"
    MsgBox "インポートしました"

 

インポートする時にはacImportDelimを使用します。

テーブル名を「T_住所録」にしているので、「T_住所録」テーブルがない場合は新たに作成され、「T_住所録」テーブルがある場合には「T_住所録」テーブルにインポートされます。

“D:¥住所録.xlsx”の部分で、インポートするファイルの場所とファイル名を指定してるので、環境に合わせて変更してくださいね!

それでは、フォームビューで動作確認してみましょう。

(はてな君)
「T_住所録」テーブルがインポートされた!けどフィールド名が変だし?

 

 

(あいちゃん)
そうなんです。このコードだと先頭行がデータとして取り込まれ、フィールド名がないF1、F2のような形になります。

 

このコードは、先頭行のないデータを取り込む時ってことになりますね。(下の様なデータ)

 

 

(はてな君)
なるほど~

 

範囲を指定してインポートする

 

(あいちゃん)
先頭行の無いデータだと、範囲を指定してインポートもできるんだよ!

 

(はてな君)
どうやるの?

 

(あいちゃん)
じゃあさっきのエクセルファイルをA9から取り込んでみようか。さっき取り込んだデータは削除するか名前を変更しておいてね。

 

    DoCmd.TransferSpreadsheet acImportDelim, 10, "T_住所録", "D:¥住所録.xlsx", False, "T_住所録$A9:H"
    MsgBox "インポートしました"

 

 

(はてな君)
へぇ範囲指定できるんだね。
[quads id=2]

先頭行を項目名としてインポートする

 

それでは、先頭行を項目名としてインポートするように「btn先頭」に設定してみましょう。

その前に、先程取り込んだ「T_住所録」は削除か名前を変更しておいてくださいね。

 

(はてな君)
「btn先頭」のクリック時のコードの画面を表示したらいいんだね!

 

(あいちゃん)
イベントプロシージャを選択するのを忘れないでね!

 

では「Private Sub btn先頭_Click()」と「End Sub」の間に下記のコードを追加しましょう。

 

    DoCmd.TransferSpreadsheet acImportDelim, 10, "T_住所録", "D:¥住所録.xlsx", True, ""
    MsgBox "インポートしました"

 

先ほどのコードに「, True, “”」を付け加えることで先頭行を項目名としてインポートしてくれます。「, “”」は省略可能です。

それでは、フォームビューで動作確認してみましょう。

 

(はてな君)
今度はちゃんと取り込まれた~!

 

 

CSVをインポート

 

それでは次に、CSVをインポートできるように「btnCSV」に設定してみましょう。

(はてな君)
「btnCSV」のクリック時に「イベントプロシージャ」を選択してコードの画面を表示させたよ!

では、下記のコードを「Private Sub btnCSV_Click()」と「End Sub」の間に追加しましょう。

    DoCmd.TransferText acImportDelim, , "T_住所録", "D:¥住所録.csv", True, ""
    MsgBox "インポートしました"

 

エクセルの時はTransferSpreadsheetだったところがCSVになるとTransferTextになります。

 

, True, “”」をつけているので、先頭行のあるタイプの取り込みですね。

 

(はてな君)
エクセルの取り込みの時に「10」ってあるけど?

 

(あいちゃん)
「10」ってエクセルのバージョンのことで「acSpreadsheetTypeExcel12Xml」って書いてもいいんだよ。CSVには必要ないんだ。

 

関連記事
 
 

インポートしたらファイルを削除する

 

(あいちゃん)
データを取り込んだらファイル削除するようにってコードを書くんだけど、エクセルとCSVとどっちのファイルにする?

 

(はてな君)
えっと~。じゃあCSVで!

 

それでは、「btn削除」ボタンのクリック時に「イベントプロシージャ」を選択してコードの画面を表示しましょう。

 

「Private Sub btn削除_Click()」と「End Sub」の間に下記のコードを追加します。

 

    DoCmd.TransferText acImportDelim, , "T_住所録", "D:¥住所録.csv", True, ""
    MsgBox "インポートしました"
    Kill "D:¥住所録.csv"

 

 

先ほどのCSVを取り込むコードの後に、「Kill “D:¥住所録.csv”」を加えてあげればいいんです。

 

これで、データをインポートしたらファイルが削除されます。

必要なデータでしたらバックアップを取っておいてくださいね!

 

(はてな君)
動作確認してみたよ!ファイルが削除されてびっくりした!

 

※アクセス制限の関係でインポートはできても、ファイルの削除ができない場合があります。 

 

フォームには「F_インポート」と名前をつけておきましょう。

まとめ

 

インポートについて理解が深まったかと思います。

ボタン1つでインポートできるようになると、他のことに時間が使えるようになりますね。

 

 

スポンサーリンク