- VBAでシートの値をCSVファイルに書き込むにはどうすればいいの?
- シートの値を自動でCSVファイルに出力したい
- できるだけ処理を高速にしたい
そこで今回は、VBAでシートの値をCSVファイルに書き込む方法について紹介します。
配列も使ってできるだけ高速な処理になるように、また最低限の修正で済むように作ってあるので、コピペして使ってみてください。
VBAでシートの値をCSVに書き込むサンプルコード
'出力対象シートを定義
Dim trgtSh As Worksheet
Set trgtSh = ThisWorkbook.Worksheets("サンプル")
'対象シートの1列目の最終行を取得
Dim trgtLastRow As Long
trgtLastRow = trgtSh.Cells(trgtSh.Rows.Count, 1).End(xlUp).Row
'1列目から4列目の1行目から最終行までを定義
Dim trgtRng As Range
Set trgtRng = trgtSh.Range(trgtSh.Cells(1, 1), trgtSh.Cells(trgtLastRow, 4))
'対象範囲の値を配列に格納
Dim outputAry As Variant
outputAry = trgtRng.Value
'保存ファイル名を定義
Dim outputFile As String
outputFile = "C:\Sample\outputSample.csv"
'空番号を取得
Dim trgtNum As Long
trgtNum = FreeFile
'書き込みのためにファイルを開く(ファイルがなければ作成される)
Open outputFile For Output As #trgtNum
Dim i As Long
Dim j As Long
Dim trgtVal As String
'行方向の要素数分ループ
For i = LBound(outputAry, 1) To UBound(outputAry, 1)
'列方向の要素数分ループ
For j = LBound(outputAry, 2) To UBound(outputAry, 2)
'シートの値を配列から定義
trgtVal = outputAry(i, j)
'値をファイルに書き込み
If j = UBound(outputAry, 2) Then
'最終列なら、「;」をつけない(「";"」をつけると、改行なしで書き込み)
Print #trgtNum, trgtVal
Else
'最終列でなければ、値の後に「","」末尾に「";"」をつける(「";"」をつけると、改行なしで書き込み)
Print #trgtNum, trgtVal & ",";
End If
Next
Next
Close #trgtNum
上記サンプルコードを実行すると「サンプル」シートが画像の値を保持している時「outputSample.csv」が次のように出力されます。次に詳しい解説をしていきます。
VBAでシートの値をCSVに書き込むコードの解説
'出力対象シートを定義
Dim trgtSh As Worksheet
Set trgtSh = ThisWorkbook.Worksheets("サンプル")
まず初めに、対象となるシートを「trgtSh」に定義します。'対象シートの1列目の最終行を取得
Dim trgtLastRow As Long
trgtLastRow = trgtSh.Cells(trgtSh.Rows.Count, 1).End(xlUp).Row
次に、対象シート1列目の最終行を「trgtLastRow」を定義します。この時、最終行を求めるために「Rows.Count」と「End」プロパティを使用します。「Rows.Count」で対象シートの全行数、つまりシートの最下行を指定、そこからCtrl + ↑を意味する「End(xlUp)」でデータがある最終行を取得しています。
最終行取得については、関数化等も含めて下記で詳しく解説しているので、読んでみてください。
'1列目から4列目の1行目から最終行までを定義
Dim trgtRng As Range
Set trgtRng = trgtSh.Range(trgtSh.Cells(1, 1), trgtSh.Cells(trgtLastRow, 4))
'対象範囲の値を配列に格納
Dim outputAry As Variant
outputAry = trgtRng.Value
取得した対象シート「trgtSh」と最終行「trgtLastRow」を使用して「サンプル」シートの1列目から4列目の最終行までのセル範囲を「trgtRng」に定義します。そして「trgtRng」に定義したセル範囲の値を配列「outputAry」に代入しています。
'保存ファイル名を定義
Dim outputFile As String
outputFile = "C:\Sample\outputSample.csv"
次に、出力するCSVファイルをフルパスで変数「outputFile」に定義します。'空番号を取得
Dim trgtNum As Long
trgtNum = FreeFile
このあとの「Open」メソッド処理では、開く対象にファイル番号を指定する必要があります。このファイル番号は重複すると実行時エラーとなります。そこで重複しない番号を取得できる「FreeFile」関数を変数「trgtNum」に定義して、ファイル番号として使用します。
'書き込みのためにファイルを開く(ファイルがなければ作成される)
Open outputFile For Output As #trgtNum
次に「Open」メソッドで「trgtFile」を書き込むため(「For Output」)に開きます。- Open ファイルフルパス For 目的 As #ファイル番号
- 「Open」メソッドの「For Output」の特徴
- 指定したファイルがない場合、出力ファイルが新たに作成される
- 指定したファイルがある場合、出力ファイルが上書きされる
Dim i As Long
Dim j As Long
Dim trgtVal As String
'行方向の要素数分ループ
For i = LBound(outputAry, 1) To UBound(outputAry, 1)
'列方向の要素数分ループ
For j = LBound(outputAry, 2) To UBound(outputAry, 2)
この後の処理で使用する各種変数「i」「j」「trgtVal」を宣言します。その後、配列「outputAry」の行方向と列方向にそれぞれ「For Next」を実行しています。これで「outputAry」の全要素を処理することができます。
'シートの値を配列から定義
trgtVal = outputAry(i, j)
'値をファイルに書き込み
If j = UBound(outputAry, 2) Then
'最終列なら、「;」をつけない(「";"」をつけると、改行なしで書き込み)
Print #trgtNum, trgtVal
Else
'最終列でなければ、値の後に「","」末尾に「";"」をつける(「";"」をつけると、改行なしで書き込み)
Print #trgtNum, trgtVal & ",";
End If
Next
Next
繰り返し処理のはじめに、まず書き込む対象の値を変数「trgtVal」に定義します。続いて「If」文を使って条件分岐させ「Print」ステートメントで値を書き込んでいます。
- Print #ファイル番号, 書き込む値
- 「j = UBound(outputAry, 2)」である場合
- 列方向の最後の要素なので改行が必要
- 「Print #trgtNum, trgtVal」
- 末尾に何も指定していないので改行あり
- 「j = UBound(outputAry, 2)」でない場合
- 列方向の途中の要素なので改行が不要
- 「Print #trgtNum, trgtVal & “,”;」
- 値の後に「”,”」を追加
- 末尾に「;」を指定しているので改行なし
Close #trgtNum
最後に「Close #trgtNum」で対象のファイルを閉じます。- Close #ファイル番号
Openステートメントについて
サンプルコード内の「Open」ステートメントについて解説します。- Open ファイルフルパス For 目的 As #ファイル番号
目的 | 引数 | 指定ファイルが見つかった時 | 指定ファイルが見つからない時 |
---|---|---|---|
読み込み | Input | 読み込みのために開く | 実行時エラー |
書き込み | Output | 初期化して開く(上書きされる) | ファイル生成 |
追加 | Append | 既存データを保持して開く(上書きされない) | ファイル生成 |
VBAでCSVを書き込む処理の注意点と応用
書き込み対象のファイルは上書きされる
サンプルコードの解説や「Open」ステートメントの解説でも紹介した通り「目的」を「Output」としてファイルを出力すると、ファイルは新規で生成され上書きされます。上記の特徴があるので、「Open」ステートメントの「目的」の使い分けは次のように行いましょう。
- 目的に「Output」を指定
- ex)毎日違うファイルにデータを出力しておきたい場合など
- 目的に「Append」を指定
- ex)同一ファイルに毎日データを追記しておきたい場合など
既存のファイルに追加で書き込む
紹介したデータ出力のサンプルコードは、ファイルがなければ生成し、ファイルがあれば新規ファイルで上書きすることを前提としています。しかし、実務では、同じファイルにデータを追加していきたい場合もあります。次の画像のように、既存のファイルに追加で書き込む方法を紹介します。
画像のように追加で書き込みをしたい場合は「Open」ステートメントの「目的」を次のように変更します。
'書き込みのためにファイルを開く(ファイルがなければ作成される)
Open outputFile For Append As #trgtNum
- 既存ファイルに追加で書き込む
- Open outputFile For Append As #trgtNum
- 新規ファイルに書き込む
- Open outputFile For Output As #trgtNum
'出力対象シートを定義
Dim trgtSh As Worksheet
Set trgtSh = ThisWorkbook.Worksheets("サンプル")
'対象シートの1列目の最終行を取得
Dim trgtLastRow As Long
trgtLastRow = trgtSh.Cells(trgtSh.Rows.Count, 1).End(xlUp).Row
'1列目から4列目の1行目から最終行までを定義
Dim trgtRng As Range
Set trgtRng = trgtSh.Range(trgtSh.Cells(1, 1), trgtSh.Cells(trgtLastRow, 4))
'対象範囲の値を配列に格納
Dim outputAry As Variant
outputAry = trgtRng.Value
'保存ファイル名を定義
Dim outputFile As String
outputFile = "C:\Sample\outputSample.csv"
'空番号を取得
Dim trgtNum As Long
trgtNum = FreeFile
'書き込みのためにファイルを開く(ファイルがなければ作成される)
Open outputFile For Append As #trgtNum
Dim i As Long
Dim j As Long
Dim trgtVal As String
'行方向の要素数分ループ
For i = LBound(outputAry, 1) To UBound(outputAry, 1)
'列方向の要素数分ループ
For j = LBound(outputAry, 2) To UBound(outputAry, 2)
'シートの値を配列から定義
trgtVal = outputAry(i, j)
'値をファイルに書き込み
If j = UBound(outputAry, 2) Then
'最終列なら、「;」をつけない(「";"」をつけると、改行なしで書き込み)
Print #trgtNum, trgtVal
Else
'最終列でなければ、値の後に「","」末尾に「";"」をつける(「";"」をつけると、改行なしで書き込み)
Print #trgtNum, trgtVal & ",";
End If
Next
Next
Close #trgtNum
VBAでCSVを書き込むまとめ
今回はVBAでシートの値をCSVファイルに出力する方法と下記の注意と応用について紹介しました。VBAでのCSVファイル書き込みの注意と応用
できるだけ汎用性が高く、高速に処理できるように作っているので、まずはコピペして使ってみてください。- 書き込み対象のファイルは上書きされる
- 既存のファイルに追加で書き込む