Pasando una matriz (?) A VBA en Excel
Pregunta
Una solución común en Excel a Sumif () con múltiples condiciones va así (Esta fórmula cuenta todos los casos en los que la columna A tiene el valor en C1 y la columna B tiene el valor en D1):
=SUMPRODUCT((A1:A9=C1)*(B1:B9=D1))
i, ahora, necesita una función que concateden cadenas de líneas que cumplan múltiples condiciones. Hay una excelente solución para One condición en http://www.ms-office-forum.net/forum/showthread.php?t=273352
i, sin embargo, quiero verificar múltiples condiciones, y, por lo tanto, use el truco subproducto () desde arriba. Mi problema es: ¿Cómo debo definir el parámetro en la función para obtener una matriz? Esto es lo que llegué hasta ahora:
' **********************************************************************
' 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
Esto funciona bien, si selecciono una columna para el parámetro 1. Pero tan pronto como incluyo una fórmula del producto (como arriba), solo se pasa una variante / doble con el valor 1 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
¿Alguna sugerencia? ¡Gracias!
Solución
El problema fue porque Formula:
=CONCATIF((A1:A9=C1)*(B1:B9=D1); E1:E9)
debe llamarse presionando ctrl + shift + ingrese
Otros consejos
Por el bien de la integridad, aquí está la macro completa de Excel VBA para concatenar cadenas de un rango (puede tener columnas de cadenas múltiples), si se coinciden los criterios en otras columnas.
' **********************************************************************
' 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 lo siguiente: y no olvides ingresar por Ctrl + shift + ingrese
=CONCATIF((A1:A:9="male")*(B1:B9="young"); C1:D9)
Datos de muestra
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 en
* Comment 1
* Comment 2
* Comment 9
* Comment A
Para Google: Esto también se encontrará como Verkettenwenn ()