2013-04-23 2 views
1

Как эффективно использовать формулу Index/Match в VBA?Excel/VBA - Функция соответствия индексов с использованием динамических диапазонов

Фон: У меня есть рабочий лист, который в значительной степени зависит от использования формулы, которая извлекает результат на основе соответствия определенного имени его диапазону имен, а также определенной даты в его диапазоне дат.

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

Кроме того, существует жестко закодированы VBA к югу, который производит такой же вывод

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 

Вопрос: Я хотел бы, чтобы произвести функцию, которая возвращает тот же результат, что и выше опций, но позволяет пользователь (i) выбирает значения Name и Date, ссылаясь на соответствующие ячейки, и (ii) выбирает каждый диапазон (диапазон имен, диапазон дат и диапазон вывода). По существу использование = examplefunction (имя, диапазон имен, значение даты, диапазон дат, диапазон вывода) в excel.

Я пробовал несколько различных решений, но не имел успеха. Ниже приведен пример того, что я пробовал до сих пор, я думаю, что есть проблема с частью соответствия, так как даже когда я пытаюсь установить диапазоны (с жестко запрограммированными диапазонами), он возвращает ошибку.

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 для объекта Application в xlR1C1(временно, только во время вашей функции выполняется). Наконец вызовите Evaluate, чтобы получить результат формулы.

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

+0

@ user2312552 Повторите попытку, я отредактировал его. – dee

+0

камень твердый !!! Я очень ценю вашу помощь, работает как шарм. – user2312552