将excel导出到csv时如何确保点作为小数点分隔符?

时间:2019-01-15 12:19:57

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

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

现在,我已经在excel文件中保存了数据,并用点作为小数点分隔符。它在某些系统上效果很好,但在其他系统(例如瑞典的系统设置)上,通过excel vba导出到csv后,小数点分隔符显示为逗号。

这是我目前的相关代码段的外观:

' 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高级设置中更改分隔符,但对每个系统都无效。

如果有人可以给我提示以确保圆点的方法,我会很高兴!

1 个答案:

答案 0 :(得分:0)

我正在使用具有瑞典语区域设置的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