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.

    Krass langer Code. 8| Wie lange läuft das Makro würde mich mal interessieren? Gib mal zu Beginn Debug.Print "Start: " & now und ganz zum Schluss Debug.Print "Ende: " & now ein. Im Direktbereich siehst Du dann die Laufzeit.

    Mir ist gerade etwas aufgefallen. Die Variablen für "GezähltGV0xxx" musst Du nicht explizit für jede GV deklarieren. Es muss ausreichen, wenn Du einfach nur Dim Gezählt as Integer deklarierst und das für jede Schleife einsetzt, da die Variable jedesmal ohenhin auf 0 zurückgesetzt wird.

    Für einen dritten Auftrag müsstest Du eine dritte Schleife einrichten:

    Visual Basic-Quellcode

    1. Gezählt = 0
    2. For Each r In Intersect(.UsedRange, .Range("B:B"))
    3. If r = "GV0588" Then
    4. Gezählt = Gezählt + r.Count
    5. If r = "GV0588" And Gezählt > AnzahlGV0588_gelb1 + AnzahlGV0588_gelb2 And Gezählt <= AnzahlGV0588_gelb1 + AnzahlGV0588_gelb2 + AnzahlGV0588_gelb3 Then
    6. r.Offset(0, -1).Interior.Color = Gelb
    7. End If
    8. End If
    9. Next r

    Schicke ich Dir sobald ich fertig bin.
    Habe nämlich unsere kompl. Entwicklungsgeräte noch nicht berücksichtigt.
    Danke für den Tipp.

    P.S. Was ich mich die ganze Zeit schon gefragt hatte, warum muss man ab dem 2. Auftrag immer auch die erste Schleife nochmal einbauen. Die wird doch für den 1. Auftrag schon durchlaufen. und in der 2. Schleife steht doch in der Formel drin was er machen soll...
    Ich habe das zwar ausprobiert und am Ergebnis gesehen, das es so sein muss, aber verstehen tue ich es nicht.
    Wolfgang

    Parawolli schrieb:


    P.S. Was ich mich die ganze Zeit schon gefragt hatte, warum muss man ab dem 2. Auftrag immer auch die erste Schleife nochmal einbauen. Die wird doch für den 1. Auftrag schon durchlaufen. und in der 2. Schleife steht doch in der Formel drin was er machen soll...
    Ich habe das zwar ausprobiert und am Ergebnis gesehen, das es so sein muss, aber verstehen tue ich es nicht.
    Wolfgang


    Da Du z.B. für GV0588 zwei unterschiedliche Farben hast, muss er in der zweiten Schleife die Anzahl Farben der ersten Schleife übergehen, sonst würden die neu eingefärbt. Wenn Du z.B. Anzahl Farben 2/2 hast, dann färbt er mit der zweiten Schleife alles zwischen >2 und <=4 in der neuen Farbe ein.
    Hi cry.baby
    Jetzt habe ich das kompl. Programm fertig und er meldet mir Prozedur zu groß.
    OK Hilfe nachgesehen und gelesen das das Programm max. 64 kB groß sein darf.
    Habe daraufhin das Programm in 3 Module aufgeteilt und mit Call jeweils aufgerufen.
    Jetzt funzt es.

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

    Parawolli schrieb:

    er meldet mir Prozedur zu groß
    Das kannte ich bisher auch noch nicht.
    Aber das liegt wohl daran, dass ich keinen Spaghetti-Code produziere, sondern eher objektorientiert denke und arbeite.
    64k Code in einer einzigen Prozedur ist ja auch nicht mehr wartbar.

    Wie sagt ErfinderDesRades gerne:
    Wenn eine Prozedur / Funktion / Property nicht auf einen Bildschirm passt, ist am Design was faul.
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --
    :D Petaod, Du erinnerst mich irgendwie an Sheldon von Big Bang Theory. :P Wie immer bin ich offen für Anregungen und Verbesserungsvorschläge. Eigentlich ist der Code nur so lange, weil man für jede GV# eine Schleife einrichten muss, die jeweils noch mit zwei unterschiedlichen Farben markiert werden muss.

    Man könnte beide Schleifen zusammenfassen aber das fände ich zu unübersichtlich.

    Ich freue mich auf Deine Optimierungsvorschläge. Ist ernst gemeint!
    [Krass langer Code. Wie lange läuft das Makro würde mich mal interessieren? Gib mal zu Beginn Debug.Print "Start: " & now und ganz zum Schluss Debug.Print "Ende: " & now ein. Im Direktbereich siehst Du dann die Laufzeit.

    Habe es eingegeben, aber wo kann ich jetzt genau die Zeit ablesen?

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

    @Petaod: Ich suche ja immer noch nach einer Lösung um die Farben frei wählbar zu machen, damit diese nicht zwingend vorgegeben werden müssen.
    Das Problem ist nämlich, das wir ständig neue GV Nr. hinzu kommen und alte wegfallen. Dadurch muss man auch ständig den Code aktuell halten, was ich eigentlich vermeiden will. Ich denke, das sich dadurch der Code auch immens verkürzen würde. Aber so funktioniert es aber auch.
    Dateien
    • Planungsliste.txt

      (145,92 kB, 123 mal heruntergeladen, zuletzt: )

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

    Hi Wolfgang,

    auf die Gefahr hin, dass Du mich erschlagen wirst: Versuch mal nachfolgenden Code (direkt in das Arbeitsblatt eingeben, also z.B. Tabelle2). Das ist jetzt 100% dynamisch mit freier Farbauswahl.

    PS: Die Hilfsspalte D mit den Farbcodes muss vorher noch erstellt werden.

    Visual Basic-Quellcode

    1. Dim ArrayGV()
    2. Dim r As Range
    3. Dim Zähler As Integer
    4. Dim i As Integer
    5. ArrayGV = Range("A2", Range("A2").End(xlToRight).End(xlDown))
    6. With Sheets("Tabelle1")
    7. For i = LBound(ArrayGV, 1) To UBound(ArrayGV, 1)
    8. Zähler = 0
    9. For Each r In Intersect(.UsedRange, .Range("B:B"))
    10. If r = ArrayGV(i, 1) And Zähler < ArrayGV(i, 2) And r.Interior.Color = 16777215 Then
    11. r.Interior.Color = ArrayGV(i, 4)
    12. Zähler = Zähler + 1
    13. End If
    14. Next r
    15. Next i
    16. End With
    17. End Sub

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

    Habe Deinen Code mal in "Tabelle1" eingefügt.
    Der folgende Code läuft durch und die Hildsspalte D wird auch mit dem Farbcode gefüllt. Allerdings markiert er mir nichts in Tabelle1.
    Habe ich etwas nicht richtig verstanden?

    Private Sub CommandButton2_Click()

    Dim ArrayGV()
    Dim r As Range
    Dim Zähler As Integer
    Dim i As Integer

    'Hilfsspalte D mit Farbnummern erstellen

    Sheets("Tabelle2").Select

    With Sheets("Tabelle2")

    For Each r In Intersect(.UsedRange, .Range("B:B"))
    r.Offset(0, 2) = r.Interior.Color
    Next r

    End With

    ArrayGV = Range("A2", Range("A2").End(xlToRight).End(xlDown))

    Sheets("Tabelle1").Select
    With Sheets("Tabelle1")

    For i = LBound(ArrayGV, 1) To UBound(ArrayGV, 1)
    Zähler = 0
    For Each r In Intersect(.UsedRange, .Range("B:B"))

    'Für blau (15773696)
    If r = ArrayGV(i, 1) And Zähler < ArrayGV(i, 2) And r.Interior.Color = 15773696 Then
    r.Interior.Color = ArrayGV(i, 4)
    Zähler = Zähler + 1
    End If

    Next r
    Next i

    End With

    End Sub
    Du darfst Die Farbnummer in der If-Schleife nicht ändern. Füge am besten eine Konstante ein:

    Visual Basic-Quellcode

    1. Const CellBlank = 16777215


    und

    Visual Basic-Quellcode

    1. For i = LBound(ArrayGV, 1) To UBound(ArrayGV, 1)
    2. Zähler = 0
    3. For Each r In Intersect(.UsedRange, .Range("B:B"))
    4. If r = ArrayGV(i, 1) And Zähler < ArrayGV(i, 2) And r.Interior.Color = CellBlank Then
    5. r.Interior.Color = ArrayGV(i, 4)
    6. Zähler = Zähler + 1
    7. End If
    8. Next r
    9. Next i


    Das Makro sollte jetzt 100% dynamisch laufen, d.h. Du kannst die Farbe frei wählen und musst nichts mehr im Code anpassen.

    PS: Du musst nicht jedes Mal das Sheet selektieren und anschließend mit With Sheets/ End with arbeiten. Das ist doppelt gemoppelt. Am besten mit With Sheets/ End with arbeiten. Und achte drauf, dass ArrayGV = Range("A2", Range("A2").End(xlToRight).End(xlDown)) in der With-Anweisung ist. In Deinem Code oben ist es noch außerhalb.

    Zur Erläuterung: CellBlank ist in der If-Abfrage, damit er nur Zellen einfärbt, die noch keine Einfärbung haben. So spart man sich die zweite Schleife. War n Geistesblitz den ich hatte. :D

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

    Die rot markierte Zeile wird als Fehler gelb markiert ausgegeben. "Index außerhalb des gültigen Bereichs."
    Muss die Variable ArrayGV() ganz oben nicht als etwas deklariert werden?
    P.S. Wie kann ich eigentlich das Programm so einfügen wie Du. Also mit Zeilen Nr.

    Private Sub CommandButton2_Click()

    Dim ArrayGV()
    Dim r As Range
    Dim Zähler As Integer
    Dim i As Integer
    Const CellBlank = 16777215

    'Hilfsspalte D mit Farbnummern erstellen


    With Sheets("Tabelle2")

    For Each r In Intersect(.UsedRange, .Range("B:B"))
    r.Offset(0, 2) = r.Interior.Color
    Next r

    End With

    With Sheets("Tabelle1")

    ArrayGV = Range("A2", Range("A2").End(xlToRight).End(xlDown))

    For i = LBound(ArrayGV, 1) To UBound(ArrayGV, 1)
    Zähler = 0
    For Each r In Intersect(.UsedRange, .Range("B:B"))

    If r = ArrayGV(i, 1) And Zähler < ArrayGV(i, 2) And r.Interior.Color = CellBlank Then
    r.Interior.Color = ArrayGV(i, 4)
    Zähler = Zähler + 1
    End If
    Next r
    Next i

    End With

    End Sub
    Du musst ArrayGV = Range("A2", Range("A2").End(xlToRight).End(xlDown)) in die With Sheets("Tabelle2")-Anweisung reinnehmen, nicht für Tabelle1. Um den Code als ansehnliche Syntax darzustellen, einfach während der Texteingabe auf VB 6.0 im Header klicken und anschließend einfügen.

    Dim ArrayGV() as Long ist auch möglich.
    Es funktioniert nur wenn ich den Schalter in Tabelle2 habe.
    Wenn ich es von Tabelle1 aus starten möchte so wie unten, dann markiert er mir nach wie vor die gleiche Zeile.

    Visual Basic-Quellcode

    1. Private Sub CommandButton2_Click()
    2. Dim ArrayGV()
    3. Dim r As Range
    4. Dim Zähler As Integer
    5. Dim i As Integer
    6. Const CellBlank = 16777215 '(ohne Farbe)
    7. With Sheets("Tabelle2")
    8. ArrayGV = Range("A2", Range("A2").End(xlToRight).End(xlDown))
    9. End With
    10. With Sheets("Tabelle1")
    11. For i = LBound(ArrayGV, 1) To UBound(ArrayGV, 1)
    12. Zähler = 0
    13. For Each r In Intersect(.UsedRange, .Range("B:B"))
    14. If r = ArrayGV(i, 1) And Zähler < ArrayGV(i, 2) And r.Interior.Color = CellBlank Then
    15. r.Interior.Color = ArrayGV(i, 4)
    16. Zähler = Zähler + 1
    17. End If
    18. Next r
    19. Next i
    20. End With
    21. End Sub


    Du hast jetzt vergessen die Hilfsspalte einzurichten:

    Visual Basic-Quellcode

    1. With Sheets("Tabelle2")
    2. 'Hilfsspalte D mit Farbnummern erstellen
    3. For Each r In Intersect(.UsedRange, .Range("B:B"))
    4. r.Offset(0, 2) = r.Interior.Color
    5. Next r
    6. 'Array für GV#, Stückzahl und Farbcode
    7. ArrayGV = Range("A2", Range("A2").End(xlToRight).End(xlDown))
    8. End With


    Tatsächlich funktioniert es nicht aus der Tabelle1 heraus, wenn Du ein CommandButton verwendest. Woran das liegt, ist ne gute Frage. Verweise noch zusätzlich auf die Tabelle2 ohne die With/End With-Anweisung wie folgt, dann geht es auch aus Tabelle1 heraus.

    Visual Basic-Quellcode

    1. 'With Sheets("Tabelle2")
    2. 'Hilfsspalte D mit Farbnummern erstellen
    3. For Each r In Intersect(Tabelle2.UsedRange, Tabelle2.Range("B:B"))
    4. r.Offset(0, 2) = r.Interior.Color
    5. Next r
    6. 'Array für GV#, Stückzahl und Farbcode
    7. ArrayGV = Tabelle2.Range("A2", Tabelle2.Range("A2").End(xlToRight).End(xlDown))
    8. 'End With

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

    Super jetzt läuft es.
    P.S. Die Hilfssapalte hatte ich extra entfernt.

    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


    Das gleiche macht es auch wenn ich CellBlank weglasse.

    Visual Basic-Quellcode

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

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

    Hallo...
    Du hast mir doch geholfen und keinen Aufwand gemacht. Ich bin doch derjenige der sich bei Dir für den Aufwand entschuldigen muss.
    Aber schon krass wie man mit einer kleinen Änderung so viele Zeilen sparen kann.
    Ich hatte übrigens eine Antwort drüber noch mal eine Frage ergänzt, weil mir nicht klar ist warum ich nicht genauso die Spalte A statt Spalte B einfärben kann.