CSVファイル作成ツールをExcel VBAで作ってみた

業務で複数のCSVをDBに取り込むテストを行う機会があったので、今後のためにCSV作成をツール化しようと思い立った。 下図が完成したツールの様子。データシートに各種条件とデータを設定する。

文字コードシートでは、データシートの文字コードのコンボボックスから選択可能となる文字コードの一覧を設定しておく。

データシートの実行ボタンを押すと、このツールと同じ場所にCSVが出力される。
下図は、出力されたCSVをサクラエディタで開いたもの。
ツールで指定した囲み文字や、文字コードと改行コードに従って出力されていることを確認できる(赤枠参照)。

BOM無しで出力されていることの確認方法は、サクラエディタの場合、名前をつけて保存ダイアログにてBOMのチェックが付いているかどうかで判断できる。

さてソースコードだが、ネットのいろんなところで紹介されているので、詳細説明は省略してコードだけ残しておく。
まず「データ」シートモジュールでは、ボタン押下時に標準モジュールの関数などをコールするだけとした(下図参照)。

※CommandButton1は実行ボタン、CommanButton2は文字コードリスト再読み込みボタンのオブジェクト名。

標準モジュールは以下のようにコーディングした。
Auto_Openは、ツール起動時に自動で実行されるもの。
文字コードシートから文字コードのリストを読み込んで、データシートの文字コードコンボボックスにセットしている。
文字コードシートに手を加えたときに、それを反映させるため、文字コードリスト再読み込みボタンにも紐づけている。
outputがCSV出力コードの本体だが、説明は省略する。(各コントロールのオブジェクト名の説明を端折るが、VBA初心者でなければ当たりは付くはず)

  1Option Explicit
  2
  3Sub Auto_Open()
  4    Dim maxrow As Integer, i As Long
  5    Dim chrSt As Object, datSt As Object
  6    Set datSt = Worksheets("データ")
  7    Set chrSt = Worksheets("文字コード")
  8    datSt.ComboBox1.Value = ""
  9    maxrow = chrSt.Cells(Rows.Count, 1).End(xlUp).Row
 10    For i = 1 To maxrow
 11        datSt.ComboBox1.AddItem chrSt.Range("A" & i).Value
 12    Next i
 13End Sub
 14
 15Sub output()
 16    ' [参照設定] Microsoft ActiveX Data Objects 6.1 Library
 17    Dim p_stream As ADODB.Stream
 18    Dim maxrow As Long, maxcol As Long
 19    Dim i As Long, j As Long
 20    Dim startCol As Long
 21    Dim lineStr As String
 22    Dim enclose As String
 23    Dim datSt As Object
 24
 25    On Error GoTo err
 26
 27    Set datSt = Worksheets("データ")
 28    Set p_stream = New ADODB.Stream
 29    maxrow = datSt.Cells(Rows.Count, 2).End(xlUp).Row
 30    maxcol = datSt.Cells(2, Columns.Count).End(xlToLeft).Column
 31
 32    'ヘッダー出力判定
 33    If datSt.CheckBox1.Value Then
 34        startCol = 2
 35    Else
 36        startCol = 3
 37    End If
 38
 39    ' 出力データ有無判定
 40    If startCol > maxcol Then
 41        MsgBox "出力するデータがありません"
 42        Exit Sub
 43    End If
 44
 45    ' 文字コード設定チェック
 46    If Len(Trim(datSt.ComboBox1.Value)) = 0 Then
 47        MsgBox "文字コードをリストより選択してください"
 48        Exit Sub
 49    End If
 50
 51    ' 囲み文字取得
 52    enclose = Trim(datSt.TextBox2.Value)
 53
 54    With p_stream
 55        ' 文字コード設定
 56        .Charset = datSt.ComboBox1.Value
 57
 58        .Type = ADODB.StreamTypeEnum.adTypeText
 59
 60        ' 改行コード判定
 61        If datSt.OptionButton1.Value Then
 62            .LineSeparator = LineSeparatorEnum.adLF
 63        ElseIf datSt.OptionButton2.Value Then
 64            .LineSeparator = LineSeparatorEnum.adCR
 65        Else
 66            .LineSeparator = LineSeparatorEnum.adCRLF
 67        End If
 68
 69        ' オープン
 70        .Open
 71
 72        ' 出力データ生成
 73        For j = startCol To maxcol
 74            lineStr = ""
 75            For i = 3 To maxrow
 76                lineStr = lineStr & enclose & datSt.Cells(i, j).Value & enclose & ","
 77            Next i
 78            ' 末尾の余分なカンマとを削除
 79            lineStr = Mid(lineStr, 1, Len(lineStr) - 1)
 80            ' 文字列出力
 81            .WriteText lineStr, ADODB.StreamWriteEnum.adWriteLine
 82        Next j
 83
 84        ' BOMなしの場合
 85        If Not datSt.CheckBox2.Value Then
 86            ' タイプをバイナリにして、先頭の3バイトをスキップ
 87            .Position = 0
 88            .Type = ADODB.StreamTypeEnum.adTypeBinary ' タイプ変更するにはPosition = 0である必要がある
 89            .Position = 3
 90            ' 一時格納用
 91            Dim p_byteData() As Byte
 92            p_byteData = .Read
 93            .Close ' 一旦閉じて
 94            .Open ' 再度開いて
 95            .Write p_byteData ' ストリームに書き込む
 96        End If
 97
 98        .SaveToFile ThisWorkbook.Path & "¥" & datSt.TextBox1.Value, ADODB.SaveOptionsEnum.adSaveCreateOverWrite
 99        .Close
100    End With
101        MsgBox "出力が完了しました"
102    Exit Sub
103
104err:
105    MsgBox "エラーが発生しました!" & vbCrLf & "Err.Number=[" & err.Number & "], Err.Description=[" & err.Description & "]"
106End Sub

関連ページ