2017-11-21 6 views
1

enter image description hereSumme eindeutige Werte mit mehreren Kriterien

Hallo,
Ich brauche eine äquivalente Formel eindeutige Werte nach bestimmten Kriterien zu summieren. Die Ergebnisse, die ich will, ist in Spalte E. Es gibt zwei Kriterien (erste auf Spalte D und die zweite Spalte B muss ">10" sein

Jetzt benutze ich diese Formel:. {=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))}

Das Problem mit dieser Formel ist, dass es nicht sein kann, set mit FormulaArray in VBA .Ich versteht, dass ich evaluate das Ergebnis extrahieren können, aber alles, was ich will, eine Formel haben auf jeder Zelle aus der Spalte E, die korrekt berechnen können.

Thank you!

+0

Warum nicht eine Schleife verwenden? – Luuklag

+0

Ich verstehe nicht, was Sie damit meinen – BOB

+0

Verwenden Sie anstelle einer Formel eine Schleife mit geschachtelten IF-Kriterien. – Luuklag

Antwort

3

Ich musste ein paar Methoden ausprobieren, bevor ich eine gefunden habe, die funktioniert, aber ich habe es herausgefunden.

Fügen Sie diese Funktionen in ein Modul:

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 

Im Fall von Ihrem Beispiel, würden Sie es wie folgt verwendet werden:

SumIfIf Screenshot

Nutzungs:

SumIfIf (rgeData als Bereich, matchCriteria als String, numCo mpCriteria As String)

rgeData = ein Bereich von einer beliebigen Anzahl von Zeilen und mindestens 2 Spalten

Die Funktion entspricht:

  • der linken Spalte für die exakte Übereinstimmungen 'matchCriteria', und

  • die rechte Spalte für die Spiele zu 'numCompCriteria'

... und dann:

  • gibt die Summe numCompCriteria Matches

  • wo [matchCriteria] + [numCompCriteria] einzigartig ist.

matchCriteria einen Text oder numerische Kennung =, angepasst genau mit > oder < oder = Ausgang

numCompCriteria = eine numerische Kennung spezifisch als String wird, wie Sie einfach angeben würden Kriterien für die Arbeitsblattfunktion SumIf.

  • Beispiele für numCompCriteria: "=10", "<=10", "10"

ich auf meinem Bildschirm-Frist für den Tag bin; Lassen Sie es mich wissen, wenn Sie weitere Erklärungen wünschen. In der Zwischenzeit löst das hoffentlich dein Problem. :)

+1 auf die Frage für die Herausforderung, die den Bonus hatte, nur zu sein, was ich für etwas brauchte, an dem ich auch arbeite!


Update weiter @ BOB Frage:

Die Codezeile, die den Vergleich tut, ist diese:

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

so je nach Bedarf gibt es ein paar Möglichkeiten, wie Sie könnte ändern Sie es.

Schnell und schmutzig, wenn Ihre neuen Kriterien permanent, mit der obigen Zeile:

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 

Beachten Sie, dass dies nicht den Wert von numCompCriteria mehr verwenden, aber man müßte noch etwas spezifizieren oder entfernen Sie das Argument aus der Funktionsdeklaration. Oder passen Sie es an, fügen Sie weitere Parameter für Ihre neuen Kriterien hinzu.

Nach diesem Muster können Sie alle Kriterien hinzufügen, die Sie mögen. Wie es hier verwendet wird, gibt "Evaluate" True oder False zurück. oben

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

gibt den Wert der rechten Spalte

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

und im Code ein: Sie können demonstrieren.

+0

Herzlichen Glückwunsch für deine Arbeit, du hast einen tollen Job gemacht! Ich habe eine Frage, wenn ich ein weiteres Kriterium hinzufügen möchte, wie kann ich die Formel schreiben? zum Beispiel (Spalte "B" <= 35). '= SumIfIf ($ A $ 2: $ B $ 10, D2,"> 10 "&" <= 35 ")' das Ergebnis mit dieser Formel ist 0. Eine weitere Spezifikation für Ihre Lösung besteht darin, bei der Formel vorsichtig zu sein, weil Groß- und Kleinschreibung beachtet wird. – BOB

+1

werden die Kriterien immer "" 10 "" und "<= 35" sein oder wird es variieren? Brauchen Sie zusätzlich noch weitere Kriterien? – ashleedawg

+0

Die Frage ist bereits akzeptiert. Nochmals vielen Dank ! – BOB

Verwandte Themen