1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

はじめてのアドベントカレンダーAdvent Calendar 2024

Day 12

【AccessVBA】パラメータクエリでTransferTextを使いたいときの代替案

Posted at

はじめに

残念ながらパラメータクエリでTransferTextは使えません。
正確にいうと、例えば入力フォームに入力された値を引っ張って、処理内でパラメータを指定した状態でTransferTextを行うと、もう一度パラメータの入力を求められてしまいます。

普通のクエリならTransferText一発でCSV出力できるのに、、、
ということで、代替案を以下に記します。

やりたいこと:
登録したレコードが保存されているテーブル Dat_Input から、指定した条件(今回は任意の地方コードとする)に合致するデータをCSV出力したい。現時点では、条件はパラメータクエリ Q_ExpCSV に記載している。

代替案① クエリを都度作成(動的クエリ使用)

メリット: 全てがコード上で完結するためオブジェクトが少なくスッキリ。

やること:
1. 判定する条件内容を用意する(サンプルではフォームから取得)
2. Q_ExpCSV の内容を記述して、Where句には Q_ExpCSV で設定していた条件を設定
3. 一時的なクエリを作成
4. クエリ結果を TransferText でCSV出力
5. 一時的なクエリを削除
地方コードは店舗マスタ Mst_Tenpo から引っ張ると想定

Access VBA
'パラメータクエリの条件を指定(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 から引っ張ると想定

Access VBA
'パラメータクエリの条件を指定(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まとめみたいな記事を書くか迷いましたが、同じ疑問を持った方の調べる手間を省く助けになれば幸いです。メリークリスマス!🎄🎅

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?