- 締切済み
Access VBAからcsvの出力について
Access VBAからcsvの出力について Select * into csvファイル From テーブル名 Where ••• Where句なし、全件ではちゃんと出力できるのですが、 Where句ありだと0件になってしまいます。 Where句指定はできないのでしょうか? よい方法があれば教えてくださいm(._.)m 環境はフロントAccess ,DBはSQL server バッチでの出力も試みましたが、 Serverがあるフォルダにアクセス権限がないため、 断念しました。
- みんなの回答 (3)
- 専門家の回答
みんなの回答
- piroin654
- ベストアンサー率75% (692/917)
No2を以下にしてください。 カンマの処理とかを変更しました。 SQL文や保存するファイル名などは実際に合わせて 変更してください。 Sub test() Dim db As DAO.Database Dim rs As DAO.Recordset Dim strSQL As String Dim buf As Variant Dim i As Long Dim j As Long Dim strFileName As String strSQL = "select * from T顧客 where (T顧客.性='女') and (T顧客.都道府県='広島県');" strFileName = "名簿" Set db = CurrentDb Set rs = db.OpenRecordset(strSQL, dbOpenDynaset) Open CurrentProject.Path & "\" & strFileName & ".csv" For Output Access Write As #1 '###### データを「""」で囲わない場合 ####### 'フィールド名の取得と記入 For i = 0 To rs.Fields.Count - 1 buf = buf & Chr(44) & rs.Fields(i).Name Next i buf = Mid(buf, 2) Print #1, buf 'テーブルデータを追加 buf = "" Do Until rs.EOF For j = 0 To rs.Fields.Count - 1 buf = buf & Chr(44) & rs.Fields(j).Value Next j buf = Mid(buf, 2) Print #1, buf buf = "" rs.MoveNext Loop '################################ Close #1 rs.Close: Set rs = Nothing db.Close: Set db = Nothing End Sub 以下は、データを「""」で囲う場合で、上記の#######で挟んだ部分を 取り換えるとデータが「""」で囲まれたCSVファイルができます。 この確認はメモ帳で開くと確認できます。 必要に応じて変更してください。 '###### データを「""」で囲う場合 ####### 'フィールド名の取得と記入 For i = 0 To rs.Fields.Count - 1 buf = buf & Chr(44) & Chr(34) & rs.Fields(i).Name & Chr(34) Next i buf = Mid(buf, 2) Print #1, buf 'テーブルデータを追加 buf = "" Do Until rs.EOF For j = 0 To rs.Fields.Count - 1 buf = buf & Chr(44) & Chr(34) & rs.Fields(j).Value & Chr(34) Next j buf = Mid(buf, 2) Print #1, buf buf = "" rs.MoveNext Loop '#############################
- piroin654
- ベストアンサー率75% (692/917)
No1です。たぶん以下でいいと思いますが。 いろいろと回答したした後に、訂正などを 繰り返したので、一応たしかめてみてください。 なお、以下でのstrSQLに設定されたSQL文や、 strFileNameに設定されたCSVのファイル名は 適当に設定してください。 Sub test() Dim db As DAO.Database Dim rs As DAO.Recordset Dim strSQL As String Dim buf As Variant Dim i As Long Dim j As Long Dim strFileName As String strSQL = "select * from T顧客 where (T顧客.性='女') and (T顧客.都道府県='広島県');" '保存するCSVファイルの名前 strFileName = "名簿" Set db = CurrentDb Set rs = db.OpenRecordset(strSQL, dbOpenDynaset) Open CurrentProject.Path & "\" & strFileName & ".csv" For Output Access Write As #1 '####################################### 'フィールド名の取得と記入 For i = 0 To rs.Fields.Count - 1 buf = buf & Chr(44) & rs.Fields(i).Name Next i buf = Mid(buf, 2) Print #1, buf 'テーブルデータの取得と追加 buf = "" Do Until rs.EOF For j = 0 To rs.Fields.Count - 1 buf = buf & Chr(44) & rs.Fields(j).Value Next j buf = Mid(buf, 2) Print #1, buf buf = "" rs.MoveNext Loop '####################################### Close #1 rs.Close: Set rs = Nothing db.Close: Set db = Nothing End Sub なお、上記の'################で囲われた部分は以下でも ほぼ同じ結果になります。違うのはすべてのデータを 「""」で囲っているところです。 出来たCSVファイルをそのまま開くとExcelを利用して 開くことになりますが、メモ帳で開くとその違いが 分かります。CSVファイルの名前を変えて同じデータ でCSVファイルをつくるとわかります。 'フィールド名の取得と記入 For i = 0 To rs.Fields.Count - 1 buf = buf & Chr(34) & rs.Fields(i).Name & Chr(34) & "," Next i buf = Mid(buf, 1) Print #1, buf 'テーブルデータの取得と追加 buf = "" Do Until rs.EOF For j = 0 To rs.Fields.Count - 1 buf = buf & Chr(34) & rs.Fields(j).Value & Chr(34) & "," Next j buf = Mid(buf, 1) Print #1, buf buf = "" rs.MoveNext Loop
- piroin654
- ベストアンサー率75% (692/917)
>Where句指定はできないのでしょうか? たぶん、DoCmd.TransferText メソッドを 使ってのCSVファイルへの出力だと思うのですが、 確認していないのでわかりませんが、もし 不可能ならば、 DAOを使っての回答ですが、以前回答した https://okwave.jp/qa/q7324183.html の中で、 Set rs = db.OpenRecordset("テーブル1", dbOpenDynaset) のところで、「テーブル1」を 変数strSQLを Dim strSQL As String と設定しておいて、 strSQL = "select * from テーブル名 where ・・・" Set rs = db.OpenRecordset(strSQL, dbOpenDynaset) として、CSVファイルに書き出すという方法もあります。 物臭ついでに他のサイトを検索してみましたが、何となく 出来ないようなことがかかれていました。 リンク先の紹介という回答になりますが、分からないところが あれば補足してください。