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
相关产品推荐
相关产品推荐

