【发布时间】:2015-04-09 08:35:24
【问题描述】:
作为我发布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 对象的默认属性 - 为什么它在上面的示例中起作用?
这可能是一个错误吗?或者是否有某种程度的评估可以抵消这一点?
【问题讨论】:
-
msdn.microsoft.com/en-gb/library/office/ff835873.aspx - Lookup_value 可以是值(数字、文本或逻辑值)或对数字、文本或逻辑值的单元格引用。所以在这种情况下
WorksheetFunction.Match(Range("C3"), Range("A1:A14"), 0)不会使用Range对象的默认方法,而是Range对象本身。 -
即便如此,在这种情况下,
Range("C3").Value和Range("C3")将被评估并返回相同的“dd/mm/yyyy”值以在函数中使用而不是数值 - 所以它还是应该报错? -
确定 ;-)?您确切地知道
WorksheetFunction.Match在内部是如何工作的吗?我不知道,因为它不是开源的。 -
这正是我想要找出的!如果您将
Debug.Print用于Range("C3").Value和Range("C3"),您将获得相同的输出,因为它们以相同的方式进行评估 - 所以这让我认为Match()方法的底层代码正在进行一些其他评估。 .. -
嗯,
Debug.Print必须使用默认方法.Value,因为它需要一个可以转换为字符串的值。我怀疑WorksheetFunction.Match将使用Range对象。我不知道它在内部做什么。
标签: vba excel worksheet-function