みんなの「教えて(疑問・質問)」にみんなで「答える」Q&Aコミュニティ

こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

(ACCESS)複数mdbからのデータ取得方法

よろしくお願いします。
ACCESSはあまり使ったことがない者です。
下記ようなACCESSのデータ取得の方法を教えてください。

構造の同じテーブルを持つ複数のmdbから、1つのリストを作りたいと考えています。
各mdbの違いは、ファイル名と中身のデータのみで、他は全く同じです(ひとつのテンプレートの複製です)。

A部門.mdb (商品リストテーブル ・・・A部門の商品リスト)
B部門.mdb (商品リストテーブル ・・・B部門の商品リスト)

Z部門.mdb (商品リストテーブル ・・・Z部門の商品リスト)

全商品リスト.csv (全社分の商品リストテーブルのデータ)

mdbが数十ファイルあるので、一つずつcsv取得して繋げるのはたいへんです・・・。
何か一発で取得できるような方法はないでしょうか?
ユニオンクエリ?等を使うとできるのでしょうか・・・。
同じフォルダ下にあるmdbを次々に開いて同じクエリを実行する機能とか、マクロとか?

現状こうなってしまっており、一つのmdbに統合するのは、運用上制約があって無理なのです。

何かうまいアイデアがあれば教えていただきたくお願いします。

投稿日時 - 2012-07-09 23:36:37

QNo.7581632

困ってます

質問者が選んだベストアンサー

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
しています。参考に。

わからないところがあれば補足してください。

投稿日時 - 2012-07-11 01:24:07

お礼

ありがとうございます!

まさに自分がやりたかったことができました!

記載していただいたコードをほとんどそのまま流用させていただき、
フォルダ下の全てのmdbファイルからSQLを使って、一発で全データを引き抜くことができました。

とても助かりました。
本当にありがとうございました。

投稿日時 - 2012-07-13 11:24:55

このQ&Aは役に立ちましたか?

1人が「このQ&Aが役に立った」と投票しています

回答(2)

ANo.1

ユニオンクエリで処理する場合は
適当な(新規)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で自動化も出来ますが、初心者のようですので割愛します。

投稿日時 - 2012-07-10 12:28:19

お礼

回答ありがとうございます!
両案とも、3ファイルで試してみました。

テーブルリンクは、一度は全てのmdb内の必要テーブルに対して手でリンクを設定する必要があるのですね・・・。
最初はたいへんですが二度目以降は、ファイルの置き場所を変更しない限りクエリの実行だけで大丈夫ですね。
(しかし80~100mdbくらいあるので、unionしたSQLが固まったりしないでちゃんと実行されるかACCESSの能力的にやや不安です・・・)

1回だけの作業なら、手でリンク設定するより開いてクエリを実行して最後にくっつける別案の方が、
作業量もミスの可能性も確かに少なそうです。
ただルーチン作業ではないですが、1回集計して完了できるかどうか微妙な作業なので、悩みどころです・・・。

よろしければVBAを使った方法も教えていただけないでしょうか。
ACCESSは初心者ですが、ExcelではVBAをかなり使っていたので、ある程度理解できると思います。

投稿日時 - 2012-07-10 23:09:33

あなたにオススメの質問