ExcelのデータをVBAでCSVファイルに出力する際、「日付が意図しないシリアル値になった」「”¥”マークや桁区切りカンマが消えてしまった」といった経験はありませんか? これは、VBAがセルの「中身の値(Value
)」を読み取っているために起こる現象です。
この記事では、セルの見た目、つまり表示されている書式や形式をそのまま保持してCSVファイルに書き出す方法を、具体的なコードと共に解説します。
この手法の鍵となる.Text
プロパティを理解すれば、思い通りのCSV出力を実現できます。
.Value
と .Text
の違い
本題に入る前に、VBAでセルを扱う上で非常に重要な.Value
と.Text
の違いについて理解しておく必要があります。
- .Value: セルに実際に格納されている元データです。計算などに使われる内部的な値です。
- .Text: セルの表示形式や書式が適用された結果、画面に見えている文字列です。
元のセルの表示 | .Value で取得される値 | .Text で取得される値 |
2025/08/09 | 45879 | "2025/08/09" |
¥15,000 | 15000 | "¥15,000" |
75% | 0.75 | "75%" |
00123 (文字列) | 123 | "00123" |
Google スプレッドシートにエクスポート
このように、**「見たままのデータ」**が欲しい場合は.Text
プロパティを使う必要があります。
完成したVBAコード
それでは、.Text
プロパティを利用して、表示されている値のままCSVに書き出すVBAコードです。元のコードに含まれていたいくつかのタイプミス(Colums
, Colose
など)は修正済みです。
Sub ExportDisplayedValueToCsv()
' 変数を宣言します
Dim outputCsvPath As String
Dim fileNum As Integer
Dim rowArray() As Variant
Dim exportRange As Range
Dim i As Long
Dim j As Long
' --- 設定箇所 ---
' 書き出したいセル範囲を指定します
Set exportRange = ThisWorkbook.Worksheets("Sheet1").Range("B2:F10")
' --- 設定ここまで ---
' 書き出すCSVファイルのパスとファイル名を指定します
outputCsvPath = ThisWorkbook.Path & "\DisplayedData.csv"
' 1行分のデータを格納する配列の要素数を、書き出し範囲の列数に合わせます
ReDim rowArray(1 To exportRange.Columns.Count)
' ファイル操作のためのファイル番号を取得します
fileNum = FreeFile
' 書き込みモードでファイルを開きます
Open outputCsvPath For Output As #fileNum
' 指定範囲の1行目から最終行までループします
For i = 1 To exportRange.Rows.Count
' 1行の中の1セル目から最終セルまでループします
For j = 1 To exportRange.Columns.Count
'「.Text」プロパティで"表示されている値"を配列に格納します
rowArray(j) = exportRange.Cells(i, j).Text
Next j
' Join関数で配列の中身をカンマで連結し、ファイルに1行書き込みます
Print #fileNum, Join(rowArray, ",")
Next i
' ファイルを閉じます
Close #fileNum
MsgBox "表示されている値のままCSVファイルに出力しました。"
End Sub
コードのポイント解説
上記のコードがどのように動作しているか、重要な部分を解説します。
① 書き出し範囲と配列の準備
Set exportRange = ThisWorkbook.Worksheets("Sheet1").Range("B2:F10")
ReDim rowArray(1 To exportRange.Columns.Count)
exportRange
に出力したいセル範囲を格納します。その後、ReDim
を使って、1行分のデータを一時的に入れておくための配列(rowArray
)のサイズを、書き出す範囲の列数に合わせて確保しています。
② 1行ずつループ処理
For i = 1 To exportRange.Rows.Count
' ... (行内の処理) ...
Next i
最初のFor
ループで、指定したexportRange
の1行目から最終行までを順番に処理していきます。
③ セルの値を配列に格納 (.Textを使用)
For j = 1 To exportRange.Columns.Count
rowArray(j) = exportRange.Cells(i, j).Text
Next j
内側のFor
ループで、現在処理している行(i
行目)のセルを左から右へ順番に処理します。 ここで最も重要なのが exportRange.Cells(i, j).Text
の部分です。前述の通り、.Text
プロパティを使うことで、セルの表示形式が適用された**「見たままの文字列」**を取得し、配列に格納しています。
④ Join関数でCSV行を作成し書き込み
Print #fileNum, Join(rowArray, ",")
1行分のセルの値を格納し終えた配列(rowArray
)を、Join
関数を使ってカンマ(,
)で連結します。これにより "値1,値2,値3..."
というCSV形式の文字列が効率的に作成され、Print #
でファイルに書き込まれます。
⑤ ファイルを閉じる
Close #fileNum
すべての行の書き込みが終わったら、Close
でファイルを確実に閉じます。これにより、すべてのデータがファイルに保存され、ファイルが安全に解放されます。
まとめ
Excel VBAでデータをファイルに出力する際に、セルの「見た目」をそのまま反映させたい場合は、.Value
の代わりに.Text
プロパティを使用することが解決策となります。
日付、通貨、パーセンテージ、ゼロ埋めした数値など、Excel上で整形された表示形式をそのまま人間が読むためのレポートとして出力したい場合に、この方法は非常に有効です。
.Value
と.Text
の違いを意識することで、VBAでのデータ操作の精度が格段に向上します。ぜひ使い分けてみてください。