Access クエリを実行してマクロでデータをエクスポートする方法

このQ&Aのポイント
  • WindowsXP、Access2010の環境で、以下のような作業をマクロで自動化したいと考えています。出身地が「東京都」のレコードのみを抽出して、「東京都.xls」というファイル名でエクスポートし、出身地が「神奈川」のレコードのみを抽出して、「神奈川.xls」というファイル名でエクスポートします。
  • マクロを設定するためには、以下の手順を実行します。
  • まず、出身地が「東京都」のレコードのみを抽出するクエリを作成します。次に、そのクエリを実行して結果をエクスポートします。同様に、出身地が「神奈川」のレコードのみを抽出するクエリを作成し、実行して結果をエクスポートします。以上の手順をマクロに記述すれば、自動化が実現できます。
回答を見る
  • ベストアンサー

Access クエリを実行して出力するマクロ

環境 WindowsXP、Access2010 質問 以下のような作業をマクロで自動化したいと考えています。 マクロをどのように設定すればよろしいでしょうか? お手数かけて恐れ入りますがご教示いただければ幸いです。 ■使用するテーブル ID|名前|出身地 -------------- 1|大田|東京都 2|川崎|神奈川 3|足立|東京都 ■自動化したい手順 1. 出身地が"東京都"のレコードのみを抽出する 2. ↑のデータを 東京都.xls のファイル名でエクスポート 3. 出身地が"神奈川"のレコードのみを抽出する 4. ↑のデータを 神奈川.xls のファイル名でエクスポート 5. 終わり ■東京都.xls のエクスポート結果 ID|名前|出身地 -------------- 1|大田|東京都 3|足立|東京都 ■神奈川.xls のエクスポート結果 ID|名前|出身地 -------------- 2|川崎|神奈川 ■補足 ・出身地ごとにクエリを作成すれば同様の事が実現できますが、  それだと、作成するクエリ数が多くなるので、できれば避けたいです。 ・VBAの知識はほとんどありませんが、  教えていただければ自分で調べながら試してみます。 なにとぞよろしくお願いいたします。

  • ikdx
  • お礼率72% (8/11)

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

  • ベストアンサー
  • mitarashi
  • ベストアンサー率59% (574/965)
回答No.5

#1~3です。 db.QueryDefs.Delete "Q_temp"は書き出し都度実行していますので、正常終了すれば残らない筈です。 ご指摘の内容は、当方では再現されません。何かエラーが出ていないでしょうか。 標準モジュールにおいて実行しても良いですし、フォームから使用されるなら、フォームモジュールに置いても動くと思います。 マクロから標準モジュールのプロシージャを実行するには、Sub ではダメでFunctionにする必要があります。普通Functionは戻り値を戻しますが、今回の例では単純にSub→Functionに書き換えるだけで良いと思います。 マクロのアクションにプロシージャの実行を選択し、プロシージャ名として、test()と、括弧もつけて設定します。 以上、ご参考まで。

ikdx
質問者

お礼

たびたびありがとうございます! エラーは、実行失敗したときのQ_tempがそのまま残ってしまっていたのが原因でした。 ナビゲーションウィンドウからQ_tempを手動で消したら直りました。 お騒がせしました。 丁寧に説明していただいたおかげで、マクロから実行させることができました。 とても助かりました!

その他の回答 (4)

  • layy
  • ベストアンサー率23% (292/1222)
回答No.4

マクロにしてモジュール形式で保存するとVBAになります。 マクロではプロシージャ実行にします。 クエリはSQL記述にしてVBA側でそのSQLを実行させることと同意です。 VBA側なら条件は変数化できるので、一部違うだけの複数のクエリでもSQL文は使い回しできます。 こんなところを調べて VBAでそのクエリのSQLを実行させることを考えたらいいでしょう。

ikdx
質問者

お礼

お礼が遅れまして申し訳ございません。 ご回答を参考にさせていただきながら、 しばらく試行錯誤してみます。 ありがとうございました!

  • mitarashi
  • ベストアンサー率59% (574/965)
回答No.3

#1,#2です。また出てくる羽目になりました。 確認不足で申し訳ありませんが、ご質問に、xls形式と書いてありますね。 その場合は、下記の通り変更してください。 destFileName = "C:\" & RS(0) & ".xls" If Dir(destFileName) <> "" Then Kill destFileName DoCmd.TransferSpreadsheet acExport, acSpreadsheetTypeExcel9, "Q_temp", destFileName, True, "" acSpreadsheetTypeExcel9のところは、DoCmdのところから打ち込むと、多数のバージョンに対応した候補が表示されますので、お好きなものを選択してください。当方で常用しているExcel2000だと、8に相当します。

ikdx
質問者

お礼

mitarashiさん ありがとうございます! ひとまずやりたい事にだいぶ近づくことができました。 重ねて質問させていただきたいのですが・・・ ・再実行するとエラー3012が出てしまいます。  修正方法としては↓のように書けばいいのでしょうか?  DoCmd.DeleteObject acQuery, "Q_temp" ・こちらのコードは標準モジュールで書けばいいのですか?  それともクラスモジュールに書けばいいのでしょうか? ・マクロから呼び出して実行させたいのですが、  いろいろ試してみましたがうまくいきません。  どのように設定すればよろしいでしょうか? お手数かけてしまい申し訳ありませんが ご指導いただけますとたいへん助かります。 なにとぞよろしくお願いいたします。

  • mitarashi
  • ベストアンサー率59% (574/965)
回答No.2

#1です。Access2010でやってみました。(こんな機会がないと使わないもので) 前回より、少し改良してあります。 Table2は、実際のテーブル名に変更してください。ご参考まで。 Sub test() Dim db As DAO.Database Dim qdf As QueryDef Dim RS As DAO.Recordset Dim mySQL As String, destFileName As String '重複しない出身地リストを作成 Set db = CurrentDb mySQL = "SELECT DISTINCT 出身地 FROM Table2;" '会社名リストの各レコードについて処理 Set RS = db.OpenRecordset(mySQL) RS.MoveFirst Do Until RS.EOF mySQL = "SELECT * FROM Table2 WHERE 出身地='" & RS(0) & "';" 'テンポラリクエリを作成 Set qdf = db.CreateQueryDef("Q_temp", mySQL) DoCmd.SetWarnings False '出力先エクセルファイルがすでに存在していれば削除 destFileName = "C:\" & RS(0) & ".xlsx" If Dir(destFileName) <> "" Then Kill destFileName DoCmd.TransferSpreadsheet acExport, acSpreadsheetTypeExcel12Xml, "Q_temp", destFileName, True, "" db.QueryDefs.Delete "Q_temp" DoCmd.SetWarnings True Set qdf = Nothing RS.MoveNext Loop RS.Clone Set RS = Nothing db.Close: Set db = Nothing End Sub

  • mitarashi
  • ベストアンサー率59% (574/965)
回答No.1

よく似た案件に回答しております。ご参考まで。 http://okwave.jp/qa/q6043020.html

関連するQ&A

  • Accessクエリ

    お世話になります。 Access初学者です。 グループごとに日付が最大のレコードを、それぞれ1件抽出するクエリを作成したいと思っています。 IDを表示させなければできるのですが、IDを表示させると全レコードが抽出されます。どのようにすればいいのでしょうか? よろしくお願いします。

  • DataTableのselectメソッド

    C#を使用して、DataTableのselectメソッドで複数のフィールドに対して、特定の文字を含まないフィールドを抽出する事はできるでしょうか? ID 名前  住所   出身地 1 前田  東京都  大阪府 2 山田  石川県  三重県 3 藤川  東京都  東京都 4 大野  大阪府  石川県 上記のテーブルで、名前、住所、出身地に「川」が含まない1のレコードのみ抽出するようなイメージです。 よろしくお願いします。

  • アクセスのクエリで重複しているデータについて

    テーブルの一部分のフィールドを使ってクエリAを作成しています。 [クエリA] 番号 氏名  郵便番号 住所     電話番号 子供 1  田中守  111-0000 東京都・・・ 000-0000 章 2  佐藤健  122-0001 神奈川県・・・ 001-0001 花子 3  田中守  111-0000 東京都・・・ 000-0000 陽子 これを重複しているデータを省くのですが、[子供]の名前はすべて取り出したいと思っています。 どの様にすれば良いか教えて頂けないでしょうか? 氏名  郵便番号 住所     電話番号 子供 田中守  111-0000 東京都・・・ 000-0000 章,陽子 佐藤健  122-0001 神奈川県・・・ 001-0001 花子 最終的には、宛名印刷を行った時に、子供の名前も連名で表示したいと思っての事です。 現在、クエリで行っておりますが、クエリでなくても構いません。 足りない情報はすぐに補足致しますので、お手数ですが、どうぞよろしくお願い致します。 Access2003を使用しております。

  • アクセスVBA テーブル名を変数とするクエリ実行・エクスポート

    テーブル X(フィールド1~30)を対象とするクエリ Yがあります。 クエリ Yは、フィールド1の値が BBBであるレコードの、フィールド3、5、7を抽出します。 クエリ Yの実行結果をエクセルファイル Zにエクスポートします。 Xと同一の構成である X1~X10という複数のテーブルから一つを選択して、クエリYを実行し て、エクセルファイル Zにエクスポートしたいのですが、VBAでは、どのように記述するのでしょうか? フォーム Fのテキストボックス Tに入力して、テーブルを指定(変数)したいのです。 上記が可能な場合、続けて Zにエクスポートすることはできるのでしょうか? エクスポート用のテーブルを一時的に作成しなければならないのでしょうか? 説明下手で申し訳ございません。お手数ですが、ご教示ください。よろしくお願いします。

  • Accessのクエリの抽出条件で・・・

    Accessのクエリの抽出条件で、例えば住所フィールドがあってそこから、「東京都と大阪府と福岡県」以外を抽出してくる、と言ったような場合はどのように入力すればいいのでしょうか?「<>」や「Not」を用いてand関数も用いてるのですがうまくいきません。入力の仕方が間違っているのでしょうか?またそれをパラメータクエリで行えるように設定したい場合はどのようにすればいいのでしょうか?お教え下さい。よろしくお願い致します。

  • Access のパラメータクエリについて

    お世話になります。 Accessでクエリを作成する練習をしています。 住所フィールドを含むクエリを基にして、住所フィールドにパラメータを設定するクエリを作成しています。 住所フィールドには、東京都で始まる住所、千葉県で始まる住所そして埼玉県で始まる住所が多数入力されています。 「パラメータの入力」ダイアログボックスに、ワイルドカードを使用して“東京都*”と入力して、クエリを実行すると1件も抽出できません。 パラメータには、ワイルドカードを使用できないのでしょうか。 または、他に理由があるのでしょうか。 よろしくお願いします。 OS: Windows 7  Office:2010

  • アクセス クエリでの抽出で

    所属CD 契約NO   氏名  住所  01   001   佐藤  東京  02   002   山田  埼玉  03   003   鈴木  神奈川  01   004   新藤  新潟 上記のようなデータをクエリで所属CD毎に抽出したいのですが 抽出条件に所属CDをそれぞれ入力し個々に抽出するのではない方法で 所属CD別で抽出したいのですが何かありますでしょうか。

  • Access2013 住所録の都道府県を削除

    Access2013 フィールド(短いテキスト)に住所を「東京都大田区糀谷」や「神奈川県横浜市港南区」などと入力してある住所録があります。 これから、都道府県の表示を削除するクエリを教えて下さい。 宜しくお願いします。

  • Access重複クエリに関するご質問

    Access重複クエリを用いて、以下のような結果を出したいのですが 可能でしょうか? ご指導の程よろしくお願いいたします。 (例) <テーブル> ID 判定 日本語   英語 1   o   テスト   test 2 o    赤     red 3   x   油     apple 4   o    愛     love 5 x  りんご   apple 6   o  日本    Japan 7 o    テスト   test 8   o  りんご   apple 9   x   赤     blue 10   o  テスト   test <クエリ結果(1)> ・日本語重複、かつ、英語重複のレコードを、重複単位に並べ替えて抽出したい。 ※ID「3」の英語は重複しているが、日本語が重複していないので抽出しない。 ※ID「9」の日本語は重複しているが、英語が重複していないので抽出しない。 ID 判定 日本語   英語 1   o  テスト   test 7 o    テスト   test 10   o  テスト   test 5 x  りんご   apple 8   o  りんご   apple <クエリ結果(2)> ・クエリ結果(1)に加えて、判定が「o」、「x」どちらも含まれるレコードだけを抽出したい ※ID「1、7、10」は、判定がすべて「o」の為、抽出しない。 ID 判定 日本語   英語 5 x  りんご   apple 8   o  りんご   apple 以上ご教授の程よろしくお願いいたします。

  • Accessクエリでのグループ化

    Accessクエリでのグループ化 以下の2つのテーブルが有ります。 ■社員テーブル ID 名前 1 Aさん 2 Bさん 3 Cさん 4 Dさん 5 Eさん ■受付テーブル ID 受付内容 受付日   社員ID 1  xxxxx 2010/3/1   1 2 xxxxx 2010/3/20   3 3 xxxxx 2010/4/10   2 4 xxxxx   2010/4/11  5 5 xxxxx 2010/4/15  1 6 xxxxx 2010/4/30  2 7 xxxxx 2010/5/3  4 そこで社員毎の受付数をカウントしたいと思っています。 ※受付日が2010/4/1以上5/1未満 名前 受付回数 Aさん 1 Bさん 2 Cさん 0 Dさん 0 Eさん 1 となるイメージです。 しかし、実際にクエリを作ると結果が 名前 受付回数 Aさん 1 Bさん 2 Eさん 1 と、なってしまいます。。 名前:グループ化 受付テーブルのID:カウント 受付日:>=2010/04/01 and <2010/05/01 ※社員テーブルの『ID』と、受付テーブルの『社員ID』を  紐つけており、結合プロパティでは『社員テーブルの  全レコードと受付テーブルの同じ結合フィールドのレコード  だけを含める』としております。 あらかじめ、受付テーブルで受付期間の条件でクエリ を作成しておき、それと社員テーブルを紐つけた場合は イメージ通りの結果になるのですが、1つのクエリで 上記イメージでの結果を表示したいと思ってます。 可能でしょうか? ご教授願います。

専門家に質問してみよう