Sumar valores únicos con múltiples criterios

enter image description here

Hola,
Necesito una fórmula equivalente para sumr valores únicos basados ​​en algunos criterios. Los resultados que quiero están en la columna E Hay 2 criterios (el primero en la columna D y el segundo, la columna B debe ser ">10" .

Ahora uso esta fórmula: {=SUM(IF(FREQUENCY(IF($A$2:$A$10=D2,IF($B$2:$B$10>10,MATCH($B$2:$B$10,$B$2:$B$10,0))),ROW($B$2:$B$10)-ROW($B$2)+1),$B$2:$B$10))}

El problema con esta fórmula es que no se puede establecer con FormulaArray en VBA . Entiendo que puedo usar evaluate para extraer el resultado, pero todo lo que quiero es tener una fórmula en cada celda de la columna E , que pueda calcular correctamente .

Gracias !

Tuve que probar un par de methods antes de encontrar uno que funcionara, pero me di count.

Pegue estas funciones en un module:

 Public Function SumIfIf(rgeData As Range, matchCriteria As String, numCompCriteria As String) As Double Dim c As Range, arr_Distinct() As String, x As Long, totalOut As Double, str_ConcatRgeRow As String ReDim arr_Distinct(0) totalOut = 0 If InStr("<>=", Left(numCompCriteria, 1)) = 0 Then numCompCriteria = "=" & numCompCriteria For Each c In rgeData.Columns(1).Cells str_ConcatRgeRow = c.Value & c.Offset(0, rgeData.Columns.Count - 1).Value If Not IsInArray(arr_Distinct, str_ConcatRgeRow) Then ReDim Preserve arr_Distinct(UBound(arr_Distinct) + 1) arr_Distinct(UBound(arr_Distinct)) = str_ConcatRgeRow If Evaluate(c.Value = matchCriteria) And Evaluate("=(" & c.Offset(0, rgeData.Columns.Count - 1).Value & numCompCriteria & ")") Then totalOut = totalOut + c.Offset(0, rgeData.Columns.Count - 1).Value End If End If Next c SumIfIf = totalOut End Function Function IsInArray(arrToCheck As Variant, valToFind As Variant) As Boolean Dim x As Long IsInArray = False For x = 1 To UBound(arrToCheck) If arrToCheck(x) = valToFind Then IsInArray = True Next x End Function 

En el caso de tu ejemplo, lo usarías así:

Captura de pantalla de SumIfIf

Uso :

SumIfIf (rgeData como range, matchCriteria como cadena, numCompCriteria como cadena)

rgeData = un range de cualquier cantidad de filas y al less 2 columnas

La function coincide con:

  • la columna de la izquierda para las coincidencias exactas con 'matchCriteria', y

  • la columna de la derecha para las coincidencias con 'numCompCriteria'

…y entonces:

  • devuelve la sum de los partidos numCompCriteria

  • donde [matchCriteria] + [numCompCriteria] es único.

matchCriteria = un identificador de text o numérico, que se emparejará exactamente

numCompCriteria = un identificador numérico específico como una cadena que comienza con > o < o = como si especificara criterios simples para la function de spreadsheet SumIf .

  • Ejemplos de numCompCriteria : "=10" , "<=10" , "10"

Estoy en el límite de time de pantalla para el día; Avísame si quieres más explicaciones. Mientras tanto, con suerte, esto resuelve tu problema. 🙂

+1 a la pregunta para el desafío, ¡que también tenía la ventaja de ser justo lo que necesitaba para algo en lo que estoy trabajando!


Actualización, además de la pregunta de @BOB:

La línea de código que hace la comparación es esta:

 If Evaluate(c.Value = matchCriteria) And Evaluate("=(" & c.Offset(0, rgeData.Columns.Count - 1).Value & numCompCriteria & ")") Then 

entonces, dependiendo de sus necesidades, hay algunas maneras en que puede cambiarlo.

Rápido y sucio, si su nuevo criterio es permanente, reemplace la línea anterior por:

 If Evaluate(c.Value = matchCriteria) _ And Evaluate("=(" & c.Offset(0, rgeData.Columns.Count - 1).Value & ">10" & ")") _ And Evaluate("=(" & c.Offset(0, rgeData.Columns.Count - 1).Value & "<=35" & ")") _ Then 

Tenga en count que esto ya no usará el valor de numCompCriteria pero igual tendrá que especificar algo, o bien eliminar el argumento de la statement de la function. O ajuste, agregue más parameters para sus nuevos criterios.

Siguiendo ese patrón, puede agregar todos los criterios que desee. La forma en que se usa aquí, " Evaluate ", es True o False. Puedes demostrar con:

 debug.print Evaluate ("=(10>35)") 

y en el código de arriba

 c.Offset(0, rgeData.Columns.Count - 1).Value 

devuelve el valor de la columna de la derecha.