在VBA中使用IsNumber函数Date中的不同结果

说单元格A1有一个date:1/1/2017。

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

  • 第一 – 真的
  • 第二 – 假。

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

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

这是.Value vs .Value2

当单元格格式化为date时, .Value将其转换为Variant/Date数据types,而.Value2返回其embedded的数字编号( Variant/Double )。 .Value2或者返回一个string,一个数字或者一个错误的变体。 它不会转换为date或货币。

.Value2是推荐的读取单元格值的方法,使用它总是有date的数字表示,这是更快的,仍然允许您在VBA中操作它(比较它到另一个date,将其转换回Date数据types等)。

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