Passando uma Matriz (?) em VBA no Excel
Pergunta
uma solução comum no Excel a função SOMASE() com várias condições assim (esta fórmula conta todos os casos em que A coluna tem o valor de C1 e a coluna B tem o valor de D1):
=SUMPRODUCT((A1:A9=C1)*(B1:B9=D1))
Eu, agora, precisamos de uma função que seqüências de caracteres concatenada de linhas de cumprimento de várias condições.Existe uma grande solução para um condição http://www.ms-office-forum.net/forum/showthread.php?t=273352
Eu, no entanto, deseja verificar várias condições - e, portanto, utilizar o SUBPRODUTO() truque de cima.O meu problema é:Como é a forma de definir o parâmetro na função para obter uma Matriz?É isso que eu tenho até agora:
' **********************************************************************
' 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
Isso funciona bem, se eu selecionar colunas para o parâmetro 1.Mas assim que incluem um produto de fórmula (como acima), apenas uma Variante/Double com o valor 1 é transmitido para 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
Alguma sugestão?Obrigado!
Solução
O problema foi porque a fórmula:
=CONCATIF((A1:A9=C1)*(B1:B9=D1); E1:E9)
precisam ser chamada pressionando CTRL+MUDANÇA+ENTRAR
Outras dicas
Por uma questão de completude, aqui está o arquivo completo do Excel Macro VBA para concatenar cadeias de caracteres a partir de um intervalo (pode ter várias colunas de seqüência de caracteres), se os critérios em outras colunas são correspondidos.
' **********************************************************************
' 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
Use da seguinte forma - e não se esqueça de entrar pela CTRL+MUDANÇA+ENTRAR
=CONCATIF((A1:A:9="male")*(B1:B9="young"); C1:D9)
Dados de exemplo
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
Resultados
* Comment 1
* Comment 2
* Comment 9
* Comment A
Para O Google:Este deve também ser encontrado como VERKETTENWENN()