默认的Range属性会产生意外的结果

作为后续问题,我在这里发布的答案,我想知道为什么以下不会错误,这是VBA中的一个可能的错误?

采取以下数据:

示例数据集
如果我们使用下面的VBA代码,我们会收到一个错误,因为我们需要使用date的数字值来匹配:

'//Produces error Debug.Print WorksheetFunction.Match(Range("C3").Value, Range("A1:A14"), 0) 

所以这些陈述中的任何一个都可以工作:

 '// Cast to Long Debug.Print WorksheetFunction.Match(CLng(Range("C3").Value), Range("A1:A14"), 0) '// Access .Value2 property directly Debug.Print WorksheetFunction.Match(Range("C3").Value2, Range("A1:A14"), 0) 

然而正如让 – 弗朗索瓦·科贝特 ( Jean-FrançoisCorbett)所指出的,如果我们不指定一个财产,它也可以工作:

 Debug.Print WorksheetFunction.Match(Range("C3"), Range("A1:A14"), 0) 

所以如果.Value不起作用,这是Range对象的默认属性 – 为什么它在上面的例子中工作?

这可能是一个错误? 还是有一些评估正在发生,以抵消这一点?

我不认为这是一个错误。 如果你在macros下运行:

 Debug.Print Range("C3"), Range("C3").Value, Range("C3").Value2 

前两个将返回相同的结果。

3/6/2015 3/2/2015 42065

这确认默认属性为Value Range Object
值得注意的是,如果你明确地使用Value ,那么它也可以工作。

 Debug.Print WorksheetFunction.Match(Range("C3").Value, Range("A1:A14").Value, 0) 

所以我认为这是这里曾经描述的问题的另一个performance。

如果您没有为两者明确定义Value属性,那么Excel足够聪明地假设您匹配的Values 。 然而,如果你明确暗示一个属性,但离开Excel猜对另一个,它将无法正常工作。