はじめに
残念ながらパラメータクエリでTransferTextは使えません。
正確にいうと、例えば入力フォームに入力された値を引っ張って、処理内でパラメータを指定した状態でTransferTextを行うと、もう一度パラメータの入力を求められてしまいます。
普通のクエリならTransferText一発でCSV出力できるのに、、、
ということで、代替案を以下に記します。
やりたいこと:
登録したレコードが保存されているテーブル Dat_Input
から、指定した条件(今回は任意の地方コードとする)に合致するデータをCSV出力したい。現時点では、条件はパラメータクエリ Q_ExpCSV
に記載している。
代替案① クエリを都度作成(動的クエリ使用)
メリット: 全てがコード上で完結するためオブジェクトが少なくスッキリ。
やること:
1. 判定する条件内容を用意する(サンプルではフォームから取得)
2. Q_ExpCSV
の内容を記述して、Where句には Q_ExpCSV
で設定していた条件を設定
3. 一時的なクエリを作成
4. クエリ結果を TransferText
でCSV出力
5. 一時的なクエリを削除
※ 地方コードは店舗マスタ Mst_Tenpo
から引っ張ると想定
'パラメータクエリの条件を指定(formの入力値を取ってきたり、SelectCaseで対応)'
regCode = [Form_メニュー]![txt_条件]
'一時クエリの内容を記述、Where句にQ_ExpCSVで設定した条件を設定'
strSQL = " SELECT " & Dat_Input & " .*" _
& " FROM " & Dat_Input _
& " LEFT JOIN " & Mst_Tenpo & " ON " & Dat_Input & ".店舗コード = " & Mst_Tenpo & ".店舗コード" _
& " WHERE (" & Mst_Tenpo & ".地方コード = '" & regCode & "')"
'一時クエリを作成'
Set qdf = CurrentDb.CreateQueryDef("一時クエリ", strSQL)
'一時クエリのクエリ結果をCSV出力'
DoCmd.TransferText acExportDelim, , "一時クエリ", strFilePath, True
'一時クエリを削除'
CurrentDb.QueryDefs.Delete "一時クエリ"
代替案② ワークテーブル経由(追加時に条件指定)
メリット: ワークテーブルに絞り込んだデータが残るため、後続処理でワークのデータを操作できる。ひとつの機能にCSV出力+他の処理を追加したい場合などに。
やること:
1. Dat_Inputと同構造のワークテーブルを用意する
2. パラメータクエリ Q_ExpCSV
からパラメータの条件を削除して、FROM句はワークテーブルに設定
3. 処理内で判定条件の内容を用意する(サンプルではフォームから取得)
4. 追加クエリを記述する(Where句には Q_ExpCSV
で設定していた条件を記述)
5. Q_ExpCSV
のクエリ結果を TransferText
でCSV出力
※ 地方コードは店舗マスタ Mst_Tenpo
から引っ張ると想定
'パラメータクエリの条件を指定(formの入力値を取ってきたり、SelectCaseで対応)'
regCode = [Form_メニュー]![txt_条件]
'パラメータに関する条件のみ、ワークテーブルに追加するタイミングで絞る'
strSQL = "INSERT INTO " & Wrk_Table & " SELECT " & Dat_Input & " .*" _
& " FROM " & Dat_Input _
& " LEFT JOIN " & Mst_Tenpo & " ON " & Dat_Input & ".店舗コード = " & Mst_Tenpo & ".店舗コード" _
& " WHERE (" & Mst_Tenpo & ".地方コード = '" & regCode & "')"
DoCmd.RunSQL strSQL
'Q_ExpCSVのクエリ結果をCSV出力'
DoCmd.TransferText acExportDelim, , Q_ExpCSV, strFilePath, True
おわりに
調べたけどわかりませんでした、なんてNA〇ERまとめみたいな記事を書くか迷いましたが、同じ疑問を持った方の調べる手間を省く助けになれば幸いです。メリークリスマス!🎄🎅