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サンプル

公式情報・一次情報

文書情報

記事タイトル
VBAでUTF-8を文字化けせず保存する ― ADODB.Streamを参照設定なしで使う
作成日
更新日
Source URL
https://papanda925.com/?p=15253

ライセンス: 本記事のうち、当サイトが権利を有する本文・自作図表は、特記なき限り CC BY 4.0 で利用できます。生成AIを活用して作成・編集した内容を含みます。コードについて、別途ライセンス表示またはリンク先GitHubリポジトリのライセンスがある場合は、その条件を優先します。引用・第三者資料・画像・商標等は本ライセンスの対象外です。 利用ポリシー

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