Нужна помощь по проблеме с функцией Cdbl на разных версиях Excel - PullRequest
0 голосов
/ 18 февраля 2019

После экспорта данных у меня есть CSV с числами вроде ; ,34 ; ,6483 (понимаю, что это 0,34 или 0,6483).При использовании Excel 2010, я могу привести CDbl(",34"), и он работает нормально, но в Excel 2016, это говорит о проблеме несоответствия.Я здесь, потому что не могу понять, в чем проблема.

Уже измененный десятичный разделитель, не работает.

Dim arreglo() As String
'... filling the array...
arreglo(R, C) = one_line(C)

CDbl(arreglo(R, C))   '<--------------------

ОК в Excel 2010
Несоответствие в Excel 2016

1 Ответ

0 голосов
/ 19 февраля 2019

Я думаю, что это не разница между Excel 2010 и 2016, а проблема с десятичным разделителем, который устанавливается в операционной системе или в самом Excel.Поэтому убедитесь, что десятичный разделитель соответствует тому, который используется в CSV.

Например, если CSV использует запятую, то…

  1. Запомните исходное состояние десятичного разделителя.
  2. Измените Application.DecimalSeparator на то же, что и в CSV.
  3. Делайте свое дело.
  4. Верните его в исходное состояние (также, если произойдет ошибка).

Так что это будет примерно так:

Sub ImportCSV()
    'remember original state of decimal separator
    Dim OriginalUseSystemSeparators As Boolean
    OriginalUseSystemSeparators = Application.UseSystemSeparators
    Dim OriginalDecimalSeparator As String
    OriginalDecimalSeparator = Application.DecimalSeparator

    'change it to what you need for your CSV
    Application.UseSystemSeparators = False 'necessary otherwise next line is without effect!
    Application.DecimalSeparator = "," 'must match CSV decimal separator

    On Error Goto REVERT_DECIMAL 'in case of error we want to rever the old state
    'your code here
    MsgBox CDbl(",34") 'this should work now!

    'no Exit Sub here!
REVERT_DECIMAL:
    'revert it after 
    Application.UseSystemSeparators = OriginalUseSystemSeparators 
    Application.DecimalSeparator = OriginalDecimalSeparator 
    If Err.Number <> 0 Then
        Err.Raise Err.Number, Err.Source, Err.Description, Err.HelpFile, Err.HelpContext
    End If
End Sub

Обратите внимание, что при использовании этого подхода нет необходимости преобразовывать какие-либо числа.Если вы импортируете CSV, где я написал 'your code here, теперь он должен автоматически распознавать числа как числа, поскольку десятичный разделитель совпадает с разделителем в файле CSV.

...