2014-12-27 164 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