【Excel VBA】セルの書式や表示形式を維持したままCSV出力する方法(.Textプロパティ)

ExcelのデータをVBAでCSVファイルに出力する際、「日付が意図しないシリアル値になった」「”¥”マークや桁区切りカンマが消えてしまった」といった経験はありませんか? これは、VBAがセルの「中身の値(Value)」を読み取っているために起こる現象です。

この記事では、セルの見た目、つまり表示されている書式や形式をそのまま保持してCSVファイルに書き出す方法を、具体的なコードと共に解説します。

この手法の鍵となる.Textプロパティを理解すれば、思い通りのCSV出力を実現できます。


目次

.Value.Text の違い

本題に入る前に、VBAでセルを扱う上で非常に重要な.Value.Textの違いについて理解しておく必要があります。

  • .Value: セルに実際に格納されている元データです。計算などに使われる内部的な値です。
  • .Text: セルの表示形式や書式が適用された結果、画面に見えている文字列です。
元のセルの表示.Valueで取得される値.Textで取得される値
2025/08/0945879"2025/08/09"
¥15,00015000"¥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でのデータ操作の精度が格段に向上します。ぜひ使い分けてみてください。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

私が勉強したこと、実践したこと、してることを書いているブログです。
主に資産運用について書いていたのですが、
最近はプログラミングに興味があるので、今はそればっかりです。

目次