Sortierung einer Spalte innerhalb einer Tabelle ohne andere Spalten mit zu sortieren

  • Excel

Es gibt 76 Antworten in diesem Thema. Der letzte Beitrag () ist von cry.baby.

    Parawolli schrieb:

    Der Code ist jetzt genau 4342 Zeilen lang. Tendenz steigend, denn ich muss für unsere Highrunner eine dritte Farbe (Schleife) einbauen.

    Ich habe mal ganz grob in den Code geschaut.
    Da sind zig oder hunderte aneinandergereihte Codes in der Variante:

    Visual Basic-Quellcode

    1. 'Für GV0739_orange3
    2. Gezählt = 0
    3. For Each r In Intersect(.UsedRange, .Range("B:B"))
    4. If r = "GV0739" And r.Offset(0, 3) = "geplant" And Gezählt < 1 Then
    5. Gezählt = Gezählt + r.Count
    6. r.Offset(0, 2).Interior.Color = orange3
    7. End If
    8. Next r​

    Das liesse sich in eine Funktion packen.
    und der Aufruf der Funktion in eine intelligente Schleife.

    Ich habe derzeit so gut wie keine Zeit, aber ich bin davon überzeugt, dass da noch einiges an Optimierungspotential drin steckt.
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --

    Parawolli schrieb:


    Aber wenn ich es so schreibe r.offset(0, -1), dann funktioniert es nicht mehr. Denn ich möchte ja Spalte A nicht Spalte B eingefärbt haben, So nimmt er immer nur die jeweils letzten Farben einer GV.

    Visual Basic-Quellcode

    1. If r = ArrayGV(i, 1) And Zähler < ArrayGV(i, 2) And r.Interior.Color = CellBlank Then
    2. r.Offset(0, -1).Interior.Color = ArrayGV(i, 4)
    3. Zähler = Zähler + 1




    Update: Du musst auch in der If-Then Schleife abfragen, ob die Zelle links von r blank ist. Ansonsten färbt er es mit der zweiten Farbe von z.B. GV0598 ein:

    Visual Basic-Quellcode

    1. If r = ArrayGV(i, 1) And Zähler < ArrayGV(i, 2) And r.Offset(0, -1).Interior.Color = CellBlank Then



    r.offset(0, -1) ist korrekt. Habe es ausprobiert und bei mir funktioniert es wunderbar. Welche Fehlermeldung wirft er aus?

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „cry.baby“ ()

    "cry.baby schrieb:

    Update: Du musst auch in der If-Then Schleife abfragen, ob die Zelle links von r blank ist. Ansonsten färbt er es mit der zweiten Farbe von z.B. GV0598 ein:

    Logisch hast Recht. Sorry kleiner Blackout von mir.
    Das mit CellBlank kann ich besser raus lassen, weil ich ohnehin im Original Code die Spalte A vorher alle Farben raus lösche und außerdem habe ich bemerkt, das wenn ich 2x auf den Common Button klicke, er mir bein zweiten Durchlauf weitere Farben der Spalte A einfärbt, obwohl das die Auftragsmenge nicht hergibt.

    Zum Schluss möchte ich mich besonders bei Dir und petaod für so viel Unterstützung bedanken. Ich kenne kein Forum wo so gut miteinander umgegangen wird und wo man so viel Hilfsbereitschaft erfährt wie hier. Ich wünschte ich könnte so gut Programmieren wir Ihr beide.

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „Parawolli“ ()

    Ich wundere mich, dass der Code bei Dir ohne die CellBlank-Abfrage funktioniert. ?( Er fragt nämlich in der For Each-Schleife zunächst folgende Bedingungen ab, bevor er einfärbt:

    1. entspricht der Zellinhalt r der Materialnummer aus dem Array?
    2. Anzahl der Einfärbungen, damit er weiß wie oft er noch einfärben soll
    3. ist die Zelle bereits eingefärbt?

    Korrektur: Du musst die Zeile natürlich an den Anfang vom Makro stellen, nicht ans Ende :D :
    Wenn Du Punkt 3 weglässt, färbt er z.B. für GV0598 alle bereits eingefärbten Zellen mit der zweiten Farbe ein. Wenn Du den Button 2x klickst, führt er das natürlich für alle weiteren Zellen ohne Farbfüllung weiter, d.h. Du kannst am Ende des Makros noch folgende Zeile einfügen, damit alle Einfärbungen gelöscht werden:

    Visual Basic-Quellcode

    1. Tabelle1.Range("A:A").Interior.Color = 16777215


    Ansonsten; sehr gerne geschehen. Habe auch dazugelernt.

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „cry.baby“ ()

    Visual Basic-Quellcode

    1. ArrayGV_FID = Tabelle2.Range("A2", Tabelle2.Range("A2").End(xlToRight).End(xlDown))


    Kurze Verständnisfrage, damit ich den Code auch verstehe.
    Mit Tabelle2 ist anscheinend nicht die Bezeichnung "Tabelle2" gemeint, sondern das diese an zweiter Position von links in Arbeitsblatt ist. Richtig?
    Meine Original Tabelle heißt "FID" und wenn ich in dieser Zeile Tabelle2 jeweils gegen FID ändere dann funktioniert nichts mehr.

    Visual Basic-Quellcode

    1. For i = LBound(ArrayGV_FID, 1) To UBound(ArrayGV_FID, 1)


    Was bedeutet die 1 hinter dem ArrayGV_FID

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Parawolli“ ()

    Tabelle2 entspricht der Bezeichnung des Arbeitsblattes in Klammern (-> siehe Projekt-Explorer). Ändere also daran nichts, es sei denn das Array soll aus einem anderen Arbeitsblatt/Worksheet erstellt werden.

    Das Array ist in diesem Fall zweidimensional. Z.B. entspricht ArrayGV_FID(1, 2) der ersten Zeile in der zweiten Spalte. Du kannst das Array auch sehr schön detailliert im Direktbereich einsehen, wenn Du z.B. den Code mit F8 durchgehst. Mit LBound(ArrayGV_FID, 1) to Ubound(ArrayGV_FID, 1) sagst Du der For-Next-Schleife, dass sie vom ersten/lower (LBound) bis zum letzten/upper (UBound) Wert der ersten Dimension durchzählen soll. Also wenn Du z.B. 10 Zeilen in dem Array hast, dann könntest du auch sagen For i = 1 to 10.
    Wenn Du jetzt im Array die Dimension 2 anstelle 1 angegeben hättest, würde er von/bis der Anzahl Spalten durchzählen, die im Array enthalten sind.

    Hoffe das war einigermaßen verständlich.

    cry.baby schrieb:

    Tabelle2 entspricht der Bezeichnung des Arbeitsblattes in Klammern (-> siehe Projekt-Explorer). Ändere also daran nichts, es sei denn das Array soll aus einem anderen Arbeitsblatt/Worksheet erstellt werden.

    Ah jetzt verstehe ich auch warum es in meiner anderen Datei nicht läuft.
    Kann man die Zuweisung ändern?
    Im Explorer ging es nicht.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Parawolli“ ()

    Update: Petaod hat es bereits beantwortet.

    Was meinst du mit "Kann man die Zuweisung ändern"? Die Bezeichnungen kannst Du im Explorer unter Eigenschaften/Namen bzw. (Namen) ändern.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „cry.baby“ ()

    Kann es sein, das in Tabelle 2 die GV Nr. immer in Spalte A stehen müssen?
    In Wirklichkeit stehen nämlich die GV Nr. Spalte B und die Stückzahlen in Spalte C.
    Hatte gedacht ich könnte in der Array Zuweisung einfach jeweils "A2" gegen "B2" tauschen

    Visual Basic-Quellcode

    1. ArrayGV = Tabelle10.Range("B2", Tabelle10.Range("B2").End(xlToRight).End(xlDown))


    und in der IF Schleife einfach (i, 1) gegen (i, 2) und (i,2) gegen (i,3) ersetzen. Funktioniert aber nicht. Warum?

    Visual Basic-Quellcode

    1. If r = ArrayGV(i, 2) And Zähler < ArrayGV_CLD(i, 3) And r.Offset(0, -1).Interior.Color = CellBlank Then

    Dieser Beitrag wurde bereits 6 mal editiert, zuletzt von „Parawolli“ ()

    Meinst Du das Direktfenster oder das Lokal-Fenster.
    Im Direktfenster wird nichts angezeigt.
    Im Lokal-Fenster werden z.B. die Variablen angezeigt.

    Meiner Meinung habe ich aber auch die IF Schleife angepasst indem ich die Variable i geändert habe.
    i, 1 in i, 2 und i, 3 in i, 4
    Hatte onem m geschrieben weil ich die Variable m deklariert hatte.
    Du musst den Code mit F8 Zeile für Zeile durchgehen und nachdem er dem Array die Range zuweist, bleibst Du stehen bzw. setzt einen Haltepunkt mit F9.

    Visual Basic-Quellcode

    1. ArrayGV = Tabelle10.Range("B2", Tabelle10.Range("B2").End(xlToRight).End(xlDown))

    Anschließend siehst Du im Direktfenster das Array und kannst es öffnen.

    Wenn ich es recht sehe, musst Du das Array in der if-Schleife nicht ändern. Die GV-Nr ist noch immer in der Spalte 1 des Array und die Stückzahl in Spalte 2, da Du die Range von A auf B geändert hast. Du musst lediglich checken, wo die Farbnummern aus der Hilfsspalte im Array sind -> ich vermute in Spalte 3 (vorher 4 wie in nachfolgender Zeile abgebildet) . Das ist relevant für die Einfärbung ->

    Visual Basic-Quellcode

    1. r.Interior.Color = ArrayGV(i, 4)

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „cry.baby“ ()

    Das mit dem Direktfenster habe ich auch so gemacht wie Du beschreibst.
    Allerdings sehe ich dort nichts.
    Habe Dir einen Screenshot angehangen.

    Jetzt habe ich aber verstanden, das sich die Variable i direkt auf die Range Spalte bezieht in der sich die GV.Nr. befinden.
    und nicht wie üblich von A bis .....
    Normalerweise wäre i, 1 Spalte A. Aber hier ist es jetzt Spalte B weil ich die Range Spalte auf B gesetzt habe.
    Wäre ich nicht drauf gekommen. Hatte bis gestern Abend alles probiert.

    Was mir auch aufgefallen ist. In Tabelle2 darf sich an keiner Stelle eine leere Spalte zwischen Spalte B und der Hilfsspalte für den Farbcode befinden, sonst bleibt das Makro stehen.
    Bilder
    • 2018-07-06 07_57_22-.jpg

      315,03 kB, 1.548×1.153, 157 mal angesehen

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Parawolli“ ()

    Sorry, es ist das Lokalfenster, nicht der Direktbereich und nein, i entspricht der Zeile - nicht der Spalte im Array. Aber schau es Dir im LOKAL-Bereich an, dann sollte es verständlicher sein.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „cry.baby“ ()