我有一個宏,我試圖創建一箇舊的值映射到新的值。在某一點上,我需要對兩列進行匹配,並從第三列中獲取值。在正常Excel中我會運行下面的公式,但因爲它是式陣列(必須按CTRL + SHIFT + ENTER運行)我不太知道如何讓這個在VBAVBA中的索引匹配2條件
=INDEX($D:$D,MATCH(1,(E2=$A:$A)*(F2=$B:$B),0))
任何工作幫助讚賞
我有一個宏,我試圖創建一箇舊的值映射到新的值。在某一點上,我需要對兩列進行匹配,並從第三列中獲取值。在正常Excel中我會運行下面的公式,但因爲它是式陣列(必須按CTRL + SHIFT + ENTER運行)我不太知道如何讓這個在VBAVBA中的索引匹配2條件
=INDEX($D:$D,MATCH(1,(E2=$A:$A)*(F2=$B:$B),0))
任何工作幫助讚賞
你試過了嗎?
Cell.FormulaArray()
它應與正常符號工作,儘管它是用於R1C1
基本上有三種方法來評估的陣列式內VBA的結果。
第一個是「方括號」評估。這就像處理工作表一樣處理公式。
Dim result As Variant
result = [INDEX('Sheet1'!D:D,MATCH(1,(E2='Sheet1'!A:A)*(F2='Sheet1'!B:B),0))]
Debug.Print result
必須注意明確顯示工作表親子關係。在上面,完整的列已經被賦予一個父工作表,但單個單元格沒有。單個單元格將默認爲ActiveSheet property,這可能甚至可能不在同一個工作簿中。明確定義所有單元格引用!第二種方法是Application.Evaluate method。這允許使用字符串構造的公式更自由。
Dim result As Variant, wsn As String
wsn = Worksheets("Sheet1").Name
result = Application.Evaluate("INDEX('" & wsn & "'!D:D, " & _
"MATCH(1, (E2='" & wsn & "'!A:A)*(F2='" & wsn & "'!B:B),0))")
Debug.Print result
此外,只有完整的列引用已被給予父工作表引用。這應該在運行時使用之前修復。此方法對數組公式更好,因爲您可以使用字符串構造將完整列引用截至Worksheet.UsedRange property中的行。
如前所述,第三種方法涉及使用Range.FormulaArray property將公式寫入工作表單元格並從單元格中檢索答案。
謝謝,這是非常徹底的!:) – Sanfly
對不起,不熟悉它,或者很確定語法應該如何工作? var3 = cell.FormulaArray(WorksheetFunction.Index(wsM.Range(「$ D:$ D」),WorksheetFunction.Match(1,(wsM.Range(「$ A:$ A」)= tagN)* (wsM.Range(「$ B:$ B」)= tagS),0))) – Sanfly
也不工作:var3.FormulaArray = WorksheetFunction.Index(wsM.Range(「$ D:$ D」),WorksheetFunction.Match (1,(wsM.Range(「$ A:$ A」)= tagN)*(wsM.Range(「$ B:$ B」)= tagS),0)) – Sanfly
只需使用公式它在一個單元格中。所以如果你想在A1中插入它,使用Range(「A1」)。 FormulaArray =「= INDEX(...」 – bioschaf