【VBA】データを複数のCSVファイルに出力するツールを作ってみた!

VBA
マイケル
マイケル
ピースの角度は135度!
どうもマイケルです
エレキベア
エレキベア
パクったあげくどんなピースやねん
マイケル
マイケル
今回はVBAツールを作ってみるよ!
マイケル
マイケル
その名も・・・「データ複数CSVファイル出力くん」
エレキベア
エレキベア
無理やりくっつけたクマね
マイケル
マイケル
Excelに貼り付けたデータを複数のCSVファイルに出力する
という、ありがちかつ単純なツールだ!
エレキベア
エレキベア
なぜ今更そんな単純なツールを紹介するクマか
マイケル
マイケル
Excelデータ読み書きとファイル出力はよく使われるし
応用が聞くからね!
マイケル
マイケル
(まあほんとは
今月の目標記事数が全然足りて無い
からとにかくなんでも書いてるんだけど、黙っておこう)
エレキベア
エレキベア
何か言ったクマか?
マイケル
マイケル
さ、さあ早速作っていこう!
スポンサーリンク

仕様を考える

マイケル
マイケル
ツールの仕様としてはこんな感じでいくよ!

スクリーンショット 2020 03 29 14 44 23

マイケル
マイケル
A列に出力するCSVのファイル名、B列以降に出力データを入力してCSV出力ボタン押下
すると、ツールと同フォルダに出力フォルダを作成して出力します!
エレキベア
エレキベア
簡単クマね

ツールの作成

マイケル
マイケル
仕様を決めたらコードを書きます!
完成した全体のVBAコードはこちらになります!
Sub writeCSV()

Dim ws As Worksheet
Set ws = ThisWorkbook.Worksheets(1)

' 出力フォルダを作成
Dim outFolder As String
outFolder = ActiveWorkbook.Path & "/output_" & Format(Now, "yyyymmddHHMMSS")
MkDir outFolder

'---CSV出力処理---
Dim csvFile As String
Dim maxCol As Integer
Dim i As Long, j As Long
'★データ開始行:4
i = 4

'最大項目数の取得、CSVファイルをオープン
maxCol = Cells(i, Columns.Count).End(xlToLeft).Column
csvFile = outFolder & "/" & ws.Cells(i, 1).Value & ".csv"
Open csvFile For Output As #1

Do While ws.Cells(i, 1).Value <> ""
    '★データ開始列:2行目
    j = 2
    Do While j < maxCol
        Print #1, ws.Cells(i, j).Value & ",";
        j = j + 1
    Loop
    Print #1, ws.Cells(i, j).Value & vbCr;
    i = i + 1
    '次の行のファイル名と異なる場合出力
    If ws.Cells(i, 1).Value <> ws.Cells(i - 1, 1).Value Then
        Close #1
        '次のファイル名が入力されている場合
        '最大項目数の取得、CSVファイルをオープン
        If ws.Cells(i, 1).Value <> "" Then
            maxCol = Cells(i, Columns.Count).End(xlToLeft).Column
            csvFile = outFolder & "/" & ws.Cells(i, 1).Value & ".csv"
            Open csvFile For Output As #1
        End If
    End If
Loop
MsgBox outFolder & " に書き出しが完了しました!"
End Sub
マイケル
マイケル

1. 出力フォルダを作成
2. データ数の取得・出力CSVファイルをオープン
3. 出力CSVファイルのデータ読み込み
4. 出力ファイル名が変わったらクローズ、他に出力するファイルがある場合、
 データ数を取得してCSVファイルをオープン

の手順になっています!

出力フォルダの作成

マイケル
マイケル
冒頭の部分で出力するフォルダを作成しています!
今回は重複がないよう「output_yyyymmddHHMMSS」の名前にしています
' 出力フォルダを作成
Dim outFolder As String
outFolder = ActiveWorkbook.Path & "/output_" & Format(Now, "yyyymmddHHMMSS")
MkDir outFolder

データ数の取得・出力CSVファイルオープン

マイケル
マイケル
そして最大項目数の取得と出力CSVファイルを作成してオープンします
マイケル
マイケル
最大項目数取得の部分では、行の右端から「Ctrl + ⇦」で最後にデータがあるカラム列を調べています!
'最大項目数の取得、CSVファイルをオープン
maxCol = Cells(i, Columns.Count).End(xlToLeft).Column
csvFile = outFolder & "/" & ws.Cells(i, 1).Value & ".csv"
Open csvFile For Output As #1

データ読み込み

マイケル
マイケル
そしてメイン部、データを読み込んでいきます!
マイケル
マイケル
実際にデータがある行と列に合わせるため、
読み込み開始列と開始行はその分ずらしてあります!
Dim i As Long, j As Long
'★データ開始行:4
i = 4

・・・

Do While ws.Cells(i, 1).Value <> ""
    '★データ開始列:2行目
    j = 2
    Do While j < maxCol
        Print #1, ws.Cells(i, j).Value & ",";
        j = j + 1
    Loop
    Print #1, ws.Cells(i, j).Value & vbCr;
    i = i + 1
    ・・・
        End If
    End If
Loop

出力ファイルのクローズと次の出力ファイルのオープン

マイケル
マイケル
読み込んだファイル名が次の行のファイル名と異なる場合、
読み込んだファイルをクローズします!
マイケル
マイケル
そして次のファイル名が設定されている場合、
また最大項目数を取得してCSVファイルをオープンします
Do While ws.Cells(i, 1).Value <> ""
    ・・・
    '次の行のファイル名と異なる場合出力
    If ws.Cells(i, 1).Value <> ws.Cells(i - 1, 1).Value Then
        Close #1
        '次のファイル名が入力されている場合
        '最大項目数の取得、CSVファイルをオープン
        If ws.Cells(i, 1).Value <> "" Then
            maxCol = Cells(i, Columns.Count).End(xlToLeft).Column
            csvFile = outFolder & "/" & ws.Cells(i, 1).Value & ".csv"
            Open csvFile For Output As #1
        End If
    End If
Loop
マイケル
マイケル
今回は読み込むファイル内の項目数は全て同じとして
ファイル作成毎に項目数を取得しているけど、データごとに異なる場合は
ループ毎に最大項目数を取得し直せばOKです!

実行結果

マイケル
マイケル
このツールを実行した結果はこの通りです

スクリーンショット 2020 03 29 15 20 12

スクリーンショット 2020 03 29 15 20 21

スクリーンショット 2020 03 29 15 23 38

マイケル
マイケル
うまくCSV出力できていますね
エレキベア
エレキベア
空き容量すくな
マイケル
マイケル
ちなみに今回はMacで実行しましたが、
Windowsで動かす場合にはパス名の記述を「/」から「¥」に変更して実行するようにしてください!
エレキベア
エレキベア
WindowsとMacだとパス名の記述が異なるクマね
マイケル
マイケル
そうだね
それとMacの場合はパス名に日本語が含まれているとVBAでうまく読み込めないみたいだからそこも注意しよう!
エレキベア
エレキベア
VBAはWindowsのほうが動作環境としては良さそうクマ

おわりに

マイケル
マイケル
さて今回は簡単なVBAツールを作りましたがいかがだったでしょうか?
エレキベア
エレキベア
これくらい知っとるわ!
と言う人も多かったのではないかと思われクマ
マイケル
マイケル
冒頭でも話しましたが、データ読み込みとファイル出力は
仕事の効率化などで頻繁に活用できると思うのでぜひ習得してみてください!
マイケル
マイケル
それではアデュー!
エレキベア
エレキベア
クマ〜〜〜〜〜

【VBA】データを複数のCSVファイルに出力するツールを作ってみた! 〜完〜

コメント