默认的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猜对另一个,它将无法正常工作。