2013-04-23 104 views
1

如何有效地使用VBA的Index/Match公式?的Excel/VBA - 使用動態索引匹配功能範圍

背景:我有嚴重依賴於使用檢索基於匹配特定的名稱,以它的名字範圍以及特定日期到其時間範圍的輸出的公式的一個工作表。

=INDEX(OutputRange,MATCH(1,(Name=NameRange)*(Date=DateRange),FALSE),1) 

此外,存在產生相同的輸出

Sub ExampleHardCode() 
Dim Result As Variant 
    Result = Evaluate("INDEX($C$4:$C$13,MATCH(1,($G$6=$A$4:$A$13)*($G8=$B$4:$B$13),FALSE),1)") 
    ActiveCell.Value = Result 
End Sub 

問題的硬編碼VBA子:我想以產生返回輸出上述選項相同的,但允許功能(i)通過參考各個單元選擇名稱和日期值,並(ii)選擇每個範圍(名稱範圍,日期範圍和輸出範圍)。基本上在excel中使用= examplefunction(名稱值,名稱範圍,日期值,日期範圍,輸出範圍)。

我已經嘗試了一些不同的解決方案,但沒有成功。下面是我到目前爲止已經試過一個例子,我覺得這是與匹配部分,因爲即使當我嘗試設置範圍(用硬編碼範圍)的問題則返回錯誤。

Function TestIndexMatch1(NameVal As Variant, DateVal As Date) 

Dim NameRng As Range 
Dim DateRng As Range 
Dim OutputRng As Range 
Dim Var1 As Variant 'should this be a range or integer? 
Dim Result As Variant 

Set NameRng = Range("$A$4:$A$13") 
Set DateRng = Range("$B$4:$B$13") 
Set OutputRng = Range("$C$4:$D$13") 

With Application.WorksheetFunction 
    Var1 = .Match(1, (NameVal = NameRng) * (DateVal = DateRng), False) 
    Result = .Index(OutputRng, Var1, 1) 
End With 
End Function 

我有一個示例工作簿,如果它可以幫助我可以分享。我不知道這是非常做,能,但如果因此它會真正幫助很多是沒有足夠的熟悉與Excel正確使用索引/匹配的Excel公式用戶。不幸的是對我來說,我的excel技能遠遠超過了我的VBA技能。

回答

1

要使用數組公式VBA代碼集ReferenceStyle內,用於應用程序對象xlR1C1(暫時,只有您的功能期間執行)。最後呼叫評估得到公式的結果。

Private Const TEMPLATE As String = "=INDEX({0},MATCH(1,({1}={2})*({3}={4}),{5}))" 
Private Const MATCH_TYPE = 0 

Public Function TestIndexMatch1(ByRef outputRange As Range, _ 
           ByRef nameCriteria As Range, _ 
           ByRef dateCriteria As Range, _ 
           ByRef nameRange As Range, _ 
           ByRef dateRange As Range) 

    On Error GoTo Err_Handler 
    Err.Number = 0 

    Dim originalReferenceStyle 
    originalReferenceStyle = Application.ReferenceStyle 
    Application.ReferenceStyle = xlR1C1 

    Dim myFormula As String 
    myFormula = Replace(TEMPLATE, "{0}", outputRange.Address()) 
    myFormula = Replace(myFormula, "{1}", nameCriteria.Address()) 
    myFormula = Replace(myFormula, "{2}", nameRange.Address()) 
    myFormula = Replace(myFormula, "{3}", dateCriteria.Address()) 
    myFormula = Replace(myFormula, "{4}", dateRange.Address()) 
    myFormula = Replace(myFormula, "{5}", MATCH_TYPE) 

    TestIndexMatch1 = Application.Evaluate(myFormula) 

Err_Handler: 
    If (Err.Number <> 0) Then MsgBox Err.Description 
    Application.ReferenceStyle = originalReferenceStyle 
End Function 

所以它看起來片:

enter image description here

enter image description here

+0

感謝您的想法。我嘗試了你的代碼和工作表(包括命名約定和範圍值),正如你設置它的時候一樣,但我仍然獲得了#VALUE!錯誤。看起來您正在使用國際版本,但我認爲這不會產生錯誤。任何想法爲什麼它可能不適合我? Thx再次! – user2312552 2013-04-24 22:14:13

+0

@ user2312552請再次檢查答案,我已編輯它。 – dee 2013-04-30 05:59:21

+0

堅如磐石!我非常感謝你的幫助,像一個魅力。 – user2312552 2013-04-30 14:22:57