みなさん、こんにちは!
タカハシ(@ntakahashi0505)です。
エクセルのデータを様々なファイルに書き出してみています。
前回はこちらの記事です。
エクセルシートに記述された内容をテキストファイル「data.txt」に書き出すプログラムを紹介しました。
以外と簡単でしたよね。
さて、異なるアプリケーション間でデータを交換する際にはCSV形式がよく使われます。
今回は、エクセルVBAでエクセルシートのデータをCSVファイルとして出力する方法についてお伝えしていきます。
前回のおさらい:エクセルシートの内容をテキストファイルで書き出す
前回のプログラムはこちらでした。
Sub makeText() Dim ws As Worksheet Set ws = ThisWorkbook.Worksheets(1) Dim datFile As String datFile = ActiveWorkbook.Path & "\data.txt" Open datFile For Output As #1 Dim i As Long i = 1 Do While ws.Cells(i, 1).Value <> "" Print #1, ws.Cells(i, 1).Value i = i + 1 Loop Close #1 MsgBox "data.txtに書き出しました" End Sub
流れとしては
- 「data.txt」というファイル名でテキストファイルをオープン
- エクセルシートの終わりまで一行ずつ繰り返し
- テキストファイルにA列を一行で出力
- 「data.txt」をクローズ
となります。
エクセルシートの内容をCSVファイルとして書き出す
まず今回お題とするエクセルシートのデータは以下のような作りにします。
さて、出力をCSVにするためには前述のプログラムをどう変更すればよいでしょうか?
まず、書き出すファイルの拡張子をcsvにします。
前述のプログラムでは一行ずつ縦に走査して順番に書き出していけばよかったのですが、今度はセル一つずつ横方向へ走査する必要がありますね。その際にデータとデータの間はカンマで区切ります。
それで、最後の列であるL列までいったら改行を入れます。
以上を踏まえたプログラムはこのようになります。
Sub writeCSV() Dim ws As Worksheet Set ws = ThisWorkbook.Worksheets(1) Dim csvFile As String csvFile = ActiveWorkbook.Path & "\data.csv" Open csvFile For Output As #1 Dim i, j As Long i = 1 Do While ws.Cells(i, 1).Value <> "" j = 1 Do While ws.Cells(i, j + 1).Value <> "" Print #1, ws.Cells(i, j).Value & ","; j = j + 1 Loop Print #1, ws.Cells(i, j).Value & vbCr; i = i + 1 Loop Close #1 MsgBox "data.csvに書き出しました" End Sub
全体の流れとしては
- 「data.csv」というファイル名でテキストファイルをオープン
- エクセルシートの終わりまで一行ずつ繰り返し
2-1. その行の終わりまで1セルずつ繰り返し
– テキストファイルに該当セルとカンマを出力
2-2. 改行コードを出力 - 「data.csv」をクローズ
となります。
ポイントについて以下解説をしていきますね。
改行をせずにCSVファイルに書き出す
19行目でPrintでセル一つとカンマ一つをセットでCSVファイルに出力をしているのですが
Print #番号, 変数;
というように最後にセミコロンをつけると改行をせずに書き出しをします。
セル一つ一つでいちいち改行をされちゃったら困りますからね。
17行目のDo Whileループはj+1が空白かどうかを見ていますから、24行目にたどりついたときは最後の列です。
ここではカンマの代わりに「vbCr」つまりキャリッジリターンの改行コードを追加することでCSVファイルに改行を書き込んでいます。
実行結果
上記プログラムを実行して出力されたCSVファイルを見てみますと
このように正しくCSVファイルとして出力されていますね。
まとめ
エクセルシートをCSVファイルに出力するVBAプログラムを作成しました。
ポイントはPrint命令で最後にセミコロンをつけるということにつきますね。
あとはカンマやvbCrなどCSVファイルのルールに合わせて適宜出力してあげればOKです。
次回以降も様々なテキストファイルを出力していきたいと思います。