Как обеспечить точку в качестве десятичного разделителя при экспорте Excel в CSV? - PullRequest
0 голосов
/ 15 января 2019

Я хочу экспортировать некоторые данные через Excel из VBA в CSV-файл и установить десятичный разделитель на точка (независимо от настроек языка или системы).

К настоящему времени у меня уже есть данные в файле Excel с точкой в ​​качестве десятичного разделителя. В некоторых системах он работает очень хорошо, но в других (например, в шведских системных настройках) десятичный разделитель отображается в виде запятой после экспорта в csv через excel vba.

Вот как выглядит мой фрагмент кода на данный момент:

' 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 голосов
/ 15 января 2019

Я использую последнюю официальную версию 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)

...