【问题标题】:How to ensure dot as decimal separator when exporting excel to csv?将excel导出到csv时如何确保点作为小数点分隔符?
【发布时间】:2019-06-09 10:59:47
【问题描述】:

我想通过 vba 将一些数据从 excel 导出到 csv 文件,并将小数点分隔符设置为 dot(独立于本地语言或系统设置)。

现在我已经在 excel 文件中有数据,其中一个点作为小数分隔符。它在某些系统上运行良好,但在其他系统上(例如瑞典系统设置),通过 excel vba 导出到 csv 后,小数分隔符显示为逗号。

这是我的相关代码 sn-p 目前的样子:

' Set Export Parameters
Application.DecimalSeparator = "."
Application.ThousandsSeparator = ""
Application.UseSystemSeparators = False
ActiveSheet.Range("D4:G1048571").NumberFormat = "0.00"

' Open (new) output file
Open fileSaveName For Output As #1

' Write date upfront
Print #1, Trim(Worksheets("Output - Upload generator").Range("A2:A2"))

' Set data range for output
Set myrng = Worksheets("Output - Upload generator").Range("A3:G" & lastExportRow)

' Write data
For i = 1 To myrng.Rows.count
    For j = 1 To myrng.Columns.count
        lineText = IIf(j = 1, "", lineText & ";") & myrng.Cells(i, j).Text
    Next j
    Print #1, lineText
Next i

' Close output file
Close #1

到目前为止,在某些系统上使用点作为小数分隔符成功导出,但并非在每个系统上独立于本地设置(例如瑞典语设置 - 小数分隔符显示为逗号)。因为我已经尝试了几件事,比如在 excel 高级设置中更改分隔符,但对每个系统都不起作用。

我会很高兴,如果有人可以给我一个提示,我该怎么做才能确保点!

【问题讨论】:

  • 澄清一下:“显示”是指在文本编辑器中查看的生成文件,而不是在 Excel 中打开该文件时的样子再来一次?
  • @mbj 是的,当然。我说的是生成文件中的结果,用文本编辑器打开。
  • 您使用的是什么版本的 Excel?设置 Application.DecimalSeparator = "."Application.UseSystemSeparators = False 对我有用,我正在使用瑞典区域设置运行 Excel。我有 Excel 版本 1812 的 Office 365。
  • @mbj 好的,我明白了。就我而言,正在使用 Microsoft Excel for Office 365 MSO (16.0.11126.20192) 32 位。

标签: excel vba export-to-csv decimal-point


【解决方案1】:

我正在使用具有瑞典区域设置的最新官方版 Excel(Office 365,Excel 版本 1812),这对我有用:

Dim myCell As Range    
Set myCell = ActiveSheet.Range("A1")
myCell.Value = CDbl(9999.999)

Application.DecimalSeparator = "."
Application.UseSystemSeparators = False

myCell.NumberFormat = "0.00"
Debug.Print "Cell Value: " & myCell.Value   '9999,999
Debug.Print "Cell Text: " & myCell.Text     '10000.00

我希望以上内容适用于支持此代码的任何 Excel 版本,但如果您需要解决方法,您可以随时这样做:

首先,从 Windows 区域设置中获取小数点分隔符:

Dim myShell, regDecSep    
Set myShell = CreateObject("WScript.Shell")
regDecSep = myShell.RegRead("HKCU\Control Panel\International\sDecimal")

Debug.Print "System decimal separator: " & regDecSep

然后,在处理工作表时,检查当前单元格中的值是什么类型,如果是数字,使用Replace函数修复分隔符:

Dim cellText    
cellText = myCell.Text

If regDecSep <> "." Then
    If TypeName(myCell.Value) = "Double" Then
        Debug.Print "Replacing the decimal separator"
        cellText = Replace(cellText, regDecSep, ".")
    End If
End If

Debug.Print "Result: " & cellText

(注意,检查类型时需要使用单元格的Value,而不是Text

【讨论】:

  • 非常感谢您的快速回复和宝贵的反馈。我今天会尝试你的解决方案,如果这对我有用,我会提供反馈。
  • 我现在已经集成了您的第二种解决方案方法,如果系统小数分隔符被手动替换为点,它在瑞典系统以及具有其他语言设置的系统上都可以正常工作。非常感谢,非常感谢您的帮助。
猜你喜欢
  • 2017-06-23
  • 1970-01-01
  • 2015-04-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-05-12
相关资源
最近更新 更多