ゲーム開発
Unity
UnrealEngine
C++
ゲーム数学
ゲームAI
サウンド
アニメーション
GBDK
制作日記
3DCG
Houdini
Blender
USD
グラフィックス
テクノロジ
ツール開発
フロントエンド関連
サーバサイド関連
ソフトウェア設計
ハードウェア関連
おすすめ技術書
音楽
DTM
楽器・機材
ピアノ
その他
都会のエレキベア
ラーメン日記
四コマ漫画
おすすめアイテム
おもしろコラム
  • ゲーム開発
    • Unity
    • UnrealEngine
    • C++
    • ゲーム数学
    • ゲームAI
    • サウンド
    • アニメーション
    • GBDK
    • 制作日記
  • 3DCG
    • Houdini
    • Blender
    • USD
    • グラフィックス
  • テクノロジ
    • ツール開発
    • フロントエンド関連
    • サーバサイド関連
    • ソフトウェア設計
    • ハードウェア関連
    • おすすめ技術書
  • 音楽
    • DTM
    • 楽器・機材
    • ピアノ
  • その他
    • 都会のエレキベア
    • ラーメン日記
    • 四コマ漫画
    • おすすめアイテム
    • おもしろコラム
  1. ホーム
  2. 20200329_01

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

ツール開発VBA
2020-03-29

マイケル
マイケル
ピースの角度は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ファイルに出力するツールを作ってみた! 〜完〜


ツール開発VBA
2020-03-29
記事をSNSで共有する
X
Facebook
LINE
はてなブックマーク
Pocket
LinkedIn
Reddit

著者の各種アカウント
フォローいただけると大変励みになります!
X
GitHub

関連記事
【VSCode】ドラッグ&ドロップで画像ファイルをリサイズ・保存する拡張機能を作る
2025-11-22
【Unity】Timeline × Excelでスライドショーを効率よく制作する
2024-10-31
【Node.js】廃止されたAmazonアソシエイト画像リンクをAmazon Product Advertising API経由で復活させる
2024-01-08
【Electron × Vue3】カテゴリ情報のCSVデータを操作するツールを作る
2023-12-31
【Electron × Vue3】画像をリサイズして任意の場所に保存するツールを作る
2023-12-31
【Electron × Vue3】Electron × Vue3 × TypeScript × Vite でツール開発環境を整える
2023-12-31
【Flutter3】Googleスプレッドシートと連携した英単語学習アプリを作る
2022-12-11
【Python】Pythonスクリプトをexe、app化する【cx_Breeze】
2021-08-29