/*Google AdSense自動広告*/

2018年7月25日水曜日

Access VBAでテーブルをCSV出力する(軽量版、一行一行操作が必要な場合)~Access VBA : output CSV from table or query, convenient, step by step

Access VBAでテーブルやクエリをCSV出力する場合、通常はエクスポート機能を使いますが、レコード毎に値操作を行ったり、その結果必要なレコードのみ出力したい場合は、複雑なクエリを組むよりも、VBAで記述した方がシンプルになることがあります。その場合、CSVファイルを出力する部分は自分で実装しなければいけないので、私が書いたクラスモジュールと使用例を公開します。よろしければ参考になさって下さい。不明な点・ご意見はコメント欄にどうぞ。

Access VBA my code : output CSV from table or query. Welcome questions and opinions in the comments section, English OK.


標準モジュール

animalsテーブルの内容を加工して, my_settingsテーブルで指定したフォルダにCSVファイルとして保存します。
実際、この程度の操作でしたらクエリで間に合いますが…

Option Compare Database

Public Sub result_output_csv()
 
    Dim rec_output As New ADODB.Recordset
    rec_output.Open "animals", CurrentProject.Connection, adOpenStatic, adLockReadOnly
 
    SysCmd acSysCmdInitMeter, "Outputing CSV File Please Wait...", rec_output.RecordCount
         
    Dim my_output_csv As New output_csv
    my_output_csv.setup_items Array("animal_id", "type", "place")
 
    Do While Not rec_output.EOF
     
        If rec_output("place") = "Japan" Then
         
            my_output_csv.put_log Array(rec_output("animal_name") & "-" &  rec_output("animal_index"), _
                                                        rec_output("type"), "JPN"
         
        End If
     
        SysCmd acSysCmdUpdateMeter, rec_output.AbsolutePosition
     
        rec_output.MoveNext

    Loop
     
    Dim csv_folder As String
    csv_folder = Application.DLookup("setting_value", "my_settings", "setting_item='result_output_folder'")
    my_output_csv.output_csv csv_folder & "\lovely_animals_" & Format(Now, "yyyymmdd_HHMMSS") & ".csv"

    MsbBox "finished."

    SysCmd acSysCmdClearStatus

End Sub




クラスモジュール

データをStringとして保存し、最後にCSVファイルに保存することで、レコードセット操作中のメモリ節約を狙っています。
Save the data as a String and save it in the CSV file at the end, aiming at memory saving during Recordset operation.


Option Compare Database

Private log_data As String

'1st, setup items for first line of CSV file
'CSVファイルの1行目の項目を設定できます。テーブルにない項目もOK
Public Function setup_items(items_array)
 
    log_data = ""
    log_data = array_to_string_with_comma(items_array)
 
End Function

'2nd, put 1 line to string data(not write to CSV file directly, correct to one string)
'Arrayでデータを渡すと、改行とともにStringデータにコンマ区切りで格納します。

Public Function put_log(values_array)

    log_data = log_data & vbCrLf & array_to_string_with_comma(values_array)
 
End Function

'finally, output all line to csv file
'ファイル名を指定して実行すると、項目と今までputしたデータをまとめてCSVに保存します。

Public Function output_csv(csv_filename)

    Dim my_text As TextStream
    Dim fso As New FileSystemObject
     
    Set my_text = fso.CreateTextFile(csv_filename)
    my_text.Write log_data
 
End Function

'array to string with comma
'Arrayデータをコンマ区切りのひとつのStringデータに変換する内部関数です

Private Function array_to_string_with_comma(input_array) As String

    Dim result_string As String, input_val
 
    For Each input_val In input_array
        result_string = result_string & "," & input_val
    Next
 
    array_to_string_with_comma = Mid(result_string, 2, Len(result_string))
 
End Function

0 件のコメント:

コメントを投稿