• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:Access クエリを実行して出力するマクロ)

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

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

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

  • ベストアンサー
  • 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

専門家に質問してみよう