Default Range属性会产生意外结果

时间:2015-04-09 08:35:24

标签: excel vba excel-vba worksheet-function

作为我发布的答案的后续问题here我想知道为什么以下没有错误,这是VBA中可能存在的错误吗?

获取以下数据:

example data set
如果我们使用以下VBA代码,我们将收到错误,因为我们需要使用日期的数值来匹配:

'//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çois Corbett指出的那样,如果我们没有指定一个属性,它也有效:

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

因此,如果.Value不起作用,并且这是Range对象的默认属性 - 为什么它在上面的示例中有用?

这可能是个错误吗?或者是否有某种程度的评估可以抵消这种情况?

1 个答案:

答案 0 :(得分:1)

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

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

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

  

3/2/2015 3/2/2015 42065

确认Value的默认属性为Range Object 值得注意的是,如果您在整个过程中明确使用Value,它也会起作用。

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

所以我认为这是曾经描述here的问题的另一种表现形式。

如果您没有为两者明确定义Value属性,则Excel足够聪明,可以假设您正在匹配Values。但是,如果你明确暗示一个属性但让Excel猜测另一个属性,它将无效。