【Excel VBA】文字化け知らず!UTF-8でCSVファイルを出力する方法(ADODB.Stream)

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システムや最新のアプリケーションとの連携において信頼性の高いデータファイルを作成できます。文字化けに悩まされている方は、ぜひこの方法をお試しください。

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

この記事を書いた人

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

目次