作为我发布的答案的后续问题here我想知道为什么以下没有错误,这是VBA中可能存在的错误吗?
获取以下数据:
如果我们使用以下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
对象的默认属性 - 为什么它在上面的示例中有用?
这可能是个错误吗?或者是否有某种程度的评估可以抵消这种情况?
答案 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猜测另一个属性,它将无效。