会社員プログラマー「Kaia May」のコードの備忘録サイトです〜!

AccessVBAでパラメータクエリをフォームで絞り込んでデスクトップにCSV出力する

AccessVBAでパラメータクエリをフォームで絞り込んでデスクトップにCSV出力する

 

フォームで「事業所番号01」(コードの開始)・「事業所番号02」(コードの終了)・「発送区分」のテキストボックスを入力し、パラメータクエリに絞り込みをかけて、デスクトップにCSVで出力する方法です。

パラメータクエリとは、クエリの中でパラメータ(条件みたいなの)を入力するように抽出条件に設定されていて、クエリを実行すると「パラメーターの入力」というダイアログボックスが表示されるクエリです。ダイアログボックの入力欄に条件を入力することで絞り込んだ結果を抽出できるクエリです。

ただ、パラメータクエリは、VBAで色々作業する際にただの選択クエリとかのように色々すんなりいかないので、手順とかをしっかりしないといけないです。

以下のサンプルコードでは、フォームのテキストボックスとかに入力された値をもとにパラメータクエリを絞り込んだ上で、それを一時的なクエリ「令書CSV出力クエリ」に入れ込んで、それをデスクトップにCSV出力するという流れになっています。

 

Private Sub csvExport_Click()
'入力がなければ入力を促す
If IsNull(Me.事業所番号01) Then
MsgBox "事業所番号を入力して下さい", vbInformation
Exit Sub
End If
If IsNull(Me.事業所番号02) Then
MsgBox "事業所番号を入力して下さい", vbInformation
Exit Sub
End If
If IsNull(Me.発送区分) Then
MsgBox "令書発送区分を選択して下さい", vbInformation
Exit Sub
End If
'パラメータクエリの結果をCSVファイルで出力
On Error Resume Next
Dim db As DAO.Database
Dim rs As DAO.Recordset
Dim dq As DAO.QueryDef
Dim stSQL As String
Dim strFilter As String
Dim Path As String
Path = CreateObject("WScript.Shell").Specialfolders("Desktop") & "¥" & "会費令書データCSV" & Format(Date, "yyyymmdd") & ".csv"
'Database型の変数dbを宣言しカレントデータベースオブジェクト「CurrentDb」を参照する変数dbにセット
Set db = CurrentDb()
Set rs = db.OpenRecordset("請求関係:令書", dbOpenDynaset)
'事業所番号01テキストボックス
If Not IsNull(Me.事業所番号01) Then
strFilter = strFilter & " And [事業所コード] >= " & Me.事業所番号01
End If
'事業所番号02テキストボックス
If Not IsNull(Me.事業所番号02) Then
strFilter = strFilter & " And [事業所コード] <= " & Me.事業所番号02
End If
'発送区分テキストボックス
If Not IsNull(Me.発送区分) Then
If Me.発送区分 = 1 Then
strFilter = strFilter & " And [会費請求方法] = 1"
ElseIf Me.発送区分 = 3 Then
strFilter = strFilter & " And [会費請求方法] = 3"
ElseIf Me.発送区分 = 2 Then
strFilter = strFilter & " And [会費請求方法] Between 1 And 3"
End If
End If
If strFilter = "" Then
Me.FilterOn = False
Else
strFilter = Mid(strFilter, 6)
Me.Filter = strFilter
Me.FilterOn = True
End If
'パラメータクエリをVBAで呼び出す
stSQL = "SELECT * FROM 請求関係:令書 WHERE " & strFilter & ";"
'QueryDefは、クエリを定義する場合に使用するオブジェクト
'CreateQueryDefメソッドで、データベースにクエリを作成し、変数dqにセット
Set dq = db.CreateQueryDef("令書CSV出力クエリ", stSQL)
dq.SQL = stSQL
'TransferTextで転送を命令し、acExportDelimで項目間を区切る
DoCmd.TransferText acExportDelim, , "令書CSV出力クエリ", Path, True, ""
'必要なデータが抽出された後、「令書CSV出力クエリ」を削除
'この処理をしていないと、再度「パラメータ名」に抽出したいデータを入力して「実行」ボタンをクリックした場合、「すでに"パラメータ名"クエリが存在する」のメッセージが出てエラーになる
DoCmd.DeleteObject acQuery, "令書CSV出力クエリ"
'変数を解放し、MsgBoxで、処理完了を知らせる
Set rs = Nothing
Set db = Nothing
MsgBox& "「 会費令書データCSV" & Format(Date, "yyyymmdd") & ".csv 」" & "をデスクトップに出力しました。ご確認ください。"
rs.Close
db.Close

>bokucode

bokucode

遅ればせながらプログラミングを始めた静岡在住の30代の会社員プログラマー「Kaia May」です!
いろんな言語のコードに挑戦していきたいと思っていて、その中でメモしておきたいコードや今後も使えるコードやその説明などを記録していきます。
他にも参考になったおすすめサイトや書籍なども紹介していきます。

CTR IMG