在VBA中使用日期上的IsNumber函数的不同结果

时间:2017-04-29 13:59:53

标签: excel vba excel-vba excel-formula

假设单元格A1有一个日期:1/1/2017。

然后下面的宏会给出不同的结果:

  • first - True
  • 第二 - 错。

这种差异的原因是什么?我该如何正确使用IsNumeric?

Sub TestIsNumber()
    MsgBox WorksheetFunction.IsNumber(Cells(1, 1))
    MsgBox WorksheetFunction.IsNumber(Cells(1, 1).Value)
End Sub

1 个答案:

答案 0 :(得分:7)

.Value vs .Value2

当单元格格式化为日期时,.Value会将其转换为Variant/Date数据类型,而.Value2会返回其嵌入的数字数字(Variant/Double)。 .Value2要么返回字符串,数字或错误变体。它不会转换为日期或货币。

.Value2是读取单元格值的推荐方法,使​​用它来始终具有日期的数字表示,这更快,并且仍然允许您在VBA中操作它(将其与另一个日期进行比较,将其转换回来到Date数据类型等。)。

请注意,版本WorksheetFunction.IsNumber(Cells(1, 1))调用了Excel的Array version IsNumber(它与C ++中的函数重载类似,并且调用了最佳匹配的重载)。因此,Range Object作为参数发送到函数,而不是.Value(此处未发生对.value的隐式调用)。 Excel在嵌入式.Value2上工作,就像在另一个单元格中键入=IsNumber(A1)一样,在Excel中返回TRUE