假设单元格A1有一个日期:1/1/2017。
然后下面的宏会给出不同的结果:
这种差异的原因是什么?我该如何正确使用IsNumeric?
Sub TestIsNumber()
MsgBox WorksheetFunction.IsNumber(Cells(1, 1))
MsgBox WorksheetFunction.IsNumber(Cells(1, 1).Value)
End Sub
答案 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
。