Live-Forum - Die aktuellen Beiträge
Anzeige
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

Suche: Bei welcher Veranstaltungen waren Beide am Start?

Forumthread: Suche: Bei welcher Veranstaltungen waren Beide am Start?

Suche: Bei welcher Veranstaltungen waren Beide am Start?
06.11.2024 17:24:25
Gonzo Hoffmann
Liebe Excellenzen,

mir fehlt der Lösungsansatz für die folgende Problematik:
Ich habe eine größere Tabelle mit >14.000 Zeilen und 20 Spalten. Es sind die Ergebnisse von Sportwettkämpfen.
Für die Schilderung meines Problems kann man die Tabelle auf 3 Spalten eindampfen. Spalte A steht der WEttkampf, Spalte B die Sportler Spalte C die Runde die sie erreicht haben (Qualifikation, Halbfinale, Finale).

Ich möchte unterschiedliche Sportler vergleichen (beide immer unterschiedlich). Also filtern bei welchem Wettkampf waren die Sportler X und Y beide am Start und diese Wettkämpfe dann mit den Ergebnissen anzeigen lassen.
Wenn ich nach Spalte A filtere und dann in B die beiden relevanten Sportler filtere dann sehe ich auch die Wettkämpfe wo nur einer von beiden Teilgenommen hat. Die würde ich gerne rausfiltern.

Ich komme einfach auf keinen gescheiten Lösungsansatz der sowohl mit dem Filter, Formeln oder VBA sein kann (oder einer Mischung daraus?) aber auch entsprechend flexibel sein soll denn ich brauche das nicht nur einmal.

Freue mich auf eure Ideen!

https://www.herber.de/bbs/user/173433.xlsx

LG Gonzo
Anzeige

6
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Suche: Bei welcher Veranstaltungen waren Beide am Start?
06.11.2024 18:20:00
daniel
bei der Datenmenge:

1. nach Wettkampf sortieren.
2. in der ersten Hilfsspalte diese Formel (für das Beispiel Formel in D2, dann nach unten):
=B2&WENN(A2=A3;";"&D3;"")
3. in der zweiten Hilfsspalte, dann diese Formel in E2 und nach unten kopieren:
=WENN(A2=A1;E1;D2)

um zwei Sportler zu vergleichen dann in Spalte B nach "Enthält Sportler1 ODER Sportler2", und in der zweiten Spalte dann nach "Enthält Sportler1 UND Sportler2"
(hier musst du über das Kontextmenü des Autofilters gehen.

wenn du die Liste umsortieren willst, musst du die Beiden Hilfsspalten kopieren und als Wert einfügen.
die erste Hilfsspalte kannst du dann löschen wenn du magst.

Gruß Daniel
Anzeige
AW: Suche: Bei welcher Veranstaltungen waren Beide am Start?
06.11.2024 21:13:02
Gonzo Hoffmann
Hallo Daniel,

lieben Dank für Deinen Beitrag. Am Muster war der noch übersichtlich aber bei meiner Zeilenanzahl hab ich nichts mehr verstanden.
Trotzdem war Dein Ansatz sehr hilfreich weil er mich auf eine VBA Variante gebracht hat die nur eine Hilfsspalte braucht und etwas "handlicher" ist.

Ich frage für beide mittels countif ab ob die beim entsprechenden WEttkampf gestartet sind. ist das der Fall wird geprüft ob die aktuelle Zeile ihren Namensindex hat und ggf. entsprechend markiert. Das klappt prima.
Der folgende Code ist nur ein Ausschnitt und passt nicht zur Beispieltabelle. Ich poste den nur weil er ggf. auch mal jemand anderem als Ansatz dienen kann.



...
AthletA = InputBox("Athletennummer angeben", "Athlet 1", 2573)
AthletB = InputBox("Athletennummer angeben", "Athlet 2", 4107)
For i = 2 To LetzteZeile
x = WorksheetFunction.CountIfs(Columns("g:g"), AthletA, Columns("A:A"), Cells(i, 1))
y = WorksheetFunction.CountIfs(Columns("g:g"), AthletB, Columns("A:A"), Cells(i, 1))
If x > 0 And y > 0 Then
If Cells(i, 7) = AthletA Or Cells(i, 7) = AthletB Then
'Cells(i, Markierungsspalte).Select
Cells(i, Markierungsspalte) = "x"
End If
End If
x = 0
y = 0
Next
...


Daniel, nochmals vielen Dank!
Gonzo
Anzeige
AW: Suche: Bei welcher Veranstaltungen waren Beide am Start?
07.11.2024 07:22:48
daniel
Hi
schön, dass du deinen eigenen Ansatz gefunden hast.
bei der Datenmenge sehe ich jedoch die Gefahr, dass diese etwas länger benötigen wird, das CountIF bei größeren Datenmengen zu längeren Rechenzeiten führen kann.
Aber wenn es bei dir schnell genug ist, warum nicht.
Gruß Daniel
AW: Suche: Bei welcher Veranstaltungen waren Beide am Start?
11.11.2024 18:04:03
emkaes
Hi,

hier mal ein Ansatz mit AdvancedFilter und Dictionary mit VBA

Datei benötigt eine weitere Tabelle ( Output ) und einen Verweis auf die Scripting Runtime

https://www.herber.de/bbs/user/173528.xlsm

Option Explicit

Public Enum eResultType
list1only = 1
both = 2
list2only = 3
End Enum

Function useAdvancedFilterCopy(rgData As Range, rgCriteria As Range, rgOutput As Range) As Dictionary
Dim arr As Variant
Dim dict As New Dictionary
Dim i As Long
On Error GoTo fin
rgOutput.CurrentRegion.ClearContents

rgData.AdvancedFilter xlFilterCopy, rgCriteria, rgOutput

arr = rgOutput.CurrentRegion.Offset(1).Resize(rgOutput.CurrentRegion.Rows.Count - 1).Value2
rgOutput.CurrentRegion.ClearContents

For i = LBound(arr) To UBound(arr)
dict(arr(i, 1)) = 0
Next

Set useAdvancedFilterCopy = dict
Exit Function
fin:
MsgBox "es ist Fehler aufgetreten"
End Function

Sub callfilter()
Dim sPerson1 As String, sPerson2 As String
Dim rgData As Range, rgCriteria As Range, rgOutput As Range
Dim dictResult As New Dictionary
Dim dictList1 As New Dictionary
Dim dictList2 As New Dictionary

Set rgData = Worksheets("Tabelle1").Range("A8").CurrentRegion
Set rgCriteria = Worksheets("Tabelle1").Range("A1").CurrentRegion
Set rgOutput = Worksheets("Output").Range("A1")
rgData.AutoFilter

sPerson1 = InputBox("Sportler1")
If StrPtr(sPerson1) = 0 Then
MsgBox " ungültiger Input"
Exit Sub
Else
rgCriteria.Cells(5).Value = sPerson1
Set dictList1 = useAdvancedFilterCopy(rgData, rgCriteria, rgOutput)
End If

sPerson2 = InputBox("Sportler2")
If StrPtr(sPerson2) = 0 Then
MsgBox " ungültiger Input"
Exit Sub
Else
rgCriteria.Cells(5).Value = sPerson2
Set dictList2 = useAdvancedFilterCopy(rgData, rgCriteria, rgOutput)
End If


Set dictResult = compareList(dictList1, dictList2, both)
If dictResult.Count > 0 Then
With rgData
.AutoFilter
.AutoFilter Field:=1, Criteria1:=dictResult.Keys, Operator:=xlFilterValues
.AutoFilter Field:=2, Criteria1:=sPerson1, Operator:=xlOr, Criteria2:=sPerson2
End With
Else
MsgBox "Sportler nicht gegeneinander angetreten"
End If

End Sub

Public Function compareList(dict1 As Dictionary, dict2 As Dictionary, rtype As eResultType) As Dictionary

Dim dictResult As New Dictionary, dict2Only As New Dictionary
Dim item As Variant

For Each item In dict2
If dict1.Exists(item) = True Then
dictResult(item) = 0
dict1.Remove item
Else
dict2Only(item) = 0
End If
Next

Select Case rtype
Case both
Set compareList = dictResult
Case list1only
Set compareList = dict1
Case list2only
Set compareList = dict2Only
End Select
End Function
Anzeige
AW: Suche: Bei welcher Veranstaltungen waren Beide am Start?
07.11.2024 09:55:34
Gonzo Hoffmann
Hi,

ja, das finde ich noch akzeptabal von der Zeit her. Ein Durchlauf dauert 35 Sekunden. Habe aber dazu Screenupdating ausgeschaltet und Berechnungen auf Manuell gestellt weil das Blatt auch sonst noch ein paar Formeln hat :-).

Nochmals vielen Dank! Ohne Deinen Beitrag keine Lösung!!!!

LGG
Anzeige
AW: Suche: Bei welcher Veranstaltungen waren Beide am Start?
07.11.2024 10:00:20
daniel
wenn du meinen Ansatz programmierst
(Sortieren, Hilfsspalten einfügen, Hilfsspaltenformeln durch Werte ersetzen, erste Hilfsspalte wieder löschen)
dann sollten mit deren Hilfe die eigenlichen Auswertungen deutlich schneller gehen.
35 sekunden ist für so eine Aufgabe inakzeptabel langsam. 0,35 Sekunden wäre ok und sollte erreichbar sein.

Gruß Daniel
Anzeige
;

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Entdecke mehr
Finde genau, was du suchst

Die erweiterte Suchfunktion hilft dir, gezielt die besten Antworten zu finden

Suche nach den besten Antworten
Unsere beliebtesten Threads

Entdecke unsere meistgeklickten Beiträge in der Google Suche

Top 100 Threads jetzt ansehen
Anzeige