【ExcelVBA】シートの値をCSVファイルに書き込む方法

仕事効率化
スポンサーリンク

  • 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」が次のように出力されます。
01-VBACSVファイル書み込み結果イメージ 次に詳しい解説をしていきます。

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」には次の特徴があるので、覚えておきましょう。
  • 「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」の全要素を処理することができます。
02-VBACSVファイル書き込み行・列ループイメージ
        'シートの値を配列から定義
        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 & “,”;」
      • 値の後に「”,”」を追加
      • 末尾に「;」を指定しているので改行なし
03-VBACSVファイル書き込みPrintイメージ
Close #trgtNum
最後に「Close #trgtNum」で対象のファイルを閉じます。
  • Close #ファイル番号
以上で、シートの値をCSVファイルに出力することができました。

Openステートメントについて

サンプルコード内の「Open」ステートメントについて解説します。
  • Open ファイルフルパス For 目的 As #ファイル番号
サンプルコードでは「目的」の部分には「Output」を指定しましたが、指定できる引数には次のものがあります。
目的引数指定ファイルが見つかった時指定ファイルが見つからない時
読み込みInput読み込みのために開く実行時エラー
書き込みOutput初期化して開く(上書きされる)ファイル生成
追加Append既存データを保持して開く(上書きされない)ファイル生成
「Input」を使った読み込み処理については、下記で詳しく解説しているので、読んでみてください。

VBAでCSVを書き込む処理の注意点と応用

書き込み対象のファイルは上書きされる

サンプルコードの解説や「Open」ステートメントの解説でも紹介した通り「目的」を「Output」としてファイルを出力すると、ファイルは新規で生成され上書きされます。
04-VBACSVファイル書き込み上書き実行前イメージ
上記の特徴があるので、「Open」ステートメントの「目的」の使い分けは次のように行いましょう。
  • 目的に「Output」を指定
    • ex)毎日違うファイルにデータを出力しておきたい場合など
  • 目的に「Append」を指定
    • ex)同一ファイルに毎日データを追記しておきたい場合など

既存のファイルに追加で書き込む

紹介したデータ出力のサンプルコードは、ファイルがなければ生成し、ファイルがあれば新規ファイルで上書きすることを前提としています。

しかし、実務では、同じファイルにデータを追加していきたい場合もあります。次の画像のように、既存のファイルに追加で書き込む方法を紹介します。
05-VBACSVファイル追加書き込み実行前イメージ06-VBACSVファイル追加書き込み実行後イメージ
画像のように追加で書き込みをしたい場合は「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ファイル書き込みの注意と応用
  • 書き込み対象のファイルは上書きされる
  • 既存のファイルに追加で書き込む
できるだけ汎用性が高く、高速に処理できるように作っているので、まずはコピペして使ってみてください。