この記事について
この記事は、生成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テキスト]

コメント