如何修改Excel VBA宏导出UTF-8编码带双引号的CSV文件
VBA导出带双引号的UTF-8编码CSV方案
原官方提供的宏使用VBA原生文件操作语句输出文件,默认调用系统本地ANSI编码写入,不支持指定UTF-8字符集,会导致特殊字符存储值异常、跨程序打开乱码。案例中ä存储为单字节8A是当前系统非Unicode程序代码页的映射结果,和标准单字节编码、UTF-8编码的存储值均不匹配,因此仅能自动识别本地代码页的Excel可正常读取,其他程序解码时会出现�乱码。
修改后的完整代码
核心是替换原生文件操作为ADODB.Stream对象,该对象支持手动指定写入编码,可直接输出符合要求的UTF-8格式CSV,无需额外引用依赖,兼容所有Excel版本:
Sub QuoteCommaExport() ' 定义变量 Dim DestFile As String Dim ColumnCount As Long Dim RowCount As Long Dim objStream As Object Dim lineText As String ' 弹窗获取用户输入的保存路径 DestFile = InputBox("Enter the destination filename" _ & Chr(10) & "(with complete path):", "Quote-Comma Exporter") If DestFile = "" Then Exit Sub ' 用户点击取消直接退出宏 ' 初始化UTF-8写入流 Set objStream = CreateObject("ADODB.Stream") With objStream .Charset = "utf-8" .Mode = 3 ' 开启读写模式 .LineSeparator = -1 ' 使用CRLF作为换行符,适配Windows系统 .Open End With ' 开启错误捕获,处理路径无权限、磁盘满等异常 On Error Resume Next ' 遍历选中区域的每一行 For RowCount = 1 To Selection.Rows.Count lineText = "" ' 遍历当前行的每一列 For ColumnCount = 1 To Selection.Columns.Count ' 给单元格内容包裹双引号,字段间用逗号分隔 lineText = lineText & """" & Selection.Cells(RowCount, ColumnCount).Text & """" If ColumnCount < Selection.Columns.Count Then lineText = lineText & "," End If Next ColumnCount ' 将拼接好的整行内容写入流,自动追加换行 objStream.WriteText lineText, 1 Next RowCount ' 将流内容写入目标文件,参数2代表覆盖已存在的同名文件 objStream.SaveToFile DestFile, 2 objStream.Close Set objStream = Nothing ' 写入异常提示 If Err <> 0 Then MsgBox "Cannot write to filename " & DestFile Err.Clear End If On Error GoTo 0 End Sub
可选调整项
- 如果需要输出无BOM的UTF-8文件(适配部分不识别UTF-8 BOM的第三方程序),可以在
SaveToFile逻辑前加入如下代码,跳过UTF-8 BOM占用的前3个字节:' 移动指针跳过BOM头 objStream.Position = 3 Dim objStreamNoBom As Object Set objStreamNoBom = CreateObject("ADODB.Stream") With objStreamNoBom .Mode = 3 .Type = 1 ' 二进制模式 .Open End With objStream.CopyTo objStreamNoBom objStream.Close ' 后续替换为objStreamNoBom调用SaveToFile即可 objStreamNoBom.SaveToFile DestFile, 2 objStreamNoBom.Close Set objStreamNoBom = Nothing - 默认代码输出的是带UTF-8 BOM的CSV,该格式对Excel兼容性最好,双击打开不会出现编码乱码问题。
内容的提问来源于stack exchange,提问作者Chuck Le Butt
相关产品推荐
相关产品推荐

