VBAでUTF-8を文字化けせず保存する ― ADODB.Streamを参照設定なしで使う

VBA・Officeカテゴリを表すパンダのイラスト VBA・Office

この記事について
この記事は、生成AIを活用した自動生成フローで作成しています。Microsoft LearnのADO Stream / Charset仕様を確認し、VBAからUTF-8テキストを保存するTIPSとして整理しています。

検証ステータス:📘 公式仕様確認済み・VBAサンプル実装済み・Excel実機未確認

VBAでUTF-8を文字化けせず保存する ― ADODB.Streamを参照設定なしで使う

VBAでCSVやJSONを書き出すとき、「日本語が文字化けした」「相手システムはUTF-8だった」という問題が起きることがあります。

Windowsで利用できるADOの Stream オブジェクトは、Charset を指定してテキストを保存できます。

Late Bindingなら参照設定を追加しない

Dim stream As Object

' CreateObjectを使うLate Bindingなので、
' VBEの参照設定へADOを追加しなくても試せます。
Set stream = CreateObject("ADODB.Stream")

' Type=2 は「テキストとして扱う」というADOの定数値です。
stream.Type = 2
stream.Open

' Charsetを設定する前にPositionを先頭へ戻します。
' ADO StreamではCharset変更時の位置が重要です。
stream.Position = 0
stream.Charset = "utf-8"

' VBAのStringを書き込みます。
stream.WriteText "日本語とEnglish"

' 第2引数=2 は、同名ファイルを上書きする指定です。
stream.SaveToFile "C:\Temp\sample.txt", 2

' COMオブジェクトが開いたStreamを最後に閉じます。
stream.Close

Type = 2 はテキストStream、SaveToFile の第2引数 2 は既存ファイルを上書きする指定です。

CharsetはPosition=0で設定する

MicrosoftのADO仕様では、開いているStreamのCharsetを設定するには現在位置が先頭である必要があります。そのため、サンプルでも Position = 0 を明示しています。

BOMありUTF-8になる点に注意

ADODB.Streamで Charset = "utf-8" を使う方法は、UTF-8 BOM付きファイルとして扱われるケースが一般的です。

ExcelやWindows系ツールでは都合がよいこともありますが、外部システムが「UTF-8 BOMなし」を厳密に要求するなら、別途BOMを除く処理が必要です。

参照設定あり/なしの違い

参照設定でADOを追加すれば ADODB.Stream と型指定できます。一方、今回のように CreateObject("ADODB.Stream") を使えばLate Bindingとなり、ブック側の参照設定を増やさずに済みます。

flowchart LR
    A[VBA文字列] --> B[ADODB.Stream]
    B --> C[Charset=utf-8]
    C --> D[SaveToFile]
    D --> E[UTF-8テキスト]

GitHubサンプル

公式情報・一次情報

ライセンス:本記事のテキスト/コードは特記なき限り CC BY 4.0 です。引用の際は出典URL(本ページ)を明記してください。
利用ポリシー もご参照ください。

コメント

タイトルとURLをコピーしました