Accessで同じ形式のCSVを繰り返し取り込むなら、マクロの「テキスト変換」アクションにまとめ、フォームのボタンから実行できるようにしておくと便利です。毎回ウィザードを開く手間がなくなり、取り込みの条件も毎回同じになります。
この記事では、次の内容を順に説明します。
- インポート定義の作り方
- マクロの引数の設定
- ボタンへの割り当て
- 取り込み後の確認(既存テーブルに行が重複して追加されていないか、件数が合っているか)
Accessのバージョンや表示言語によって、ボタン名や引数名が少し違う場合があります。手元の画面の表記に読み替えてください。
全体の流れ
- CSVをウィザードで一度取り込み、インポート定義を保存する
- 取り込み先テーブルの扱い(毎回空にするか、追加していくか)を決める
- マクロに「テキスト変換」アクションを置き、引数を設定する
- フォームにボタンを置き、クリックしたときにマクロが動くようにする
- 取り込み前後の件数を確認する
手順1:インポート定義を保存する
マクロの「定義名」には、テキストインポートウィザードで保存したインポート定義を指定します。区切り文字、文字コード(コードページ)、列ごとのデータ型などをここで決めておけば、マクロから実行しても毎回同じ条件で取り込めます。
- 「外部データ」タブから、テキストファイルのインポートを開く(「新しいデータソース」→「ファイルから」→「テキストファイル」など)
- 取り込むCSVを選び、ウィザードを進める
- ウィザードの途中にある「詳細設定」ボタンを押す
- 次の項目を確認・設定する
- ファイル形式:区切り記号付き
- フィールドの区切り記号:カンマ
- 文字列の引用符:ダブルクォーテーション
- コードページ:CSVの文字コードに合わせる(Shift_JISのCSVなら日本語、UTF-8のCSVならUTF-8を選ぶ)
- 各フィールドのデータ型:先頭に0がある顧客コードなどは、0が消えないよう短いテキストにする
- 見出し行の有無:CSVの1行目が列名かどうかに合わせる
- 「保存」を押し、分かりやすい名前(例:売上CSV取込定義)を付けて保存する
- ウィザードを最後まで進めて一度取り込み、結果を確認する
「インポート操作の保存」とは別のもの
ウィザードの最後に出てくる「インポート操作の保存」は、操作全体を保存して「保存済みのインポート操作」から再実行するための機能です。マクロの「定義名」に指定するのは、手順3〜5の「詳細設定」で保存した定義のほうです。名前を付けて保存したはずなのにマクロで選べないときは、「インポート操作の保存」のほうを保存していないか確認してください。
保存したインポート定義の一覧は、「詳細設定」画面の「定義」ボタンから確認できます。
手順2:取り込み先テーブルの扱いを決める
テキスト変換でインポートすると、指定したテーブルは次のように扱われます。
- まだ存在しない場合:新しく作られる
- すでに存在する場合:今あるレコードの後ろに追加される
つまり、ボタンを2回押すと同じデータが2回入ります。運用を次のどちらかに決めておきます。
| 運用 | 向いている場面 | 準備 |
|---|---|---|
| 毎回空にしてから取り込む | 毎月、全件のCSVで入れ替える | 取込用テーブルを空にする削除クエリを用意する |
| 追加していく | 日ごとの差分CSVを積み上げる | 同じファイルを二重に取り込んでいないかの確認方法を決める |
おすすめは、本番のテーブルに直接入れない方法です。まず取込用の作業テーブル(例:T_売上取込)に入れて中身を確認し、問題がなければ追加クエリで本番のテーブルへ移します。取り込みに失敗しても、本番のデータを汚さずに済みます。
作業テーブルを毎回空にする場合は、「T_売上取込」の全レコードを削除する削除クエリ(例:Q_取込テーブル削除)を作っておき、マクロの中でテキスト変換より先に実行します。
手順3:マクロを作る
「作成」タブの「マクロ」で新しいマクロを開き、アクションを追加します。
作業テーブルを空にする(毎回空にする運用の場合)
- アクション:クエリを開く
- クエリ名:Q_取込テーブル削除
削除クエリを実行すると、削除してよいかを確認するメッセージが出ます。このメッセージを出さずに実行するためのアクション(メッセージの設定など)は、マクロデザイナーで「すべてのアクションを表示」をオンにしないと一覧に出ないことがあります。確認メッセージを消すと誤操作に気付きにくくなるので、慣れるまでは表示させたままでも構いません。
テキスト変換アクションの引数
「テキスト変換」アクションを追加し、引数を次のように設定します。
| 引数 | 設定例 | ポイント |
|---|---|---|
| 変換の種類 | 区切り記号付きのインポート | エクスポートや固定長を選ばない(表記は画面で確認) |
| 定義名 | 売上CSV取込定義 | 手順1で保存した名前 |
| テーブル名 | T_売上取込 | すでにあれば追加、なければ新しく作られる |
| ファイル名 | C:\取込\uriage.csv | 拡張子まで含めたフルパス |
| フィールド名を含む | はい | CSVの1行目が見出しなら「はい」 |
| HTMLテーブル名 | 空欄 | CSVでは使わない |
| コード ページ | 空欄、またはインポート定義と同じ | インポート定義で決めた文字コードと食い違わないようにする |
ファイルパスの決め方
- 毎回同じ場所に同じ名前でCSVを置く運用(例:C:\取込\uriage.csv に上書き保存する)にすると、マクロを直さずに済みます
- ネットワーク上の共有フォルダを指定するときは、ドライブ文字の割り当てが人によって違うことがあります。使う人全員のパソコンで同じパスで開けるか確認してください
- 日付入りなど毎回違うファイル名で取り込みたい場合、マクロに固定で書いたパスでは対応しにくいため、VBAで組む方法が向いています
設定が終わったら、マクロに名前(例:M_売上CSV取込)を付けて保存します。ボタンを作る前に、まずマクロを直接実行して取り込めるか確かめてください。
手順4:ボタンから実行する
- 取り込み用のフォームをデザインビューで開く
- 「フォームデザイン」タブのコントロールから「ボタン」を置く(ウィザードが起動したらキャンセルしてよい)
- ボタンを選んだ状態でプロパティシートを開き、「イベント」タブの「クリック時」で M_売上CSV取込 を選ぶ
- 「書式」タブの「標題」に、ボタンに表示する文字(例:売上CSVを取り込む)を入れる
- フォームビューに切り替え、ボタンを押して動作を確認する
「クリック時」の「…」ボタンからマクロビルダーを選ぶと、フォームの中にマクロを埋め込むこともできます。同じ取り込みを複数のフォームから呼ぶなら独立したマクロに、そのボタンでしか使わないなら埋め込みマクロに、と分けておくと管理しやすくなります。
ファイルを開いたときに「コンテンツの有効化」などのセキュリティの警告が出ている状態では、マクロのアクションが実行されないことがあります。ボタンを押しても動かないときは、警告バーが出ていないか、ファイルを信頼できる場所に置く設定になっているかを確認してください。
手順5:件数を確認する
エラーが出なかったからといって、正しく取り込めたとは限りません。件数で確かめます。
確認する3つの数字
| 確認する数 | 調べ方 |
|---|---|
| CSVのデータ件数 | CSVの行数から見出しの1行を引く(テキストエディタの行番号や、Excelで開いて確認) |
| 取り込み前のテーブル件数 | テーブルを開き、画面下のレコード移動ボタンの横に出る総件数を見る |
| 取り込み後のテーブル件数 | 同上 |
- 毎回空にする運用の場合:取り込み後の件数 = CSVのデータ件数
- 追加していく運用の場合:取り込み後の件数 − 取り込み前の件数 = CSVのデータ件数
毎回確認するなら、テーブルのレコード数を数えるだけの集計クエリを作っておくと手早く確認できます。
件数が合わないときの確認順
- 件数が倍になっている:同じCSVを2回取り込んでいないか。空にするクエリがテキスト変換より前で実行されているか
- 1件多い:見出し行がデータとして入っていないか(「フィールド名を含む」が「いいえ」になっていないか)
- 1件少ない:見出しのないCSVなのに「フィールド名を含む」を「はい」にしていないか
- 数件少ない、または空欄がある:「テーブル名_インポート エラー」のような名前のテーブルができていないか。できていれば、どの行のどの列で型が合わなかったかが記録されています
- CSVの行数より多い、または列がずれる:項目の中にカンマや改行を含むのに、引用符で囲まれていない行がないか。また、CSVにセル内改行があると、テキストエディタで数えた行数とデータ件数が一致しなくなります
- 文字化けしている:インポート定義のコードページが、CSVの文字コードと合っているか
インポートエラーのテーブルは自動では消えません。確認が終わったら削除しておくと、次に取り込んだときのエラーと混ざらずに済みます。
運用前のチェックリスト
- インポート定義を「詳細設定」から保存し、マクロの定義名で選べる
- 取り込み先を作業テーブルにした(または、追加される前提で運用を決めた)
- 空にするクエリが、テキスト変換より前にある
- ファイルパスが、使う人全員のパソコンで同じように開ける
- 「フィールド名を含む」が、CSVの見出しの有無と合っている
- 取り込み前後の件数を確認する手順を決めた
- インポートエラーのテーブルができていないか、毎回確認する
