2014-12-27 129 views
5

假设我想使用Evaluate函数来评估返回值范围的数组公式。例如,我尝试在Sheet2中的有序列表中获取索引(使用Excel函数MATCH)!A:A为Sheet1中的每个值!A:A。我希望把索引列B.VBA评估函数和数组公式返回值的范围

Dim sh as Worksheet 
Set sh = Sheets("Sheet1") 
sh.Range("B1:B10").Value = sh.Evaluate("=MATCH(A1:A10,Sheet2!A:A)") 

焕我运行代码,我得到重复值的列 - 值等于第一个元素的索引。这是不正确的。

当我将数组公式应用于工作表{= MATCH(A1:A10,Sheet2!A:A)}时,它的工作原理没有问题,并为每个元素返回正确的索引。

所以我的问题:如何使用评估函数返回一个完整的值范围?

+0

尝试'评估( “= TRANSPOSE(MATCH(A1:A10,Sheet 2中!A:A))”)'或'Application.Transpose(评估(“= MATCH(A1:A10,Sheet2的甲! A)“))' – 2014-12-27 17:20:14

+0

不,那也行不通 - 我测试过了。如果它工作,我会感到惊讶,因为A1:A10是一列源值,而B1:B10也是一列。我想,转置不是必要的。 – 2014-12-27 17:24:38

回答

5

有趣的问题。我无法使用VBA评估来获得MATCH函数来返回数组。但是,下面的修改似乎工作,使用索引函数中的行参数的零(0)返回所有行。还要注意,我将match_type参数添加到Match函数。

sh.Range("B1:B10").Value = sh.Evaluate("=INDEX(MATCH(A1:A10,Sheet2!A:A,0),0,1)") 
+2

在使用Evaluate时,您总是需要强制使用非自然数组公式的函数,就像您在此处所做的那样。请注意,您可以简单地使用INDEX(function,)而不使用任何显式参数)或IF(ROW(range),function)构造。 – Rory 2014-12-28 08:12:51

+0

@rory您应该添加作为答案。值得更多的关注和赏金。 – brettdj 2016-11-11 06:22:22

2

如果评估()不会使你快乐,那么:

Sub marine() 
    Dim sh As Worksheet, r As Range 
    Set sh = Sheets("Sheet1") 
    Set r = sh.Range("B1:B10") 
    r.FormulaArray = "=MATCH(A$1:A$10,Sheet2!A:A,0)" 
    r.Copy 
    r.PasteSpecial xlPasteValues 
End Sub