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

Nic*_*las 7 excel vba excel-vba excel-formula

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

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

  • 第一 - 真的
  • 第二 - 错.

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

Sub TestIsNumber()
    MsgBox WorksheetFunction.IsNumber(Cells(1, 1))
    MsgBox WorksheetFunction.IsNumber(Cells(1, 1).Value)
End Sub
Run Code Online (Sandbox Code Playgroud)

A.S*_*S.H 7

这是.Value.Value2

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

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

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

  • @MacroMan`IsNumber`有一个数组版本,所以`WorksheetFunction.IsNumber(Cells(1,1))`没有隐式调用`.Value`. (3认同)
  • 好的ASH .Value2总是受到较少关注:) (2认同)