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:Tempsample.txt", 2

' 最后关闭COM对象打开的Stream。
stream.Close

Type = 2 是文本Stream,SaveToFile 的第2个参数 2 是覆盖已有文件的指定。

在 Position=0 时设置 Charset

根据Microsoft的ADO规范,要设置打开的Stream的Charset,当前位置必须在头部。因此,在示例中也显式指定了 Position = 0

注意会变成带BOM的UTF-8

通过ADODB.Stream使用 Charset = "utf-8" 的方法,通常会被视为带UTF-8 BOM的文件。

虽然这对于Excel或Windows系工具来说很方便,但如果外部系统严格要求“无BOM UTF-8”,则需要额外进行去除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已复制