以前に、非連結のテキストボックスやコンボボックスから抽出したレコードをフォームのレコードソースにする方法を記事にしたことがありました。
https://pctips.jp/pc-soft/access-textbox-judg-extract/
今回は、
ココがポイント
その抽出したレコードソースを、CSVファイルなどにエクスポートする方法
をやって見たいと思います。
方法は一つじゃない!?
方法はいくつかあるのかと思いながらもネットで同じような事例が無いかと調べましたが、中々出てきません。
いちばん簡単なのは、非連結ボックスや非連結のコンボボックスを指定して抽出したクエリをそのままエクスポートすれば事は足りると思います。
https://pctips.jp/pc-soft/access-export-selectfolder/
ただ、今回は、せっかくフォームのレコードソースとしてVBAにて抽出したので、そのレコードソースをエクスポートできないものか?と考えた訳です。
ダミーのクエリを使ってエクスポート
ネットを探してみると、なんでダミーのクエリをつかってエクスポートできるのかわかりませんが、下記の様なコードを見つけました。
Dim qd As DAO.QueryDef
Set qd = CurrentDb.QueryDefs("Q_Dummy")
qd.SQL = "SELECT * FROM (フォームのレコードソース) WHERE " & Me.Filter
DoCmd.TransferText acExportDelim, , "Q_Dummy", "C:\Test\Test.csv", True
ほぼ諦めかけていたので、DAOを嫌っていた自分ですが、今回はDAOを使ってほしい機能が実現できたので良しとしました。
複雑なSQL抽出データをエクスポート
Private Sub csv_xport_Click()
Dim hantei As Integer
Dim naiyou As String
Dim dbs As DAO.Database
Dim qdf As DAO.QueryDef
Dim flg As Boolean
Dim strSql As String
Dim strPath As String
Dim FolderName As String
FolderName = getFolderName("") '引数に初期値のフォルダーパスを設定、""にするとドキュメントフォルダー
If FolderName = "" Then
MsgBox "キャンセルされました。"
Else
' 条件が設定されてない時は抽出しない
If Nz(Me.search_mado, "") = "" And Nz(Me.delivery_mado, "") = "" And Nz(Me.trader_search, "") = "" And Nz(Me.pu_date_start, "") = "" And Nz(Me.pu_date_end, "") = "" And Nz(Me.delivery_date_start, "") = "" And Nz(Me.delivery_date_end, "") = "" Then
Call 解除ボタン_Click
Exit Sub
End If
haitei = 0
If Nz(Me.pu_date_start, "") <> "" And Nz(Me.pu_date_end, "") <> "" Then
hantei = hantei + 1
ElseIf Nz(Me.pu_date_start, "") <> "" Then
If Nz(Me.pu_date_end, "") = "" Then
MsgBox "集荷日終了が入力されていません"
Exit Sub
End If
ElseIf Nz(Me.pu_date_end, "") <> "" Then
If Nz(Me.pu_date_start, "") = "" Then
MsgBox "集荷日開始が入力されていません"
Exit Sub
End If
End If
If Nz(Me.delivery_date_start, "") <> "" And Nz(Me.delivery_date_end, "") <> "" Then
hantei = hantei + 10
ElseIf Nz(Me.delivery_date_start, "") <> "" Then
If Nz(Me.delivery_date_end, "") = "" Then
MsgBox "配達日終了が入力されていません"
Exit Sub
End If
ElseIf Nz(Me.delivery_date_end, "") <> "" Then
If Nz(Me.delivery_date_start, "") = "" Then
MsgBox "配達日開始が入力されていません"
Exit Sub
End If
End If
If Nz(Me.search_mado, "") <> "" Then ' 出荷人
hantei = hantei + 100
End If
If Nz(Me.trader_search, "") <> "" Then ' 業者
hantei = hantei + 1000
End If
If Nz(Me.delivery_mado, "") <> "" Then ' 配達先
hantei = hantei + 10000
End If
naiyou = "(trader1 ='" & Me!trader_search & "'or trader2 = '" & Me!trader_search & "'or trader3 = '" & Me!trader_search & "'or trader4 = '" & Me!trader_search & "'or trader5 = '" & Me!trader_search & "')"
On Error GoTo Err_Handler
If hantei = 100 Then ' 出荷人
strSql = "SELECT * FROM orderdata_sorting WHERE shipper ='" & Me!search_mado & "'"
ElseIf hantei = 101 Then ' 出荷人+集荷日
strSql = "SELECT * FROM orderdata_sorting WHERE shipper ='" & Me!search_mado & "' And pu_date Between #" & Me!pu_date_start & "# AND #" & Me!pu_date_end & "#"
ElseIf hantei = 111 Then ' 出荷人+集荷日+配達日
strSql = "SELECT * FROM orderdata_sorting WHERE shipper ='" & Me!search_mado & "' And pu_date Between #" & Me!pu_date_start & "# AND #" & Me!pu_date_end & "#" & "And delivery_date Between #" & Me!delivery_date_start & "# AND #" & Me!delivery_date_end & "#"
ElseIf hantei = 10101 Then ' 出荷人+配達先+集荷日
strSql = "SELECT * FROM orderdata_sorting WHERE shipper ='" & Me!search_mado & "'And delivery_name = '" & Me!delivery_mado & "' And pu_date Between #" & Me!pu_date_start & "# AND #" & Me!pu_date_end & "#"
ElseIf hantei = 11 Then ' 集荷日+配達日
strSql = "SELECT * FROM orderdata_sorting WHERE pu_date Between #" & Me!pu_date_start & "# AND #" & Me!pu_date_end & "#" & "And delivery_date Between #" & Me!delivery_date_start & "# AND #" & Me!delivery_date_end & "#"
ElseIf hantei = 1000 Then ' 業者
strSql = "SELECT * FROM orderdata_sorting WHERE " & naiyou
ElseIf hantei = 11000 Then ' 業者+配達先
strSql = "SELECT * FROM orderdata_sorting WHERE delivery_name = '" & Me!delivery_mado & "' and " & naiyou
ElseIf hantei = 11001 Then ' 業者+配達先+集荷日
strSql = "SELECT * FROM orderdata_sorting WHERE delivery_name = '" & Me!delivery_mado & "' and pu_date Between #" & Me!pu_date_start & "# AND #" & Me!pu_date_end & "#" & " and " & naiyou
ElseIf hantei = 1001 Then ' 業者+集荷日
strSql = "SELECT * FROM orderdata_sorting WHERE pu_date Between #" & Me!pu_date_start & "# AND #" & Me!pu_date_end & "#" & " and " & naiyou
ElseIf hantei = 1101 Then ' 出荷人+業者+集荷日
strSql = "SELECT * FROM orderdata_sorting WHERE shipper ='" & Me!search_mado & "' And pu_date Between #" & Me!pu_date_start & "# AND #" & Me!pu_date_end & "#" & " and " & naiyou
ElseIf hantei = 1 Then ' 集荷日
strSql = "SELECT * FROM orderdata_sorting WHERE pu_date Between #" & Me!pu_date_start & "# AND #" & Me!pu_date_end & "#"
ElseIf hantei = 10 Then ' 配達日
strSql = "SELECT * FROM orderdata_sorting WHERE delivery_date Between #" & Me!delivery_date_start & "# AND #" & Me!delivery_date_end & "#"
' Debug.Print .Source
Else
MsgBox "設定外の抽出項目です。設定し直して再抽出してください。"
Exit Sub
End If
'エクスポート処理
flg = False
Set dbs = CurrentDb
'クエリ有無
For Each qdf In dbs.QueryDefs
If qdf.Name = "Q_Dummy" Then
flg = True
Exit For
End If
Next
'存在する場合クエリ削除
If flg = True Then
dbs.QueryDefs.Delete "Q_Dummy"
flg = False
End If
If flg = False Then
Set qdf = dbs.CreateQueryDef("Q_Dummy", strSql)
DoCmd.TransferText acExportDelim, , "Q_Dummy", FolderName & "\抽出CSV_" & Format(Now(), "yyyymmdd") & ".csv", True
dbs.Close 'dbsをクローズ
Set dbs = Nothing 'dbsを開放
Set qdf = Nothing 'qdfを開放
MsgBox "エクスポート完了しました。"
End If
End If
ExitErr_Handler:
Exit Sub
Err_Handler:
MsgBox "エラー: " & Err.description
End Sub
スゲー複雑そうに見えますが、
ココに注意
条件によって抽出したSQLデータをエクスポートしているだけです
結局は、フォームのレコードソースに設定したVBAコードを実行して、今回見つけたエクスポートコードを追加しただけです。