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

Excel VBA复制数据存txt时小数分隔符被替换为点号问题

VBA导出txt时小数逗号被替换为点号问题解决方案

问题现象

  • 编写VBA宏实现指定工作表全量数据复制、导出为.txt格式文件的功能
  • 导出的txt文件中,原表内以逗号作为小数分隔符的十进制数值,被自动替换为点号分隔,多次调整配置均未修复

原问题代码

Dim myPath As String, myFile As String
    myPath = ThisWorkbook.Path & "\"
    myFile = Application.UserName + "_SAP_árlista_betöltő_" + Format(Now(), "YYYY_MM_DD_hhmmss") & ".txt"
    Dim WB As Workbook, newWB As Workbook
    Set WB = ThisWorkbook
    Application.ScreenUpdating = False
    Set newWB = Workbooks.Add
    WB.ActiveSheet.UsedRange.Copy newWB.Sheets(1).Range("A1")
    With newWB
        Application.DisplayAlerts = False
        .SaveAs Filename:=myPath & myFile, FileFormat:=xlTextWindows
        .Close True
        Application.DisplayAlerts = True
    End With
    WB.Save
    Application.ScreenUpdating = True
    Range("A1:J670").Select
    Selection.ClearContents
    Range("A1").Select
    MsgBox "Az adatok mentésre kerültek!"
End Sub

问题根因

调用SaveAs方法选择xlTextWindows格式导出时,Excel会自动读取当前应用/系统默认的小数分隔符配置,对数值类型单元格的内容做格式转换,不会保留工作表中原本显示的逗号分隔格式;复制到新工作簿的单元格如果保留数值类型,就会触发这个自动转换逻辑。

可行解决方法

方法1:临时切换Excel小数分隔符配置(改动量小)

在执行保存txt的逻辑前,临时关闭系统分隔符读取,将小数分隔符手动指定为逗号,保存完成后再恢复原有配置即可,核心调整代码如下:

' 保存前临时修改分隔符配置
Application.UseSystemSeparators = False
Application.DecimalSeparator = ","

With newWB
    Application.DisplayAlerts = False
    .SaveAs Filename:=myPath & myFile, FileFormat:=xlTextWindows
    .Close True
    Application.DisplayAlerts = True
End With

' 保存完成后恢复原有配置
Application.UseSystemSeparators = True

注意:这个方法会临时改动Excel的全局分隔符设置,如果代码运行中途报错中断,可能会导致后续Excel操作的分隔符不符合预期,建议搭配错误处理逻辑使用。

方法2:直接按单元格显示内容拼接文本输出(稳定性最高)

不依赖Excel自带的txt导出逻辑,直接逐行读取源工作表单元格的显示文本(即.Text属性,和工作表内肉眼看到的内容完全一致),按制表符拼接列内容后写入txt文件,完全不会触发自动格式转换,参考完整代码如下:

Dim myPath As String, myFile As String
Dim ws As Worksheet
Dim fNum As Integer
Dim lastRow As Long, lastCol As Long
Dim i As Long, j As Long
Dim lineText As String

myPath = ThisWorkbook.Path & "\"
myFile = Application.UserName + "_SAP_árlista_betöltő_" + Format(Now(), "YYYY_MM_DD_hhmmss") & ".txt"
Set ws = ThisWorkbook.ActiveSheet
Application.ScreenUpdating = False

' 获取已用区域范围
lastRow = ws.UsedRange.Rows.Count
lastCol = ws.UsedRange.Columns.Count

' 打开文件用于写入
fNum = FreeFile()
Open myPath & myFile For Output As #fNum

' 逐行逐列读取单元格显示内容拼接
For i = 1 To lastRow
    lineText = ""
    For j = 1 To lastCol
        If j > 1 Then lineText = lineText & vbTab ' 制表符分隔列,和原xlTextWindows导出格式一致
        lineText = lineText & ws.Cells(i, j).Text
    Next j
    Print #fNum, lineText
Next i

' 关闭文件
Close #fNum

' 原有清空内容、弹窗提示逻辑
ws.Range("A1:J670").ClearContents
ws.Range("A1").Select
Application.ScreenUpdating = True
MsgBox "Az adatok mentésre kerültek!"

该方法不需要新建临时工作簿,也不会改动任何Excel全局配置,不会出现分隔符被自动替换的问题。


内容的提问来源于stack exchange,提问作者bajor14

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 03:57:22