- ベストアンサー
Access クエリを実行してマクロでデータをエクスポートする方法
- WindowsXP、Access2010の環境で、以下のような作業をマクロで自動化したいと考えています。出身地が「東京都」のレコードのみを抽出して、「東京都.xls」というファイル名でエクスポートし、出身地が「神奈川」のレコードのみを抽出して、「神奈川.xls」というファイル名でエクスポートします。
- マクロを設定するためには、以下の手順を実行します。
- まず、出身地が「東京都」のレコードのみを抽出するクエリを作成します。次に、そのクエリを実行して結果をエクスポートします。同様に、出身地が「神奈川」のレコードのみを抽出するクエリを作成し、実行して結果をエクスポートします。以上の手順をマクロに記述すれば、自動化が実現できます。
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
#1~3です。 db.QueryDefs.Delete "Q_temp"は書き出し都度実行していますので、正常終了すれば残らない筈です。 ご指摘の内容は、当方では再現されません。何かエラーが出ていないでしょうか。 標準モジュールにおいて実行しても良いですし、フォームから使用されるなら、フォームモジュールに置いても動くと思います。 マクロから標準モジュールのプロシージャを実行するには、Sub ではダメでFunctionにする必要があります。普通Functionは戻り値を戻しますが、今回の例では単純にSub→Functionに書き換えるだけで良いと思います。 マクロのアクションにプロシージャの実行を選択し、プロシージャ名として、test()と、括弧もつけて設定します。 以上、ご参考まで。
その他の回答 (4)
- layy
- ベストアンサー率23% (292/1222)
マクロにしてモジュール形式で保存するとVBAになります。 マクロではプロシージャ実行にします。 クエリはSQL記述にしてVBA側でそのSQLを実行させることと同意です。 VBA側なら条件は変数化できるので、一部違うだけの複数のクエリでもSQL文は使い回しできます。 こんなところを調べて VBAでそのクエリのSQLを実行させることを考えたらいいでしょう。
お礼
お礼が遅れまして申し訳ございません。 ご回答を参考にさせていただきながら、 しばらく試行錯誤してみます。 ありがとうございました!
- mitarashi
- ベストアンサー率59% (574/965)
#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に相当します。
お礼
mitarashiさん ありがとうございます! ひとまずやりたい事にだいぶ近づくことができました。 重ねて質問させていただきたいのですが・・・ ・再実行するとエラー3012が出てしまいます。 修正方法としては↓のように書けばいいのでしょうか? DoCmd.DeleteObject acQuery, "Q_temp" ・こちらのコードは標準モジュールで書けばいいのですか? それともクラスモジュールに書けばいいのでしょうか? ・マクロから呼び出して実行させたいのですが、 いろいろ試してみましたがうまくいきません。 どのように設定すればよろしいでしょうか? お手数かけてしまい申し訳ありませんが ご指導いただけますとたいへん助かります。 なにとぞよろしくお願いいたします。
- mitarashi
- ベストアンサー率59% (574/965)
#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)
よく似た案件に回答しております。ご参考まで。 http://okwave.jp/qa/q6043020.html
お礼
たびたびありがとうございます! エラーは、実行失敗したときのQ_tempがそのまま残ってしまっていたのが原因でした。 ナビゲーションウィンドウからQ_tempを手動で消したら直りました。 お騒がせしました。 丁寧に説明していただいたおかげで、マクロから実行させることができました。 とても助かりました!