关于本文
本文是通过利用生成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テキスト]

コメント