需要有关不同Excel版本的Cdbl函数问题的帮助

时间:2019-02-18 18:31:49

标签: excel vba excel-2010 excel-2016

导出数据后,我有CSV,其数字类似; ,34 ; ,6483(理解为0,340,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 :(得分:0)

我认为这不是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文件中的数字匹配。