You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何修改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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.28 17:27:51