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:
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:
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.
Warum nicht eine Schleife verwenden? – Luuklag
Ich verstehe nicht, was Sie damit meinen – BOB
Verwenden Sie anstelle einer Formel eine Schleife mit geschachtelten IF-Kriterien. – Luuklag