Hallo zusammen, ich habe eine Liste mit 2600 Menschen, die verschiedenen Vereinen angehören. Ich möchte diese Liste nach einzelnen Vereinen sortieren. Die Vereine sind kodiert, z.B. H015. In das Feld „Sheets("Sortieren").Range("D3")“ soll man den entsprechenden Code eingeben. Das folgende Makro funktioniert prima, solange die Menschen nur in einem Verein sind. Wenn in der großen Liste aber z.B. „A019, H015“ oder mehr in der entsprechenden Zelle steht, wird der Eintrag "H015" nicht gefunden. Ich habe schon mit LIKE und * experimentiert, aber keine Lösung gefunden. Deshalb bitte ich Euch um Hilfe. Vielen Dank im Voraus, Detlef
Hier das Makro:
Dim Verein As String Verein = Sheets("Sortieren").Range("D3").Value Sheets("Mitglieder kompl.").Select For i = 2 To 2600 If Cells(i, 22).Value = Verein Then Rows(i).Select Selection.Copy Sheets("Ergebnis").Select Cells(Rows.Count, 2).End(xlUp).Offset(1, 0).Select ActiveCell.EntireRow.Select ActiveSheet.Paste Sheets("Mitglieder kompl.").Select End If Next Sheets("Ergebnis").Select Range("A2").Select End Sub
in Deinem Fall wäre die Suche mit Instr notwendig, allerdings ist das Makro sehr verbesserungswürdig. Es wäre hilfreich, eine Musterdatei zu haben. Ggf würde das einfacher mit der Funktion FILTER realisierbar, ich weiß aber nicht ob 2021 die hat.
Gruß
Edgar
Meine Antworten sind freiwillig und ohne Gewähr! Über Rückmeldungen würde ich mich freuen.
26.05.2025, 22:52 (Dieser Beitrag wurde zuletzt bearbeitet: 26.05.2025, 23:13 von Detlef.)
Hallo BoskoBiati,
anbei meine Datei. Natürlich musste ich aus Datenschutzgründen vieles löschen, aber ich hoffe, es wird klar, wo mein Problem liegt. Dass das Makro verbesserungswürdig ist, glaube ich gern - ich habs allein zusammengebastelt, aber es läuft.
Ich habe gerade festgestellt, dass die Makros in der ersten Datei nicht richtig klappen - anscheinend habe ich zuviel Datenschutz betrieben... sorry dafür! Hier eine (hoffentlich) funktionierende Variante.
27.05.2025, 00:36 (Dieser Beitrag wurde zuletzt bearbeitet: 27.05.2025, 00:38 von Ralf A.)
(26.05.2025, 19:49)Detlef schrieb: Ich möchte diese Liste nach einzelnen Vereinen sortieren. Die Vereine sind kodiert, z.B. H015. In das Feld „Sheets("Sortieren").Range("D3")“ soll man den entsprechenden Code eingeben. Das folgende Makro funktioniert prima, solange die Menschen nur in einem Verein sind. Wenn in der großen Liste aber z.B. „A019, H015“ oder mehr in der entsprechenden Zelle steht, wird der Eintrag "H015" nicht gefunden. Ich habe schon mit LIKE und * experimentiert, aber keine Lösung gefunden. Deshalb bitte ich Euch um Hilfe.
Moin, ist ja schön, dass Du sortieren willst aber wonach? Nach Mitgliedsnr, Name, Verein??? Dein Makro stiftet mehr Verwirrung denn Klarheit. Ich versteh Dein Anliegen so: Du gibst einen Suchbegriff mit dem Vereinscode (Bsp. A011) ein und im Ergebnisblatt sollen nur die Mitglieder angezeigt werden, bei denen in der Spalte V (Verein) der Mitgliederliste der Suchcode enthalten ist. Stimmt das soweit? Ich hab Deine Datei mal ein wenig aufgeräumt. Den Suchcode wählst Du jetzt direkt oben im Ergebnisblatt aus... Wenn die Makros aktiviert sind, nach jeder Änderung des Suchcodes kurz warten oder Rechtsklick in die Ergebnistabelle und auf Aktualisieren klicken.
Der sicherste Ansatz für einen Irrtum ist der Glaube, alles im Griff zu haben. Nur, weil ich den Recorder bedienen kann, macht mich das noch lange nicht zum Musiker.
gerade frisch aus dem Testofen, bei mir funktioniert es. Ich habe bei mir eine CheckBox eingefügt! Eine KontrollBox mit dem Text "Ganze Zelle vergleichen". Grosser Unterschied z.B. bei Verein A019 Den gibt es nur als "A019", oder auch als Kombi "S091; A019" und "10; A019"
mfg Gast 123
Code:
Sub CommandButton1_Click() Dim rng As Range, Adr1 As String Dim ERG As Worksheet, z As Long Dim tbl As ListObject, SOpt As Variant 'Verein + Option laden (Ganze Zelle) Verein = Sheets("Sortieren").Range("D3") SOpt = Sheets("Sortieren").CheckBoxes(1).Value If SOpt = 1 Then SOpt = xlWhole Else SOpt = xlPart
Set ERG = Sheets("Ergebnis") 'Sheets setzen Set tbl = Sheets("Mitglieder kompl.").ListObjects(1) 'Suche Verein in Spalte V Set rng = tbl.ListColumns("Verein").DataBodyRange.Find(What:=Verein, After:=[v2], LookIn:=xlFormulas, _ LookAt:=SOpt, SearchOrder:=xlByColumns, SearchDirection:=xlNext, MatchCase:=False) If rng Is Nothing Then MsgBox Verein & " dieser Verein existiert nicht!": Exit Sub
Adr1 = rng.Address: z = 2 '1.Zeile Do 'alle Daten auflisten z = z + 1 tbl.ListRows(rng.Row - 1).Range.Copy ERG.Cells(z, 1).PasteSpecial xlPasteValues Set rng = tbl.ListColumns("Verein").DataBodyRange.FindNext(rng) Loop Until rng.Address = Adr1 Application.CutCopyMode = False End Sub
27.05.2025, 10:08 (Dieser Beitrag wurde zuletzt bearbeitet: 27.05.2025, 10:08 von snb.)
Warum kein Autofilter im Listobjects(1) in Tabelle Mitglieder komplett ? A009 als Kriterium funktioniert. Und dann sortieren im Feld 'Name'. 3 Arbeitslätter und die die Makros sind alle überflüssig.
Mit =Filter() ist es ein recht einfacher Weg die benötigte Teilstringsuche zu realisieren. Mit VBA kann man sowohl mit dem Like Operator als auch mit dem moderneren Instr() eine Teilstring Suche realisieren.
Um eine schnelle Ausgabe zu realisieren, welche einigermaßen effizient ist, wäre es wenigstens sinnvoll dies via Array zu machen und das Filtrat on Block auszugeben. Ein ebenso effizienter Weg ist mit dem AdvancedFilter (erweiterter Filter) mit Platzhalter ( ="=*Teilstring*" ) via CellFormula sich das Filtrat auf einem anderen Tabellenblatt ausgeben zu lassen.
Beispiele gibt es dafür im Netz zu Hauf. Hilft es nicht weiter, dann lade eine Demodatei hoch und ruck zuck wird es diverse Lösungsvorschläge dafür geben. Ich habe jetzt keine Lust eine Datei dafür nachzubauen.