Supportnet / Forum / Tabellenkalkulation
Schwierige Sortierung
Frage
Hallo an alle Excel - Freaks !
Ich habe eine Preisliste, die auf einer Excel Liste basiert.
In der Spalte A1 Steht der Botanische Name (fett gedruckt), darunter (A2) der deutsche Name, darunter (A3) die Qualität.
Neben der Qualität ( B3) kommt die Größe, daneben (B4-6) bis zu 3 Preise.
Zur Verdeutlichung hier ein Bild :
[url]www.hils-koop.de/pliste.jpg[/url]
Die Liste ist in verschiedene Kapitel eingeteilt, manche Pflanzen wiederholen sich zB als Strauch und als Heckenpflanze.
Gerne würde ich die Liste alphabetisch nach botan. Namen sortieren, da dies im verkauf praktischer wäre als die Kapiteleinteilung, die für Privatkunden gedacht ist.
Jetzt stehen aber eine unterschiedliche Anzahl von Zeilen untereinader, die zusammen gehören, von 3 bis mehr als 7.
Das einzig trennende Element ist der Fettdruck.
Liesse sich mit Hilfe des Fettdrucks vielleicht doch eine Sortierung vornehmen ? Der Fettdruck zeigt immer den Beginn eines neuen Blocks an, die Blöcke müssten miteinander sortiert werden, der Block selber darf aber nicht auseinander gerissen werden.
Ich weiss, dass diese Liste keine Datenbank Struktur hat, aber die Liste wurde aus einer PDF-Datei übernommen, die davor von unserem Brachenprogramm erstellt wurde. Leider ging das nicht anders.
Vielleicht klässt sich da was per Makro oder Script machen ? Ich habe davon keine Ahnung, lese aber immer wieder hier im SN voller Ehrfurcht, was mit Excel machbar ist, und wie einfallsreich ihr seid...
Auf Rückfragen kann ich leider erst heute spät am Abend oder morgen eingehen, da mein kleiner Sohn jetzt noch meine Aufmerksamkeit fordert...
Bis später,
Mikoop
Antwort 1 von Saarbauer
Hallo,
grundsätzlich ist die Sortierung nach dem fettgedrucken Text möglich, aber nur mit VBA. Ist es möglich mir die Tabelle zukommenzu lassen?
Schreib mal deine Email-Adresse ich sende dann meine an dich.
Gruß
Helmut
grundsätzlich ist die Sortierung nach dem fettgedrucken Text möglich, aber nur mit VBA. Ist es möglich mir die Tabelle zukommenzu lassen?
Schreib mal deine Email-Adresse ich sende dann meine an dich.
Gruß
Helmut
Antwort 2 von rainberg
Hallo Mikoop,
folgendes Makro läuft unter folgenden Bedingungen:
- Datenbereich = A1:Exxxx
- es gibt keine Spaltenüberschriften
- nur die botanischen Namen sind in Fettschrift
Gruß
Rainer
folgendes Makro läuft unter folgenden Bedingungen:
- Datenbereich = A1:Exxxx
- es gibt keine Spaltenüberschriften
- nur die botanischen Namen sind in Fettschrift
Option Explicit
Sub sortieren()
Dim lngI As Long, lngZeile As Long
Application.ScreenUpdating = False
For lngI = 1 To ActiveSheet.UsedRange.Rows.Count
If Cells(lngI, 1).Font.Bold = True Then Cells(lngI, 8).Value = Cells(lngI, 1).Value
If Cells(lngI, 1).Font.Bold = False Then Cells(lngI, 8).Value = Cells(lngI - 1, 8).Value
Next
Columns("A:H").Select
Application.CutCopyMode = False
Selection.Sort Key1:=Range("H1"), Order1:=xlAscending, Header:=xlNo
Columns("H:H").ClearContents
Application.ScreenUpdating = True
End SubGruß
Rainer
Antwort 3 von ChatAlligator
Hi Micop,
du hast recht, ohne weiteres geht das nicht (zumal unterschiedliche Anzahl von Zeilen zu jedem Artikel gehören)
Es ist richtig, dass ein Makro dieses Problem lösen kann (wie so viele)
Ein passendes Makro findest du nachfolgend
Gruß CA
´--------------------------------------------------
Option Explicit
Sub Sortierung()
Dim Anfang, Ende, Ziel As Long ´Zeilen eines zu verschiebenden Blocks
Dim Erste, Letzte As Long ´Zeilen, die mit relevanten Einträgen belegt sind
Letzte = Range("A65536").End(xlUp).Row
Anfang = 1
´Suche Anfang (erste fettgedruckte Zelle in Spalte A)
While Not (Cells(Anfang, 1).Font.Bold Or Anfang > Letzte)
Anfang = Anfang + 1
Wend
Erste = Anfang
´Suche Artikel
While Not Anfang > Letzte
´Suche Ende von Artikel
Ende = Anfang
While Not (Cells(Ende + 1, 1).Font.Bold Or Ende + 1 > Letzte)
Ende = Ende + 1
Wend
´Suche Ziel
Ziel = Erste
While Not (Ziel > Anfang Or (Cells(Ziel, 1).Font.Bold And Cells(Ziel, 1).Value > Cells(Anfang, 1).Value))
Ziel = Ziel + 1
Wend
´Verschieben
If Ziel < Anfang Then
Rows(Trim(CStr(Ziel)) & ":" & Trim(CStr(Ziel + Ende - Anfang))).Select
Selection.Insert Shift:=xlDown
Rows(Trim(CStr(Ende + 1)) & ":" & Trim(CStr(Ende + 1 + Ende - Anfang))).Select
Selection.Copy
Rows(Trim(CStr(Ziel)) & ":" & Trim(CStr(Ziel + Ende - Anfang))).Select
ActiveSheet.Paste
Rows(Trim(CStr(Ende + 1)) & ":" & Trim(CStr(Ende + 1 + Ende - Anfang))).Select
Selection.Delete Shift:=xlUp
End If
Anfang = Ende + 1
Wend
End Sub
´--------------------------------------------------
du hast recht, ohne weiteres geht das nicht (zumal unterschiedliche Anzahl von Zeilen zu jedem Artikel gehören)
Es ist richtig, dass ein Makro dieses Problem lösen kann (wie so viele)
Ein passendes Makro findest du nachfolgend
Gruß CA
´--------------------------------------------------
Option Explicit
Sub Sortierung()
Dim Anfang, Ende, Ziel As Long ´Zeilen eines zu verschiebenden Blocks
Dim Erste, Letzte As Long ´Zeilen, die mit relevanten Einträgen belegt sind
Letzte = Range("A65536").End(xlUp).Row
Anfang = 1
´Suche Anfang (erste fettgedruckte Zelle in Spalte A)
While Not (Cells(Anfang, 1).Font.Bold Or Anfang > Letzte)
Anfang = Anfang + 1
Wend
Erste = Anfang
´Suche Artikel
While Not Anfang > Letzte
´Suche Ende von Artikel
Ende = Anfang
While Not (Cells(Ende + 1, 1).Font.Bold Or Ende + 1 > Letzte)
Ende = Ende + 1
Wend
´Suche Ziel
Ziel = Erste
While Not (Ziel > Anfang Or (Cells(Ziel, 1).Font.Bold And Cells(Ziel, 1).Value > Cells(Anfang, 1).Value))
Ziel = Ziel + 1
Wend
´Verschieben
If Ziel < Anfang Then
Rows(Trim(CStr(Ziel)) & ":" & Trim(CStr(Ziel + Ende - Anfang))).Select
Selection.Insert Shift:=xlDown
Rows(Trim(CStr(Ende + 1)) & ":" & Trim(CStr(Ende + 1 + Ende - Anfang))).Select
Selection.Copy
Rows(Trim(CStr(Ziel)) & ":" & Trim(CStr(Ziel + Ende - Anfang))).Select
ActiveSheet.Paste
Rows(Trim(CStr(Ende + 1)) & ":" & Trim(CStr(Ende + 1 + Ende - Anfang))).Select
Selection.Delete Shift:=xlUp
End If
Anfang = Ende + 1
Wend
End Sub
´--------------------------------------------------
Antwort 4 von Saarbauer
Hallo,
damit hat sich glaube ich das Problem erledigt, hätte eine entsprechende VBA erst basteln müssen. Da @ rainberg und @ChatAlligator fast gleichen Aufbau ihres Makros haben, werde ich mir nicht mehr die Mühe machen.
Gruß
Helmut
damit hat sich glaube ich das Problem erledigt, hätte eine entsprechende VBA erst basteln müssen. Da @ rainberg und @ChatAlligator fast gleichen Aufbau ihres Makros haben, werde ich mir nicht mehr die Mühe machen.
Gruß
Helmut
Antwort 5 von ChatAlligator
Noch eine kleine Bemerkung zu meinem Makro:
Eine Überschrift würde automatisch berücksichtigt (unabhängig von deren Zeilenanzahl, also nicht mit in Sortierung einbezogen), wenn sie nicht fett geschrieben ist. Anzahl der Zeilen und Spalten eines jeden Artikels spielen keine Rolle.
Einzige Einschränkung:
Es darf keine Tabelle daneben stehen (deren Zeilen würden mitverschoben)
Gruß CA
Eine Überschrift würde automatisch berücksichtigt (unabhängig von deren Zeilenanzahl, also nicht mit in Sortierung einbezogen), wenn sie nicht fett geschrieben ist. Anzahl der Zeilen und Spalten eines jeden Artikels spielen keine Rolle.
Einzige Einschränkung:
Es darf keine Tabelle daneben stehen (deren Zeilen würden mitverschoben)
Gruß CA
Antwort 6 von Mikoop
Hallo,
Danke erst mal an euch alle, ich werde eure Makros übers Wochenende ausprobieren und gebe Bescheid, ob es geklappt hat.
Gruss, Mikoop
Danke erst mal an euch alle, ich werde eure Makros übers Wochenende ausprobieren und gebe Bescheid, ob es geklappt hat.
Gruss, Mikoop
Antwort 7 von Mikoop
Hallo nochmal,
Jetzt habe ich die Makros ausprobiert.
Die Kapitelüberschriften hatte ich vorher von Hand entfernt.
@rainberg
Dein Makro lief sauber durch und hat wie gewünscht sortiert - vielen Dank dafür.
@ChatAlligator
Dein Makro blieb gleich am Anfang mit der Meldung ´Kompilierungsfehler´ stehen. Keine Ahnung was das bedeutet, vielleicht habe ich auch was falsch gemacht, von Makros habe ich keine Ahnung, von Excel auch nicht viel mehr...
Auch dir vielen Dank für die Mühe.
@all
Jetzt hat sich noch ein kleines Problem ergeben (wie das immer so ist...)
Manche Pflanzen (Datenblocks) kommen in mehreren Kapiteln vor. Diese werden jetzt getrennt untereinander geschrieben, obwohl es sich um dieselbe Pflanze in versch. Qualitäten handelt. Zum Teil enthalten diese sogar dieselben Daten.
Wäre es (mit einem 2. Makro) möglich, diese doppelten Datensätze zu eliminieren und die anderen Qualitäten untereinander zu schreiben, statt 2 Blocks mit demselben bot. Namen im Fettdruck untereinander zu legen ?
Grüsse, Mikoop
Jetzt habe ich die Makros ausprobiert.
Die Kapitelüberschriften hatte ich vorher von Hand entfernt.
@rainberg
Dein Makro lief sauber durch und hat wie gewünscht sortiert - vielen Dank dafür.
@ChatAlligator
Dein Makro blieb gleich am Anfang mit der Meldung ´Kompilierungsfehler´ stehen. Keine Ahnung was das bedeutet, vielleicht habe ich auch was falsch gemacht, von Makros habe ich keine Ahnung, von Excel auch nicht viel mehr...
Auch dir vielen Dank für die Mühe.
@all
Jetzt hat sich noch ein kleines Problem ergeben (wie das immer so ist...)
Manche Pflanzen (Datenblocks) kommen in mehreren Kapiteln vor. Diese werden jetzt getrennt untereinander geschrieben, obwohl es sich um dieselbe Pflanze in versch. Qualitäten handelt. Zum Teil enthalten diese sogar dieselben Daten.
Wäre es (mit einem 2. Makro) möglich, diese doppelten Datensätze zu eliminieren und die anderen Qualitäten untereinander zu schreiben, statt 2 Blocks mit demselben bot. Namen im Fettdruck untereinander zu legen ?
Grüsse, Mikoop
Antwort 8 von rainberg
Hallo Mikoop,
habe das Makro erweitert, die Zeilen mit den mehrfach vorkommenden fetten Namen werden nun gelöscht.
Gruß
Rainer
habe das Makro erweitert, die Zeilen mit den mehrfach vorkommenden fetten Namen werden nun gelöscht.
Option Explicit
Sub sortieren()
Dim lngI As Long
Application.ScreenUpdating = False
For lngI = 1 To ActiveSheet.UsedRange.Rows.Count
If Cells(lngI, 1).Font.Bold = True Then Cells(lngI, 8).Value = Cells(lngI, 1).Value
If Cells(lngI, 1).Font.Bold = False Then Cells(lngI, 8).Value = Cells(lngI - 1, 8).Value
Next
Columns("A:H").Select
Application.CutCopyMode = False
Selection.Sort Key1:=Range("H1"), Order1:=xlAscending, Header:=xlNo
Columns("H:H").ClearContents
For lngI = 1 To ActiveSheet.UsedRange.Rows.Count
If WorksheetFunction.CountIf(Range("A$1:A" & lngI), Range("A" & lngI)) > 1 _
And Range("A" & lngI).Font.Bold = True Then
Rows(lngI).Delete
Rows(lngI).Delete
End If
Next
Application.ScreenUpdating = True
Range("A1").Select
End SubGruß
Rainer
Antwort 9 von Mikoop
Hallo Rainer,
Nochmals vielen Dank.
Es funktioniert zwar nicht 100 %, aber die paar Reste kann ich in wenigen Minuten von Hand nachbearbeiten.
Viele Grüsse, Mikoop
Nochmals vielen Dank.
Es funktioniert zwar nicht 100 %, aber die paar Reste kann ich in wenigen Minuten von Hand nachbearbeiten.
Viele Grüsse, Mikoop
Antwort 10 von rainberg
Hallo Mikoop,
offenbar hat dann deine Beschreibung nicht 100%ig der tatsächlichen Tabellenstuktur entsprochen.
Ich hatte eine Dummy-Tabelle mit 2000 Zeilen gebastelt, wobei es bei jeder Pflanzenart einen fetten botanischen Namen, einen Namen in Normalschrift und 3 bis 6 Zusatzzeilen je Art gibt.
Diese Tabelle hat das Makro 100% richtig sortiert und Mehrfachnamen entfernt.
Gruß
Rainer
offenbar hat dann deine Beschreibung nicht 100%ig der tatsächlichen Tabellenstuktur entsprochen.
Ich hatte eine Dummy-Tabelle mit 2000 Zeilen gebastelt, wobei es bei jeder Pflanzenart einen fetten botanischen Namen, einen Namen in Normalschrift und 3 bis 6 Zusatzzeilen je Art gibt.
Diese Tabelle hat das Makro 100% richtig sortiert und Mehrfachnamen entfernt.
Gruß
Rainer
Antwort 11 von Mikoop
Hallo, Rainer,
Aufgeben kennst du nicht ,oder ?
Gesten abend sass ich am Laptop und hatte kein Programm ( und die Daten) zum Upload zur Verfügung.
Jetzt bin ich wieder im Büro und habe ein Bild hochgeladen, wie die Liste nach Durchführung deines 1. Makros aussieht (der gelbe Hintergrund kommt nachträglich von mir und dient nur zur Verdeutlichung)
http://www.hils-koop.de/dublette.jpg
Jetzt hat es 2 x Carpinus betulus (und andere im Laufe der Liste), 1 x könnte der bot. und dt. Name entfernt werden und die Qualitäten untereinander stehen, evtl. doppelt vorh. Sätze gelöscht werden).
Aber das ist nicht all zu viel Mühe wert, da ich das auch von Hand nachbearbeiten kann.
Gruss und schönen Sonntag !
Mikoop
Aufgeben kennst du nicht ,oder ?
Gesten abend sass ich am Laptop und hatte kein Programm ( und die Daten) zum Upload zur Verfügung.
Jetzt bin ich wieder im Büro und habe ein Bild hochgeladen, wie die Liste nach Durchführung deines 1. Makros aussieht (der gelbe Hintergrund kommt nachträglich von mir und dient nur zur Verdeutlichung)
http://www.hils-koop.de/dublette.jpg
Jetzt hat es 2 x Carpinus betulus (und andere im Laufe der Liste), 1 x könnte der bot. und dt. Name entfernt werden und die Qualitäten untereinander stehen, evtl. doppelt vorh. Sätze gelöscht werden).
Aber das ist nicht all zu viel Mühe wert, da ich das auch von Hand nachbearbeiten kann.
Gruss und schönen Sonntag !
Mikoop
Antwort 12 von rainberg
Hallo Mikoop,
ich hatte dich schon richtig verstanden.
Nur noch zur Klarstellung:
Mit der Erstellung des zweiten Makros, hat sich das erste erledigt.
D.h. du kannst das zweite Makro gleich auf die Ursprungsdatei los lassen.
Im Falle deines Bildes löscht das Makro die Zeilen 187 und 188 und das sollte bei dir auch so sein.
Ebenfalls einen schönen Restsonntag und
Gruß
Rainer
ich hatte dich schon richtig verstanden.
Nur noch zur Klarstellung:
Mit der Erstellung des zweiten Makros, hat sich das erste erledigt.
D.h. du kannst das zweite Makro gleich auf die Ursprungsdatei los lassen.
Im Falle deines Bildes löscht das Makro die Zeilen 187 und 188 und das sollte bei dir auch so sein.
Ebenfalls einen schönen Restsonntag und
Gruß
Rainer

