Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Vba “默认范围”属性生成意外结果_Vba_Excel_Worksheet Function - Fatal编程技术网

Vba “默认范围”属性生成意外结果

Vba “默认范围”属性生成意外结果,vba,excel,worksheet-function,Vba,Excel,Worksheet Function,作为我发布的答案的后续问题,我想知道为什么以下内容没有出错,这是VBA中可能存在的错误吗 以以下数据为例: 如果我们使用以下VBA代码,我们将收到一个错误,因为我们需要使用日期的数值来匹配: '//Produces error Debug.Print WorksheetFunction.Match(Range("C3").Value, Range("A1:A14"), 0) 因此,这两种说法中的任何一种都将起作用: '// Cast to Long Debug.Print Workshe

作为我发布的答案的后续问题,我想知道为什么以下内容没有出错,这是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)
但是,正如所指出的,如果我们不指定属性,它也可以工作:

Debug.Print WorksheetFunction.Match(Range("C3"), Range("A1:A14"), 0)
因此,如果
.Value
不起作用,并且这是
范围
对象的默认属性-为什么在上面的示例中它起作用


这可能是一只虫子吗?或者是否有某种程度的评估可以抵消这一点?

我不认为这是一个bug。如果运行以下宏:

Debug.Print Range("C3"), Range("C3").Value, Range("C3").Value2
前两个将返回相同的结果

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

它将
范围对象的默认属性确认为

但值得注意的是,如果您始终明确使用
Value
,它也会起作用

Debug.Print WorksheetFunction.Match(Range("C3").Value, Range("A1:A14").Value, 0)
因此,我认为这是曾经描述过的问题的另一种表现。


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

我尝试了
.Value
两个参数,但仍然不起作用。事实上,如果我在第二个参数中使用
.Value
的话,代码就失败了-它需要的是范围对象而不是数组吗?MSDN意味着数组可以用作第二个参数-我只能认为它可能不起作用,因为
.Value
将生成一个二维数组,尽管我还是不明白为什么这样做行不通。这引起了更多的关于d'ohWin 7 32位和XL2010-你?@的问题,所以我在XL2013上。无论如何,我找不到方法来检查
Match
如何处理它的操作。我只是根据我发布的链接来回答。是的,我不认为很快就会有一个明确的答案。不幸的是,感谢您的努力,尽管欢呼:)-Lookup_值可以是一个值(数字、文本或逻辑值),也可以是对数字、文本或逻辑值的单元格引用。因此,在这种情况下,
WorksheetFunction.Match(Range(“C3”)、Range(“A1:A14”)、0
将不使用
Range
对象的默认方法,而是使用
Range
对象本身。即使如此,在这种情况下,
Range(“C3”)。值
Range(“C3”)
将被计算并返回相同的“dd/mm/yyyyy”要在函数中使用的值,而不是数值-因此仍应出错?确定;-)?您确切地知道
工作表function.Match
在内部是如何工作的吗?我不知道,因为它不是开源的。这正是我想知道的!如果使用
Debug.Print
for
Range(“C3”)。Value
Range(“C3”)
可以得到相同的输出,因为它们是以相同的方式计算的-因此这让我认为
Match()
方法的底层代码还有其他一些计算在进行…嗯,
Debug.Print
必须使用默认方法
.Value
,因为它需要一个可以转换为字符串的值。我怀疑是
工作表函数。Match
将使用
范围
对象。我不知道它在内部做什么。