- ベストアンサー
ACCESS複数mdbからのデータ取得方法
- ACCESSを使用したデータ取得方法を教えてください。複数のmdbファイルから同じテーブルを持つリストを作成したい場合、一つずつcsvで取得するのは手間がかかります。ユニオンクエリやマクロを使用して一括で取得する方法はありますか?
- 複数のmdbファイルから同じテーブルを持つリストを作成する方法について教えてください。たくさんのmdbファイルがあるため、一つずつcsvで取得するのは大変です。ユニオンクエリやマクロを使って一括で取得する方法はありますか?
- ACCESSで複数のmdbファイルからデータを取得する方法を教えてください。同じテーブルを持つmdbファイルから一つのリストを作成したい場合、一つずつcsvで取得するのは手間がかかります。ユニオンクエリやマクロを使用して一括で取得できる方法はありますか?
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
VBAによる処理ですが。 データの取り出しで、配列を使ったり、SQL文でレコードを 取り出したりすることもありますが、一応ノーマルにしておきます。 前提として、mdbファイルが一つのフォルダにあるものとします。 新しいmdbファイルを同じフォルダに作り、名前を 「司令塔.mdb」 とします。一応、「商品リストテーブル」の構造は、 商品ID、商品名、価格、サイズ のようしておきます。違うようでしたら補足してください。 分かりやすいように「司令塔.mdb」にフォームを作り、 それにボタンを設定し、そのクリックイベントに以下を 設定します。ボタンの名前などは適当にしています。 標準モジュールでボタンクリックの中身を実行しても 同じではありますが。 設定が終わったらコード表のツールから参照設定を 選択して、Microsoft DAO xx Object Library に チェックを入れてOKとしてください。xxは3.6のような 数字です。 Private Sub コマンド1_Click() If MsgBox("データをCSVへ移します。よろしいですか", vbYesNo) = vbNo Then Exit Sub Dim db As DAO.Database Dim rs As DAO.Recordset Dim strFile As String 'mdbファイルの検索用 strFile = Dir(CurrentProject.Path & "\" & "*.mdb", vbNormal) 'CSVファイルのオープン、なければ作成 Open CurrentProject.Path & "\" & "全商品リスト.csv" For Append Access Write As #1 'CSVファイルへの書き込み作業 Do While strFile <> "" If strFile <> "司令塔.mdb" Then Set db = DBEngine.Workspaces(0).OpenDatabase(CurrentProject.Path & "\" & strFile) Set rs = db.OpenRecordset("商品リストテーブル") 'テーブルからデータを取り出しCSVへ If rs.RecordCount > 0 Then rs.MoveFirst Do Until rs.EOF Print #1, rs!商品ID & "," & rs!商品名 & "," & rs!価格 & "," & rs!サイズ & "," rs.MoveNext Loop End If rs.Close: Set rs = Nothing db.Close: Set db = Nothing End If strFile = Dir() Loop Close #1 MsgBox ("データの移動が終了しました") End Sub なお、"全商品リスト.csv"がすでに存在している場合の 処理はしていません。その処理が必要ならば以下に http://okwave.jp/qa/q7324183.html しています。参考に。 わからないところがあれば補足してください。
その他の回答 (1)
- nicotinism
- ベストアンサー率70% (1019/1452)
ユニオンクエリで処理する場合は 適当な(新規)MDBにA~Zmdbの商品リストテーブルをリンクテーブルします。 クエリをSQLビューで開いて select * from 商品リストテーブルA union all select * from 商品リストテーブルB union all ・・・・中略・・・・・・・ union all select * from 商品リストテーブルZ とSQL文を記述します。 これをデータシートビューに切り替えれば確認できます。 後はクエリを保存してからCSVファイルに出力。 別案 もし、そのフォルダにCSVファイルが既に存在したとして。 個々のMDBファイルを開いてCSV出力します。 フィールド名は付けないようにします。 その際に全てのファイル名の先頭に適当な文字を付けます。 例 TTTA商品リスト、TTTB商品リスト・・ 全て出力したらコマンドプロンプトで type C:\○○\△△\TTT*.csv >> C:\○○\△△\All.csv とすれば結合されたAll.CSVファイルが出来上がります。 別案の方が作業時間は早いと思いますが 毎月行う必要があるならユニオンクエリなら一度設定すれば使い回しが出来ますので 用途に応じて使い分けてください。 VBAで自動化も出来ますが、初心者のようですので割愛します。
お礼
回答ありがとうございます! 両案とも、3ファイルで試してみました。 テーブルリンクは、一度は全てのmdb内の必要テーブルに対して手でリンクを設定する必要があるのですね・・・。 最初はたいへんですが二度目以降は、ファイルの置き場所を変更しない限りクエリの実行だけで大丈夫ですね。 (しかし80~100mdbくらいあるので、unionしたSQLが固まったりしないでちゃんと実行されるかACCESSの能力的にやや不安です・・・) 1回だけの作業なら、手でリンク設定するより開いてクエリを実行して最後にくっつける別案の方が、 作業量もミスの可能性も確かに少なそうです。 ただルーチン作業ではないですが、1回集計して完了できるかどうか微妙な作業なので、悩みどころです・・・。 よろしければVBAを使った方法も教えていただけないでしょうか。 ACCESSは初心者ですが、ExcelではVBAをかなり使っていたので、ある程度理解できると思います。
お礼
ありがとうございます! まさに自分がやりたかったことができました! 記載していただいたコードをほとんどそのまま流用させていただき、 フォルダ下の全てのmdbファイルからSQLを使って、一発で全データを引き抜くことができました。 とても助かりました。 本当にありがとうございました。