Anzeige
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

unterschiedliche Ergebnisse wenn Filter Reihenfolge anders

Forumthread: unterschiedliche Ergebnisse wenn Filter Reihenfolge anders

unterschiedliche Ergebnisse wenn Filter Reihenfolge anders
25.05.2024 14:30:32
Fred
Hallo Excel Profis,
ich habe heute im Web ein Makro entdeckt und dieses stark geändert / angepaßt.
Das Makro filtert durchgehend und sucht "optimale Ergebnisse"
Werden die gefunden, gibt es entsprechende Einträge in IK:IN

Ich habe das Makro noch nicht durchgehend geprüft doch als erstes ist mir aufgefallen, das wenn die Reihenfolge
filterFields = Array("EA", "EB", "EC", "ED", "IB")

in
filterFields = Array("IB", "EA", "EB", "EC", "ED")
geändert wird, mehr "Treffer" aufgelistet werden.
Warum ist das so?
Kann ein Experte bitte mal dieses Makro sich genau anschauen und mich auf "eventuelle Fehler" aufmerksam machen?!

Das Beispiel:
https://www.herber.de/bbs/user/169702.xlsb

Das Makro:
Sub Filter_2x()

Dim ws As Worksheet
Set ws = ThisWorkbook.Sheets("Scalping")

Dim lastRow As Long
lastRow = ws.Cells(ws.Rows.Count, "A").End(xlUp).Row
Sheets("Scalping").Range("IK7:IN" & lastRow).ClearContents

Dim operators As Variant
operators = Array(">", ">=", "=")

Dim filterFields As Variant
filterFields = Array("EA", "EB", "EC", "ED", "IB")
Dim ikRow As Long
ikRow = 7

Application.ScreenUpdating = False

Application.Calculation = xlCalculationManual

Dim i As Long, j As Long
Dim n As Long, p As Long
Dim criteriaString As String

' Ein Filter pro Spalte
For n = LBound(filterFields) To UBound(filterFields)
For i = LBound(operators) To UBound(operators)
' Filter für die aktuelle Spalte setzen
ws.Range("A6:IG" & lastRow).AutoFilter
ws.Range("A6:IG" & lastRow).AutoFilter Field:=ws.Range(filterFields(n) & "6").Column, Criteria1:=operators(i) & ws.Range(filterFields(n) & "7").Value

Dim filteredIC As Range
On Error Resume Next
Set filteredIC = ws.Range("IC7:IC" & lastRow).SpecialCells(xlCellTypeVisible)
On Error GoTo 0

If Not filteredIC Is Nothing Then
Dim totalIC As Double
totalIC = Application.WorksheetFunction.Sum(filteredIC)
Dim countIC As Long
countIC = filteredIC.Count

If countIC > 0 And totalIC / countIC > 0.6 Then
criteriaString = filterFields(n) & operators(i) & ws.Range(filterFields(n) & "7").Value

ws.Cells(ikRow, "IK").Value = criteriaString
ws.Cells(ikRow, "IL").Value = totalIC / countIC
ws.Cells(ikRow, "IM").Value = totalIC
ws.Cells(ikRow, "IN").Value = countIC
ikRow = ikRow + 1
End If
End If

' Filter zurücksetzen
On Error Resume Next
ws.ShowAllData
On Error GoTo 0
Next i

For p = n + 1 To UBound(filterFields)
For i = LBound(operators) To UBound(operators)
For j = LBound(operators) To UBound(operators)
' Filter für die aktuellen zwei Spalten setzen
ws.Range("A6:IG" & lastRow).AutoFilter
ws.Range("A6:IG" & lastRow).AutoFilter Field:=ws.Range(filterFields(n) & "6").Column, Criteria1:=operators(i) & ws.Range(filterFields(n) & "7").Value
ws.Range("A6:IG" & lastRow).AutoFilter Field:=ws.Range(filterFields(p) & "6").Column, Criteria1:=operators(j) & ws.Range(filterFields(p) & "7").Value

Dim filteredICDouble As Range
On Error Resume Next
Set filteredICDouble = ws.Range("IC7:IC" & lastRow).SpecialCells(xlCellTypeVisible)
On Error GoTo 0

If Not filteredICDouble Is Nothing Then
Dim totalICDouble As Double
totalICDouble = Application.WorksheetFunction.Sum(filteredICDouble)
Dim countICDouble As Long
countICDouble = filteredICDouble.Count

If countICDouble > 0 And totalICDouble / countICDouble > 0.6 Then
criteriaString = filterFields(n) & operators(i) & ws.Range(filterFields(n) & "7").Value & _
" UND " & filterFields(p) & operators(j) & ws.Range(filterFields(p) & "7").Value

ws.Cells(ikRow, "IK").Value = criteriaString
ws.Cells(ikRow, "IL").Value = totalICDouble / countICDouble
ws.Cells(ikRow, "IM").Value = totalICDouble
ws.Cells(ikRow, "IN").Value = countICDouble
ikRow = ikRow + 1
End If
End If

' Filter zurücksetzen
On Error Resume Next
ws.ShowAllData
On Error GoTo 0
Next j
Next i
Next p
Next n

If ikRow = 7 Then
ws.Cells(3, "IK").Value = "Negativ"
End If

Application.Calculation = xlCalculationAutomatic
Application.ScreenUpdating = True
End Sub


Gruss
Fred



Anzeige

19
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: unterschiedliche Ergebnisse wenn Filter Reihenfolge anders
25.05.2024 15:58:48
daniel
Un was soll das ganze bewirken?
Kannst du mal kurz beschreiben, was das Makro mache soll?
AW: unterschiedliche Ergebnisse wenn Filter Reihenfolge anders
25.05.2024 16:09:32
Fred
Hallo Daniel,
das Makro soll in bestimmten Spalten (EA:EF, IB) Filterkombinationen finden, die (bei gefilterten Daten) für Spalte IC ein >60% Ergebnis ermitteln.
Irgendwie gibt es an dem Makro noch einiges zu schrauben :-)
Die Filterkombinationen sollen in Spalte IK eingetragen werden.

Gruss
Fred

Anzeige
AW: unterschiedliche Ergebnisse wenn Filter Reihenfolge anders
25.05.2024 16:41:59
Onur
Das war uns schon klar, das kann man dem Makro schon entnehmen.
Aber in eigenen Worten (ohne Excel-Ausdrücke): WAS willst du da GENAU berechnen bzw erreichen und wozu soll das dienen?
AW: unterschiedliche Ergebnisse wenn Filter Reihenfolge anders
25.05.2024 17:09:51
Fred
Hallo Onur,
ich möchte lediglich herausfinden, welche Filterkombinationen möglich sind, um auf eine über 60 prozentige Summe in IC (bei gefilterten Daten) zu gelangen.
Alle Filtermöglichkeiten die zu diesen Ergebnis führen, sollen untereinander in IK eingetragen werden.
Letztendlich sollen einzelne Filter angewandt werden und mehrere Filter.
Allerdings pro Ergebnis (in Spalte IK) nur mit maximal 1 Filter pro Spalte (EA:EF, IB)
Ein Beispielergebnis aus der Musterdatei:
in Spalte IK: IB>1, EA>0,5

Gruss
fred


Anzeige
AW: unterschiedliche Ergebnisse wenn Filter Reihenfolge anders
25.05.2024 17:14:32
Fred
Ob die zuvor beschriebene "Zielsetzung" zwingend das "praktische Filtern" erfordert, ist zweifelhaft,- wohl Nein.
Es gibt sicherlich andere Methoden, um ähnliche Ergebnisse zu erzielen, ohne den AutoFilter zu verwenden.
Ich habe das Ursprungsmakro aus dem Web und bastel nun dran rum.
AW: unterschiedliche Ergebnisse wenn Filter Reihenfolge anders
25.05.2024 17:16:10
Onur
Genau DESWEGEN frage ich ja auch nach deinen Intentionen. Wahrscheinlich hast du einen total falschen Lösungsansatz begonnen.
Anzeige
AW: unterschiedliche Ergebnisse wenn Filter Reihenfolge anders
25.05.2024 17:26:09
Fred
Ok Onur,
der "Lösungsansatz" ist mit Sicherheit nicht der richtige.
Auch meine BeispielDatei nicht. Habe alles (mir) nicht relevante gelöscht.
Werde nochmals ene Datei hochladen und nochmals drau eingehen.
Dauert aber noch über 20 Minuten

Gruss
Fred

AW: unterschiedliche Ergebnisse wenn Filter Reihenfolge anders
25.05.2024 17:52:51
Fred
Hallo Onur,
ja, wie (wie immer) geht es bei mir um Fußball.
In der Tabelle sind Daten und Leerzellen
Es sind historische Fußballspiele denen vor Beginn gewisse Daten zugeordnet wurden.
Ich will letztendlich durch filtern dieser Daten eine gewisse Prognose für zukünftige Fußballspiele erreichen.
Bisher mache ich ähnliches händisch,- das ist aber echt zeitaufwendig.
Zur Beispielmappe:
Im Beispielblatt steht zB, ob das Spiel mit >=2 Toren beendet wurde.
Ich möchte nun feststellen, wie viele Filterkombinationen (wie zuvor beschrieben) es gibt, um eine TrefferQuote von über 60% zu kommen.
Ist eigentlich doof, weil von vornherein zB im Blatt eine TrefferQuote von über 80% bei ungefilterten Daten ist. Soll aber ja nur ein Beispiel sein ...
Letztendlich soll mit 1 und/oder 2 Filtern zielführend gearbeitet werden. Allerdings nur jeweils 1 Filter pro Spalte (EA:EF, IB)
Das "praktische filtern" ist für das Makro mit so einer Zielsetzung sicherlich nicht notwendig.
https://www.herber.de/bbs/user/169703.xlsb

Gruss
Fred


Anzeige
AW: unterschiedliche Ergebnisse wenn Filter Reihenfolge anders
25.05.2024 19:42:51
Fred
Hallo Onur,
ich bin nun der gewünschten Makro Lösung viel näher.
Das neue Makro filtert Daten in einem Excel-Arbeitsblatt basierend auf Kriterien aus mehreren Spalten. Es prüft zuerst jede Spalte einzeln und dann jede Kombination von zwei Spalten mit den Operatoren ">", ">=", "=".
Für jede gültige Filterkombination berechnet es die Summe und Anzahl der gefilterten Werte in Spalte IC und speichert diese zusamen mit dem Durchschnitt in den Spalten IK bis IN. Es verwendet dazu keine Autofilter, sondern prüft jede Zeile direkt. Wenn keine Kombination die Kriterien erfüllt, wird "Negativ" in Zelle IK3 eingetragen. Und die Hilfsfunktion CheckCriteria unterstützt die Prüfung der Filterkriterien.
Die Funktion prüft, ob ein Wert (value) einem Referenzwert (refValue) gemäß einem Operator (operator) entspricht.
Ich werde heute Abend mal alles genaustens mit den Original DS überprüfen!
https://www.herber.de/bbs/user/169704.xlsb
Fazit: Viel Filter, kein Autofilter :-)

Gruss
Fred



Anzeige
AW: unterschiedliche Ergebnisse wenn Filter Reihenfolge anders
25.05.2024 19:44:43
Onur
Und du hältst wieder Monologe, statt meine Fragen zu beantworten.
AW: unterschiedliche Ergebnisse wenn Filter Reihenfolge anders
25.05.2024 20:04:42
Fred
Hallo Onur,
ja! Monologe im Forum sind nicht zielführend :-)

Meine erste Makro Version (die eigentlich eher die 10te war) ist mal so richtig falsch.

Sub Filter_2x_WithoutAutoFilter()

Dim ws As Worksheet
Set ws = ThisWorkbook.Sheets("Scalping")

Dim lastRow As Long
lastRow = ws.Cells(ws.Rows.Count, "A").End(xlUp).Row
ws.Range("IK7:IN" & lastRow).ClearContents ' Löscht den Bereich, in den die Ergebnisse geschrieben werden

Dim operators As Variant
operators = Array(">=", "=") ' mein Array der Operatoren, die verwendet werden sollen

Dim filterFields As Variant
filterFields = Array("IB", "EA", "EB", "EC", "ED") ' die Spalten, die gefiltert werden sollen
Dim ikRow As Long
ikRow = 7

Application.ScreenUpdating = False
Application.Calculation = xlCalculationManual

Dim i As Long, j As Long, n As Long, p As Long
Dim criteriaString As String

' Hier 1 Filter pro Spalte
For n = LBound(filterFields) To UBound(filterFields)
For Each op In operators
Dim totalIC As Double
Dim countIC As Long
totalIC = 0
countIC = 0


For r = 7 To lastRow

If CheckCriteria(ws.Cells(r, ws.Range(filterFields(n) & "6").Column).value, CStr(op), ws.Range(filterFields(n) & "7").value) Then
Dim icValue As Variant
icValue = ws.Cells(r, "IC").value


If IsNumeric(icValue) Then
icValue = CDbl(icValue)
totalIC = totalIC + icValue ' Summe der gefilterten Werte nach Spalte IC
countIC = countIC + 1 ' und Anzahl der gefilterten Werte nach Spalte IC
End If
End If
Next r

' Berechnung des Durchschnitts > 0.6
If countIC > 0 Then
Dim averageIC As Double
averageIC = totalIC / countIC
If averageIC > 0.6 Then
criteriaString = filterFields(n) & op & ws.Range(filterFields(n) & "7").value

ws.Cells(ikRow, "IK").value = criteriaString
ws.Cells(ikRow, "IL").value = averageIC
ws.Cells(ikRow, "IM").value = totalIC
ws.Cells(ikRow, "IN").value = countIC
ikRow = ikRow + 1
End If
End If
Next op
Next n

' mit 2 Filter kombiniert
For n = LBound(filterFields) To UBound(filterFields) - 1
For p = n + 1 To UBound(filterFields)
For Each op1 In operators
For Each op2 In operators
Dim totalICDouble As Double
Dim countICDouble As Long
totalICDouble = 0
countICDouble = 0

For r = 7 To lastRow

If CheckCriteria(ws.Cells(r, ws.Range(filterFields(n) & "6").Column).value, CStr(op1), ws.Range(filterFields(n) & "7").value) And _
CheckCriteria(ws.Cells(r, ws.Range(filterFields(p) & "6").Column).value, CStr(op2), ws.Range(filterFields(p) & "7").value) Then
Dim icValueDouble As Variant
icValueDouble = ws.Cells(r, "IC").value

' ist icValueDouble eine numerische Zahl
If IsNumeric(icValueDouble) Then
icValueDouble = CDbl(icValueDouble)
totalICDouble = totalICDouble + icValueDouble
countICDouble = countICDouble + 1
End If
End If
Next r

' Überprüfung, ob > 0.6 ist
If countICDouble > 0 Then
Dim averageICDouble As Double
averageICDouble = totalICDouble / countICDouble
If averageICDouble > 0.6 Then
criteriaString = filterFields(n) & op1 & ws.Range(filterFields(n) & "7").value & _
" UND " & filterFields(p) & op2 & ws.Range(filterFields(p) & "7").value

ws.Cells(ikRow, "IK").value = criteriaString
ws.Cells(ikRow, "IL").value = averageICDouble
ws.Cells(ikRow, "IM").value = totalICDouble
ws.Cells(ikRow, "IN").value = countICDouble
ikRow = ikRow + 1
End If
End If
Next op2
Next op1
Next p
Next n

' Wenn keine Ergebnisse gefunden wird
If ikRow = 7 Then
ws.Cells(3, "IK").value = "Negativ"
End If

Application.Calculation = xlCalculationAutomatic
Application.ScreenUpdating = True
End Sub

' Funktion, die prüft, ob ein Wert einem Kriterium entspricht
Function CheckCriteria(value As Variant, operator As String, refValue As Variant) As Boolean
Select Case operator
Case ">="
CheckCriteria = (value >= refValue)
Case "="
CheckCriteria = (value = refValue)
End Select
End Function

Die Resultate werde ich heute Abend überprüfen

Gruss
Fred


Anzeige
AW: unterschiedliche Ergebnisse wenn Filter Reihenfolge anders
25.05.2024 20:10:06
Onur
Meine Fragen hast du wieder ignoriert und ich habe langsam die Nase voll.

Noch eine Frage:
Wie kommst du auf dieses Ergebnis ?
Userbild
ICH komme auf 27 bzw 144, da es nur 0,1 oder 2 gibt, ist Alles =2 und da nur die 2en bei >=2 zutreffen, kommt da 27 heraus, also die Anzahl aller 2en.
Anzeige
AW: unterschiedliche Ergebnisse wenn Filter Reihenfolge anders
25.05.2024 20:59:24
Fred
Hallo Onur,
nun bin ich echt platt,- schon richtig konfus.
Ich weis nicht, aus welchen Beispiel (Sheet, Makro) du diese Berechnung hast.
Aufgrund der letzten Mappe, die ich hochgeladen habe ergibt sich folgendes:
Userbild

Anzeige
AW: unterschiedliche Ergebnisse wenn Filter Reihenfolge anders
25.05.2024 21:20:55
Onur
Dann halt so:

ALLE in IB sind =2 und nicht nur 197, da es nur 0 bis 2 gibt.
Es gibt 45 2er, also sind 45 in IB >=2, und nicht nur 44.
Wenn nur einer größer oder gleich 0,743730812127937 ist,
wie können nur 197 KLEINER GLEICH sein????
Es sind doch ALLE kleiner oder gleich das Maximum.


Userbild
Anzeige
AW: unterschiedliche Ergebnisse wenn Filter Reihenfolge anders
25.05.2024 21:41:29
Fred
Onur,
197 erfüllen das Kriterium,- das die Summe der gefilterten Daten in Spalte IB über 60% ausmacht.
AW: unterschiedliche Ergebnisse wenn Filter Reihenfolge anders
25.05.2024 22:12:47
Onur
"197 erfüllen das Kriterium,- das die Summe der gefilterten Daten in Spalte IB über 60% ausmacht." ??? Blödsinn !
Dein Code addiert aber die Werte aus IC und nicht aus IB.
Und die Zahl 197 ist einfach nur die Summe der ungefilterten Spalte IC - sonst NIX !
Anzeige
AW: unterschiedliche Ergebnisse wenn Filter Reihenfolge anders
25.05.2024 23:04:40
Fred
Ja Onur, und das ist richtig so!
Die 197 sind 80,74% der Summe - also >60%
Das ist die Aufgabe für das Makro. Die Kriterien zufinden, die zu einen Ergebnis von >60% in IC führen.

Gruss
Fred

AW: unterschiedliche Ergebnisse wenn Filter Reihenfolge anders
25.05.2024 19:40:01
Onur
Aber du vergleichst doch mit
Criteria1:=operators(i) & ws.Range(filterFields(n) & "7").Value

immer nur mit dem obersten Wert der jeweilgen Spalte (in Zeile 7). Ist das so korrekt ?
Und wieso überschneiden sich deine Operators?
operators = Array(">", ">=", "=")

Ausserdem brauchst du gar kein Makro. ZählenWenn bzw MittelwertWenn sollten reichen.
Was sind das für Prozentwerte in EA bis ED ?
Anzeige
AW: unterschiedliche Ergebnisse wenn Filter Reihenfolge anders
25.05.2024 17:14:45
Onur
Du wiederholst doch nur das bereits Gesagte......
Wozu genau dient das im wirklichen Leben ??? Wenn Fussball, WAS GENAU willst du berechnen? Und fange bitte nicht wieder mit irgendwelchen Filtern an.

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige