【问题标题】:Default Range property produces unexpected results默认范围属性产生意外结果
【发布时间】: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").ValueRange("C3") 将被评估并返回相同的“dd/mm/yyyy”值以在函数中使用而不是数值 - 所以它还是应该报错?
  • 确定 ;-)?您确切地知道WorksheetFunction.Match 在内部是如何工作的吗?我不知道,因为它不是开源的。
  • 这正是我想要找出的!如果您将Debug.Print 用于Range("C3").ValueRange("C3"),您将获得相同的输出,因为它们以相同的方式进行评估 - 所以这让我认为Match() 方法的底层代码正在进行一些其他评估。 ..
  • 嗯,Debug.Print 必须使用默认方法.Value,因为它需要一个可以转换为字符串的值。我怀疑WorksheetFunction.Match 将使用Range 对象。我不知道它在内部做什么。

标签: vba excel worksheet-function


【解决方案1】:

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

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

第一个两个将返回相同的结果。

2015 年 3 月 2 日 2015 年 3 月 2 日 42065

确认Range Object 的默认属性为Value
值得注意的是,如果您始终明确使用Value,它也可以正常工作。

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

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

如果您没有为两者显式定义Value 属性,Excel 会很聪明地假设您匹配Values。但是,如果您明确暗示一个属性,而让 Excel 猜测另一个属性,则它将不起作用。

【讨论】:

  • 我用两个参数都试过.Value - 它仍然没有用。事实上,如果我在第二个参数中完全使用.Value,代码就会失败——它是否需要一个范围对象而不是一个数组?
  • MSDN 暗示一个数组可以用作第二个参数 - 我只能认为它在这里可能不起作用,因为.Value 将产生一个二维数组,尽管我再次不明白为什么会这样不行。这引起了更多的问题d'oh
  • Win 7 32bit 和 XL2010 - 你?
  • @SO 我在 XL2013。无论如何,我找不到检查Match 如何处理它的操作的方法。我只是根据我发布的链接来回答。
  • 是的,很遗憾,我认为不会很快给出明确的答案,尽管欢呼,但感谢您的努力:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-03
  • 1970-01-01
  • 2019-03-31
  • 2021-12-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多