Excel VBAで作成したCSVファイルをWebシステムにアップロードしたり、異なるOSのPCで開いたりした際に、文字が「???」のように表示される**「文字化け」**に悩まされた経験はありませんか?
これは、Excelが標準で出力するCSVの文字コード(Shift_JISなど)と、相手のシステムが想定している文字コード(UTF-8など)が異なるために発生します。
この記事では、文字化けを根本から解決するため、VBAで「ADODB.Stream」オブジェクトを利用して、文字コードを「UTF-8」に指定してCSVファイルを出力する確実な方法を解説します。
ADODB.Streamとは?
「ADODB.Stream」とは、VBAでテキストやバイナリといったデータの流れ(ストリーム)を柔軟に扱うためのオブジェクトです。データベース接続ライブラリ(ADODB)の一部ですが、データベースとは無関係にファイル操作にも利用できます。
これを使う最大のメリットは、ファイルの文字コード(Charset)を自由に指定できる点にあり、UTF-8形式のファイルを作成する際の最も強力な手段となります。
完成したVBAコード
以下が、ADODB.Streamを利用してUTF-8形式のCSVファイルを出力する完成版のコードです。
Sub ExportCsvAsUtf8()
' 変数を宣言します
Dim utf8CsvPath As String
Dim sourceDataRange As Range
Dim i As Long
Dim rowDataArray As Variant
' --- 設定箇所 ---
' 書き出したいセル範囲を指定します
Set sourceDataRange = ThisWorkbook.Worksheets("Sheet1").Range("B2:F10")
' --- 設定ここまで ---
' 書き出すCSVファイルのパスとファイル名を指定します
utf8CsvPath = ThisWorkbook.Path & "\UTF8_ExportData.csv"
' ADODB.Streamオブジェクトを生成して処理します
With CreateObject("ADODB.Stream")
' --- Streamオブジェクトの設定 ---
.Type = 2 ' 2はadTypeText。テキストデータを扱うモードに設定
.Charset = "UTF-8" ' 文字コードをUTF-8に設定
.Open ' ストリームを開く
' --- データの書き込み ---
For i = 1 To sourceDataRange.Rows.Count
' 1行分の値を取得し、Transposeを2回使って1次元配列に変換
rowDataArray = sourceDataRange.Rows(i).Value
rowDataArray = WorksheetFunction.Transpose(WorksheetFunction.Transpose(rowDataArray))
' Joinでカンマ区切りの文字列にし、改行付きでストリームに書き込む
.WriteText Join(rowDataArray, ","), 1 ' 1はadWriteLine。改行付きで書き込む
Next i
' --- ファイルへの保存と後処理 ---
.SaveToFile utf8CsvPath, 2 ' 2はadSaveCreateOverWrite。同名ファイルがあれば上書き保存
.Close ' ストリームを閉じる
End With
MsgBox "UTF-8形式でのCSVファイル出力が完了しました。"
End Sub
コードのポイント解説
① ADODB.Streamオブジェクトの作成
With CreateObject("ADODB.Stream")
' ...
End With
CreateObject("ADODB.Stream")
で、ADODB.Streamオブジェクトを生成します。With
ブロックを使うことで、以降.
から始まるプロパティやメソッドの記述を簡潔にしています。
② Streamの設定 (.Type, .Charset)
.Type = 2 ' 2はadTypeText。テキストデータを扱うモードに設定
.Charset = "UTF-8" ' 文字コードをUTF-8に設定
.Open ' ストリームを開く
ストリームにデータを書き込む前に、どのような種類のデータを、どの文字コードで扱うかを設定します。
- .Type = 2: ストリームが扱うデータの種類を「テキスト」に設定します。(
adTypeText
という定数に相当) - .Charset = “UTF-8”: このストリームの文字コードを「UTF-8」に設定します。これが文字化けを防ぐための核心部分です。
- .Open: 設定が終わったら、ストリームを開いて書き込み可能な状態にします。
③ データの書き込み (.WriteText)
.WriteText Join(rowDataArray, ","), 1
For
ループで1行ずつデータを取り出し、.WriteText
メソッドでストリームに書き込んでいきます。 第一引数には書き込む文字列(Join
関数で作成したカンマ区切りの文字列)を指定します。 第二引数の1
は、文字列の末尾に改行コードを自動で付加するオプション(adWriteLine
)です。これにより、1行ずつ確実に改行されたテキストが生成されます。
④ ファイルへの保存と後処理 (.SaveToFile, .Close)
.SaveToFile utf8CsvPath, 2
.Close
メモリ上のストリームに全てのデータを書き込み終えたら、.SaveToFile
メソッドでファイルとして保存します。 第二引数の2
は、同名のファイルが存在した場合に上書き保存するオプション(adSaveCreateOverWrite
)です。
最後に、.Close
でストリームを閉じてリソースを解放します。これは必須の処理です。
まとめ
Excel VBAで文字化けしないCSVファイルを作成するには、ADODB.Stream
オブジェクトの利用が最も確実で推奨される方法です。
少し複雑に見えるかもしれませんが、.Charset = "UTF-8"
と指定するだけで、Webシステムや最新のアプリケーションとの連携において信頼性の高いデータファイルを作成できます。文字化けに悩まされている方は、ぜひこの方法をお試しください。