2013-02-11 2 views
1

Кто-нибудь знает, как использовать функцию VBA в таблице основанный на SUMPRODUCT?Excel SUMPRODUCT с условиями на основе VBA

Это прекрасно работает, суммируя значения в столбце N, где столбец содержит L «Y» и столбец А содержит другое значение Col K ...

=SUMPRODUCT(--(Input!L1:L100="Y"), --(Input!A1:A100<>Input!K1:K100), Input!N1:N100) 

Но я хочу, чтобы иметь возможность применять более логика, чем просто <> K в моих вторых критериев, что-то вроде этого ...

=SUMPRODUCT(--(Input!L1:L100="Y"), --(MatchNames(Input!A1:A100,Input!K1:K100)), Input!N1:N100) 

у меня есть функция, называемая MatchNames в моей VBA, но я не могу определить, что он должен вернуться, чтобы Работа. Я пробовал возвращать массив логических, integer (установить в 0 или 1), я попытался переставить результаты перед их возвратом, но ничего не работает. Я отлаживал функцию MatchNames, и она возвращает что-то «полезное» (т. Е. Массив логических элементов), поэтому не потому, что функция разбомбивается частично, но я получаю #VALUE! когда я пытаюсь использовать его в SUMPRODUCT.

Это моя функция VBA ...

Public Function MatchNames(ByVal rng1 As Range, rng2 As Range) As Boolean() 
    Dim blnOut() As Boolean 
    Dim k As Long 

    ReDim blnOut(rng1.Rows.Count - 1) 

    For k = 1 To rng1.Rows.Count 
     If rng1.Cells(k, 1).Value <> "" Then 
      If rng1.Cells(k, 1).Value <> rng2.Cells(k, 1).Value Then 
       blnOut(k - 1) = True 
      End If 
     End If 
    Next 

    MatchNames = blnOut 
End Function 

ответ

3

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

Я не знаю, как вы бы переставлять, что в VBA, но если вы не можете сделать это, то транспонировать в SUMPRODUCT как

=SUMPRODUCT(--(input!L1:L100="Y"),--TRANSPOSE(MatchNames(input!A1:A100,input!K1:K100)), input!N1:N100)

но использование TRANSPOSE означает, что формула в настоящее время должна быть "массив вошел" с CTRL+SHIFT+ENTER

... или вы можете использовать MMULT, которые будут умножать 1x100 диапазон, 100x1, т.е.

=MMULT(MatchNames(input!A1:A100,input!K1:K100)+0,input!N1:N100*(input!L1:L100="Y"))

для этой последней формулы для работы суммарный диапазон - ввод! N1: N100 - должен быть все числовым

+0

Ahhhh да, спасибо. Это потрясающе. Я пробовал переставить код перед возвратом, а это значит, что я не мог просто вернуть свой объект в виде массива bool, но выполнил транспонирование в формуле. Благодаря!! – Mottster

+1

Вы можете сделать свой UDF возвратом 2-мерного массива (1 столбец и n строк) вместо использования Transpose. Если вы вернете 1 и 0, а не логические, вам также не понадобится -. –

Смежные вопросы