Microsoft Access 掲示板

クロス集計クエリの結果をエクセルにエクスポートしたい

6 コメント
101 views
4 フォロー

毎回大変お世話になってます。
クロス集計クエリを基にしたフォームがあり、それにオプションボタンによりフィルターをかける様にしてます。
そのフィルターを反映した結果をエクセルにエクスポートしたいのです。フォームには下記コードでコマンドボタン作成してますが、これだけではフィルター反映出来ません(全データの出力となります)。
このコードにどう追記していいのかが分かりません。

Dim Filepath As String, FileName As String, Expath As String, modori As Integer
'エクスポートするExcelのフルパス
 Filepath = DLookup("Fp1", "T_OtherFile") & DLookup("Exfo1", "T_OtherFile") & "\"
 Expath = DLookup("ExePc", "T_OtherFile")
 FileName = "年度別売上集計_Cross.xls"    
DoCmd.TransferSpreadsheet acExport, acSpreadsheetTypeExcel9, "Q年度別売上集計_Cross_顧客と営業担当別", Filepath & FileName, True

宜しくお願いします。

beginner
作成: 2025/03/04 (火) 11:32:22
通報 ...
1
hatena 2025/03/05 (水) 02:35:09 修正

クエリのSQLを書き換えてからエクスポートするといいでしょう。
エクスポート後にクエリのSQLを元に戻しておきます。
エクスポートが失敗しても、必ず元に戻せるようにエラー処理も追加しておいた方がいいでしょう。
下記のような感じのコードになります。

    Const QueryName = "Q年度別売上集計_Cross_顧客と営業担当別"
    Dim qd As DAO.QueryDef
    Dim strFilter As String
    Dim strSQL As String
    Set qd = CurrentDb.QueryDefs(QueryName)
    strSQL = Replace(qd.SQL, ";", "")
    
    'クエリの抽出条件にフォームのFilterを設定する
    qd.SQL = "SELECT * FROM (" & strSQL & ") WHERE " & Me.Filter & ";"
    
    On Error Resume Next 'エクスポートがエラーになっても以降の行を実行
    'エクセルにエクスポート
    DoCmd.TransferSpreadsheet acExport, acSpreadsheetTypeExcel9, QueryName, Filepath & FileName, True
    
    'クエリのSQLを元に戻す
    qd.SQL = strSQL & ";"
    On Error GoTo 0 'エラー処理をを無効にする
2
名前なし 2025/03/05 (水) 08:38:37 c6dc2@5d7f7

hatenaさん ありがとうございます。
頂いたコードをコピーして実行したところ ”変数が定義されていません”のエラーが出ました。見ると Set qd = db.QueryDefs(QueryName) のdb部を示してました。これの変数宣言はどう追記したらいいでしょうか? すみませんDAOは全然知識ないもので。

3

その部分を下記に修正してください。

    Set qd = CurrentDb.QueryDefs(QueryName)

元の回答のコードも修正しておきました。

4

確認してみたら、#1の回答のコードではだめですね。
クロス集計クエリはサブクエリにはできないようです。

いま、修正コードを作成中ですのでしばらくお待ちください。

5

普通の選択クエリや集計クエリなら#1の回答のコードでOKですが、
クロス集計クエリの場合は、下記のコードを使用してください。

    Const QueryName = "Q年度別売上集計_Cross_顧客と営業担当別"
    Dim strSQL As String  'エクスポート用一時クエリのSQL
    strSQL = "SELECT * FROM " & QueryName
    If Me.Filter <> "" And Me.FilterOn Then
        strSQL = strSQL & " WHERE " & Me.Filter
    End If
    
    Dim db As Database, qd As DAO.QueryDef
    Set db = CurrentDb
    Set qd = db.CreateQueryDef("TempQuery", strSQL & ";") 'エクスポート用一時クエリの作成
     
    On Error Resume Next 'エクスポートがエラーになった場合でも以降の行を実行
    'エクセルにエクスポート
    DoCmd.TransferSpreadsheet acExport, acSpreadsheetTypeExcel9, "TempQuery", Filepath & FileName, True
    
    '一時クエリの削除
    db.QueryDefs.Delete "TempQuery"    
    On Error GoTo 0 'エラー処理をを無効にする
6
beginner 2025/03/05 (水) 10:52:11 61dd6@5d7f7

hatenaさん ありがとうございます。
最終で頂いたコードで上手く出来ました。とても自分では解決できる事ではありませんでした。
DAOも勉強が必用だなと感じました(中々ハードル高いですが)。
毎回対応して頂き感謝です。