【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でのデータ操作の精度が格段に向上します。ぜひ使い分けてみてください。

副業から独立まで「稼げる」Webスキルを習得する(PR)

ここまで読んでいただきありがとうございます。 最後に宣伝をさせてください。

「副業を始めたいが、何から手をつければいいかわからない」「独学でスキルはついたが、収益化できていない」という悩みを持つ方には、マンツーマン指導のWebスクール**「メイカラ」**が適しています。

このスクールは、単に技術を教えるだけでなく、**「副業として具体的にどう稼ぐか」**という実務直結のノウハウ提供に特化している点が特徴です。

講師陣は、実際に「副業Webライターから1年で独立して月収100万円」を達成したプロや、現役で利益を出し続けているブロガーなど、確かな実績を持つプレイヤーのみで構成されています。そのため、机上の空論ではない、現場で通用する戦術を学ぶことができます。

副業に特化した強み

  • 最短ルートの提示: 未経験からでも実績を出せるよう、マンツーマンで指導。
  • AI活用の習得: 副業の時間対効果を最大化するための、正しいAI活用スキルも網羅。
  • 案件獲得のチャンス: 運営がWebマーケティング会社であるため、実力次第で社内案件の紹介など、仕事に直結する可能性があります。

受講者の多くは、「在宅でできる仕事を探している」「副業を頑張りたい」という20代・30代・40代が中心です。

受講前には、講師による無料説明が行われます。無理な勧誘はなく、自分に合った副業スタイルやプランを相談できるため、まずは話を聞いてみることから始めてみてはいかがでしょうか。

ブログで稼ぎたいなら「メイカラ」

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

この記事を書いた人

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

目次