Я думаю, что это не разница между Excel 2010 и 2016, а проблема с десятичным разделителем, который устанавливается в операционной системе или в самом Excel.Поэтому убедитесь, что десятичный разделитель соответствует тому, который используется в CSV.
Например, если CSV использует запятую, то…
- Запомните исходное состояние десятичного разделителя.
- Измените
Application.DecimalSeparator
на то же, что и в CSV. - Делайте свое дело.
- Верните его в исходное состояние (также, если произойдет ошибка).
Так что это будет примерно так:
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.