2014-01-11 3 views
3

одно общее решение в Excel для SUMIF() с несколькими условиями похоже на это (эта формула учитывает все случаи, в которых столбец A имеет значение в C1, а столбец B имеет значение в D1):Передача матрицы (?) В VBA в Excel

=SUMPRODUCT((A1:A9=C1)*(B1:B9=D1)) 

Теперь мне нужна функция, которая объединяет строки из строк, выполняющих несколько условий. Существует отличное решение для один условия на http://www.ms-office-forum.net/forum/showthread.php?t=273352

Я, однако, хочу проверить несколько условий - и, следовательно, использовать подпроизведение() трюк сверху. Моя проблема: как мне определить параметр в функции для получения массива? Это то, что я до сих пор:

' ********************************************************************** 
' Modul: Modul1 Typ: Allgemeines Modul 
' ********************************************************************** 

Option Explicit 

Public Function CONCATIF(Kriterium, Inhalte) 
    Dim mydic As Object 
    Dim L As Long 
    Set mydic = CreateObject("Scripting.Dictionary") 

    For L = 1 To UBound(Kriterium) 
     If Kriterium(L, 1) = 1 Then 
      If Inhalte(L, 1) <> "" Then 
       mydic(L) = Inhalte(L, 1) 
      End If 
     End If 
    Next 
    CONCATIF = Join(mydic.items, vbCrLf) 
End Function 

Это прекрасно работает, если выбрать один столбцы для параметра 1. Но как только я включаю формулу продукта (как выше), только вариант/Double со значением 1 для Kriterium.

=CONCATIF(A1:A9; E1:E9)     Works fine (if column A is 0/1 coded) 
=CONCATIF((A1:A9=C1)*(B1:B9=D1); E1:E9) Does not work at all 

Любые предложения? Спасибо!

+1

Try для вызова функции, нажав __CTRL + SHIFT + ENTER__. Это работает для меня –

+0

Я вообще не хочу называть SumProduct() - хочу написать функцию, которая делает что-то подобное, например SumProduct(). – BurninLeo

+0

@simoco: Вы решили проблему !! Большое спасибо. Любая идея, почему SUMPRODUCT() не требует CRTL + SHIFT + ВВОД? – BurninLeo

ответ

2

Проблема заключалась в том, потому что формула:

=CONCATIF((A1:A9=C1)*(B1:B9=D1); E1:E9) 

потребность быть вызывается нажатием CTRL + SHIFT + ENTER

+0

+ 1 Красиво сделано :) –

+0

@SiddharthRout, спасибо! но вы прочитали мой последний комментарий к вопросу? Я смущен этим поведением. –

+2

Это потому, что 'SUMPRODUCT()' вычисляет массив за кулисами, в отличие от других формул массива.'SUMPRODUCT()' не требует ввода массива, потому что Excel уже запрограммирован, чтобы знать, что его функция обработки массива. :) –

0

Для полноты картины, вот полный Excel VBA макросов для конкатенации строк из диапазона (может иметь несколько столбцов строк), если критерии в других столбцах совпадают.

' ********************************************************************** 
' Modul: Modul1 Typ: Allgemeines Modul 
' ********************************************************************** 

Option Explicit 


Public Function CONCATIF(Kriterium, Inhalte) 
    Dim mydic As Object 
    Dim L As Long 
    Dim C As Long 
    Dim N As Long 
    Dim cols As Long 
    Set mydic = CreateObject("Scripting.Dictionary") 
    cols = Inhalte.Columns.Count 
    N = 1 

    For L = 1 To UBound(Kriterium) 
     If Kriterium(L, 1) = 1 Then 
      For C = 1 To cols 
       If Not IsEmpty(Inhalte(L, C)) Then 
        mydic(N) = "* " & Inhalte(L, C) 
        N = N + 1 
       End If 
      Next 
     End If 
    Next 
    CONCATIF= Join(mydic.items, vbCrLf) 
End Function 

использования следующим образом - и не забудьте войти на CTRL +SHIFT + ENTER

=CONCATIF((A1:A:9="male")*(B1:B9="young"); C1:D9) 

Примеры данных

A  B  C   D 
01 male young Comment 1 Comment 2 
02 male old  Comment 3 Comment 4 
03 female young Comment 5 Comment 6 
04 female old  Comment 7 Comment 8 
05 male young Comment 9 Comment A 

Результаты в

* Comment 1 
* Comment 2 
* Comment 9 
* Comment A 

Для Google: Это должно также быть найдены как VERKETTENWENN()

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