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でのデータ操作の精度が格段に向上します。ぜひ使い分けてみてください。
副業から独立まで「稼げる」Webスキルを習得する(PR)
ここまで読んでいただきありがとうございます。 最後に宣伝をさせてください。
「副業を始めたいが、何から手をつければいいかわからない」「独学でスキルはついたが、収益化できていない」という悩みを持つ方には、マンツーマン指導のWebスクール**「メイカラ」**が適しています。
このスクールは、単に技術を教えるだけでなく、**「副業として具体的にどう稼ぐか」**という実務直結のノウハウ提供に特化している点が特徴です。
講師陣は、実際に「副業Webライターから1年で独立して月収100万円」を達成したプロや、現役で利益を出し続けているブロガーなど、確かな実績を持つプレイヤーのみで構成されています。そのため、机上の空論ではない、現場で通用する戦術を学ぶことができます。
副業に特化した強み
- 最短ルートの提示: 未経験からでも実績を出せるよう、マンツーマンで指導。
- AI活用の習得: 副業の時間対効果を最大化するための、正しいAI活用スキルも網羅。
- 案件獲得のチャンス: 運営がWebマーケティング会社であるため、実力次第で社内案件の紹介など、仕事に直結する可能性があります。
受講者の多くは、「在宅でできる仕事を探している」「副業を頑張りたい」という20代・30代・40代が中心です。
受講前には、講師による無料説明が行われます。無理な勧誘はなく、自分に合った副業スタイルやプランを相談できるため、まずは話を聞いてみることから始めてみてはいかがでしょうか。
