Sortierung einer Spalte innerhalb einer Tabelle ohne andere Spalten mit zu sortieren
- Excel
Hier erfahren Sie, wie einfach Sie Ihren Browser aktualisieren können.
Es gibt 76 Antworten in diesem Thema. Der letzte Beitrag () ist von cry.baby.
-
-
Update: Aktualisierter Code siehe unten!
Kopier am besten das ganze Modul nochmal neu rein. Habe es getestet und es sollte funktionieren:
Visual Basic-Quellcode
- Option Explicit
- Sub Einfaerben()
- Const Blau = 15773696 'RGB(0, 176, 240)
- Const Lila = 10498160 'RGB(121, 48, 160)
- Const Gelb = 65535 'RGB(255, 255, 0)
- Const Grün = 5287936 'RGB(0,176,80)
- Const Rot = 255 'RGB(255,0,0)
- Const Orange = 52479 'RGB(255,204,0)
- Dim AnzahlGV0598_blau, AnzahlGV0587_lila, AnzahlGV0588_gelb, AnzahlGV0598_grün, AnzahlGV0587_rot, AnzahlGV0588_orange As Integer
- Dim GezähltGV0598, GezähltGV0587, GezähltGV0588 As Integer
- Dim Finden, RangeFinden, r As Range
- '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
- 'Anschließend die Stückzahl zur jeweiligen GV dynamisch ermitteln
- Set RangeFinden = .Range("D2", .Range("D2").End(xlDown))
- AnzahlGV0598_blau = AnzahlFarben(RangeFinden, Blau)
- AnzahlGV0587_lila = AnzahlFarben(RangeFinden, Lila)
- AnzahlGV0588_gelb = AnzahlFarben(RangeFinden, Gelb)
- AnzahlGV0598_grün = AnzahlFarben(RangeFinden, Grün)
- AnzahlGV0587_rot = AnzahlFarben(RangeFinden, Rot)
- AnzahlGV0588_orange = AnzahlFarben(RangeFinden, Orange)
- End With
- With Sheets("Tabelle1")
- 'Für GV0598_blau
- GezähltGV0598 = 0
- For Each r In Intersect(.UsedRange, .Range("B:B"))
- If r = "GV0598" And GezähltGV0598 < AnzahlGV0598_blau Then
- GezähltGV0598 = GezähltGV0598 + r.Count
- r.Offset(0, -1).Interior.Color = Blau
- End If
- Next r
- 'Für GV0587_lila
- GezähltGV0587 = 0
- For Each r In Intersect(.UsedRange, .Range("B:B"))
- If r = "GV0587" And GezähltGV0587 < AnzahlGV0587_lila Then
- GezähltGV0587 = GezähltGV0587 + r.Count
- r.Offset(0, -1).Interior.Color = Lila
- End If
- Next r
- 'Für GV0588_gelb
- GezähltGV0588 = 0
- For Each r In Intersect(.UsedRange, .Range("B:B"))
- If r = "GV0588" And GezähltGV0588 < AnzahlGV0588_gelb Then
- GezähltGV0588 = GezähltGV0588 + r.Count
- r.Offset(0, -1).Interior.Color = Gelb
- End If
- Next r
- 'Für GV0598_grün
- GezähltGV0598 = 0
- For Each r In Intersect(.UsedRange, .Range("B:B"))
- If r = "GV0598" Then
- GezähltGV0598 = GezähltGV0598 + r.Count
- If r = "GV0598" And GezähltGV0598 > AnzahlGV0598_blau And GezähltGV0598 <= AnzahlGV0598_blau + AnzahlGV0598_grün Then
- r.Offset(0, -1).Interior.Color = Grün
- End If
- End If
- Next r
- 'Für GV0587_rot
- GezähltGV0587 = 0
- For Each r In Intersect(.UsedRange, .Range("B:B"))
- If r = "GV0587" Then
- GezähltGV0587 = GezähltGV0587 + r.Count
- If r = "GV0587" And GezähltGV0587 > AnzahlGV0587_lila And GezähltGV0587 <= AnzahlGV0587_lila + AnzahlGV0587_rot Then
- r.Offset(0, -1).Interior.Color = Rot
- End If
- End If
- Next r
- 'Für GV0588_orange
- GezähltGV0588 = 0
- For Each r In Intersect(.UsedRange, .Range("B:B"))
- If r = "GV0588" Then
- GezähltGV0588 = GezähltGV0588 + r.Count
- If r = "GV0588" And GezähltGV0588 > AnzahlGV0588_gelb And GezähltGV0588 <= AnzahlGV0588_gelb + AnzahlGV0588_orange Then
- r.Offset(0, -1).Interior.Color = Orange
- End If
- End If
- Next r
- End With
- End Sub
- Function AnzahlFarben(ByVal SuchRange As Range, Farbenname As String) As Integer
- Dim Rng As Range
- Set Rng = SuchRange.Find(Farbenname)
- If Not Rng Is Nothing Then AnzahlFarben = Val(Rng.Offset(0, -2).Value)
- End Function
Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „cry.baby“ ()
-
-
Wo weist er den Fehler genau aus? Hier?
Dann probier es mal so:
-
Leider immer noch nicht.
Habe mal meinen Code rein kopiert.
Die rot markierte Zeile ist die wo er den fehler ausgibt.
Die grünen sind die alternativen Zeilen als Textzeile markiert.
Habe immer beides mal ausprobiert. Aber immer der selbe Fehler in der gleichen Zeile.
Visual Basic-Quellcode
- Option Explicit
- Private Sub CommandButton1_Click()
- Const Blau = 15773696 'RGB(0, 176, 240)
- Const Lila = 10498160 'RGB(121, 48, 160)
- Const Gelb = 65535 'RGB(255, 255, 0)
- Const Grün = 5287936 'RGB(0,176,80)
- Const Rot = 255 'RGB(255,0,0)
- Const Orange = 52479 'RGB(255,204,0)
- Dim AnzahlGV0598_blau, AnzahlGV0587_lila, AnzahlGV0588_gelb, AnzahlGV0598_grün, AnzahlGV0587_rot, AnzahlGV0588_orange As Integer
- Dim GezähltGV0598, GezähltGV0587, GezähltGV0588 As Integer
- Dim RangeStckZahl As Range
- Dim r As Range
- Dim Finden As Variant
- Dim RangeFinden As Range
- 'Hilfsspalte D mit Farbnummern erstellen
- 'With Sheets("Tabelle2")
- Sheets("Tabelle2").Activate
- 'For Each r In Intersect(.UsedRange, .Range("B:B"))
- For Each r In Intersect(Tabelle2.UsedRange, Tabelle2.Range("B:B"))
- r.Offset(0, 2) = r.Interior.Color
- Next r
- 'End With
- 'Anschließend die Stückzahl zur jeweiligen GV dynamisch ermitteln
- Sheets("Tabelle2").Activate
- Set RangeFinden = Range("D2", Range("D2").End(xlDown))
- Finden = RangeFinden.Find(Blau).Offset(0, -2) ' <<--- FEHLER HIER
- AnzahlGV0598_blau = Finden
- Finden = RangeFinden.Find(Lila).Offset(0, -2)
- AnzahlGV0587_lila = Finden
- Finden = RangeFinden.Find(Gelb).Offset(0, -2)
- AnzahlGV0588_gelb = Finden
- Finden = RangeFinden.Find(Grün).Offset(0, -2)
- AnzahlGV0598_grün = Finden
- Finden = RangeFinden.Find(Rot).Offset(0, -2)
- AnzahlGV0587_rot = Finden
- Finden = RangeFinden.Find(Orange).Offset(0, -2)
- AnzahlGV0588_orange = Finden
- 'With Sheets("Tabelle1")
- Sheets("Tabelle1").Activate
- 'Für GV0598_blau
- GezähltGV0598 = 0
- 'For Each r In Intersect(.UsedRange, .Range("B:B"))
- For Each r In Intersect(Tabelle1.UsedRange, Tabelle1.Range("B:B"))
- If r = "GV0598" And GezähltGV0598 < AnzahlGV0598_blau Then
- GezähltGV0598 = GezähltGV0598 + r.Count
- r.Offset(0, -1).Interior.Color = Blau
- End If
- Next r
- 'Für GV0587_lila
- GezähltGV0587 = 0
- For Each r In Intersect(Tabelle1.UsedRange, Tabelle1.Range("B:B"))
- If r = "GV0587" And GezähltGV0587 < AnzahlGV0587_lila Then
- GezähltGV0587 = GezähltGV0587 + r.Count
- r.Offset(0, -1).Interior.Color = Lila
- End If
- Next r
- 'Für GV0588_gelb
- GezähltGV0588 = 0
- For Each r In Intersect(Tabelle1.UsedRange, Tabelle1.Range("B:B"))
- If r = "GV0588" And GezähltGV0588 < AnzahlGV0588_gelb Then
- GezähltGV0588 = GezähltGV0588 + r.Count
- r.Offset(0, -1).Interior.Color = Gelb
- End If
- Next r
- 'Für GV0598_grün
- GezähltGV0598 = 0
- For Each r In Intersect(Tabelle1.UsedRange, Tabelle1.Range("B:B"))
- If r = "GV0598" Then
- GezähltGV0598 = GezähltGV0598 + r.Count
- If r = "GV0598" And GezähltGV0598 > AnzahlGV0598_blau And GezähltGV0598 <= AnzahlGV0598_blau + AnzahlGV0598_grün Then
- r.Offset(0, -1).Interior.Color = Grün
- End If
- End If
- Next r
- 'Für GV0587_rot
- GezähltGV0587 = 0
- For Each r In Intersect(Tabelle1.UsedRange, Tabelle1.Range("B:B"))
- If r = "GV0587" Then
- GezähltGV0587 = GezähltGV0587 + r.Count
- If r = "GV0587" And GezähltGV0587 > AnzahlGV0587_lila And GezähltGV0587 <= AnzahlGV0587_lila + AnzahlGV0587_rot Then
- r.Offset(0, -1).Interior.Color = Rot
- End If
- End If
- Next r
- 'Für GV0588_orange
- GezähltGV0588 = 0
- For Each r In Intersect(Tabelle1.UsedRange, Tabelle1.Range("B:B"))
- If r = "GV0588" Then
- GezähltGV0588 = GezähltGV0588 + r.Count
- If r = "GV0588" And GezähltGV0588 > AnzahlGV0588_gelb And GezähltGV0588 <= AnzahlGV0588_gelb + AnzahlGV0588_orange Then
- r.Offset(0, -1).Interior.Color = Orange
- End If
- End If
- Next r
- 'End With
- End Sub
Code-Tags eingefügt. ~Thunderbolt
Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „Thunderbolt“ ()
-
-
Auch nicht!
Funktioniert der Code denn mit meiner Tabelle bei Dir?
Vielleicht liegt es an unterschiedlichen Office Jahrgängen.
Ich benutze Office 365
Ab und zu ändert sich ja auch was an VB.
Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Parawolli“ ()
-
-
Parawolli schrieb:
Finden = RangeFinden.Find(Blau).Offset(0, -2)
Range.Find gibt ein Range-Objekt zurück und muss deshalb entsprechend zugewiesen werden:
Es ist schade, dass VBA keinOption Strict On
kennt.
Du kannst es dir trotzdem weitgehend erleichtern, wenn du nie Variant verwendest, sondern die Variablen mit dem richtigen Datentyp deklarierst.
Dim RangeFinden As Range
Die Tatsache, dass der Code bei erfolgreicher Suche läuft, liegt an der Tatsache, dass bei der Zuweisung
Finden = RangeFinden.Find(Blau).Offset(0, -2)
Nicht das Range-ObjektRangeFinden.Find(Blau).Offset(0, -2)
, sondern dessen Default-PropertyValue
zugewisen wird.
Also streng genommen:Finden = RangeFinden.Find(Blau).Offset(0, -2).Value
Wenn aber haltRangeFinden.Find(Blau)
Nothing ist, crasht das Ganze, weil Nothing nun mal keine Property Offset hat.
Deswegen bei Range.Find immer überprüfen, ob was gefunden wurde.
--
If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
--Dieser Beitrag wurde bereits 4 mal editiert, zuletzt von „petaod“ ()
-
Hallo petaod,
Ich habe mal Deinen Code (Siehe unten) eingegeben.
Die beiden roten Zeilen werden abwechselnd als Fehler ausgegeben.
Wahrscheinlich habe ich aber auch nicht ganz verstanden was ich jetzt machen musste und habe es falsch eingegeben.
Beim ersten mal hat er das FindenBlau als Fehler ausgegeben, weil es wahrscheinlich nicht deklariert war. Nachden ich es als Variable bzw. Range angelegt hatte, hat er mir die Zeile dadrüber als Fehler angegeben.
'Dim FindenBlau As Variant
Dim FindenBlau As Range
Sheets("Tabelle2").Activate
Set Finden = RangeFinden.Find(Blau) 'wenn nichts gefunden wird, wird hier ein Null-Objekt zurückgegeben (Nothing)
If Not Finden Is Nothing Then FindenBlau = Finden.Offset(0, -2).Value
Set RangeFinden = Range("D2", Range("D2").End(xlDown))
Finden = RangeFinden.Find(Blau).Offset(0, -2).Value
AnzahlGV0598_blau = Finden
*Rot in blau geändert, siehe Regeln bzgl. Moderatorenfarbe*
Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „Marcus Gräfe“ ()
-
Du musst sowohl 'Finden' als auch 'RangeFinden' als Range deklarieren. Da 'Finden' jetzt kein Variant mehr ist, sondern eine Range und somit eine Objekt_Variable, musst Du Finden ein 'Set' vorsetzen. Zudem muss 'RangeFinden' vor der Methode .Find bestimmt werden. In Code sieht das dann so aus:
Visual Basic-Quellcode
@Petaod: Danke für die Lehreinheit! Hab wieder was dazugelernt!
-
cry.baby schrieb:
Set Finden = RangeFinden.Find(Blau).Offset(0, -2)
Dann istRangeFinden.Find(Blau)
=Nothing
.
UndNothing.Offset(0, -2)
gibt es nicht.
Deshalb erst suchen und, nur wenn gefunden, die nachfolgenden Schritte durchführen.
Deshalb--
If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
-- -
Dann würde ich ein 'On Error Resume Next' und 'On Error Goto 0' einbauen. Müsste in dem Fall ausreichen, oder? Bzw. gleich richtig:
Vollzitat entfernt. ~Thunderbolt
Dieser Beitrag wurde bereits 4 mal editiert, zuletzt von „Thunderbolt“ ()
-
cry.baby schrieb:
Dann würde ich ein 'On Error Resume Next' und 'On Error Goto 0' einbauen
Im übrigen würde ich so etwas nur in einer überschaubaren Funktion durchführen.
On Error Goto 0 hebt alle EventHandler auf, die sich ggf. noch in der Routine befinden.
Wenn dann so:
Und im Code dann einfach für jede Farbe entsprechend.
Ich würde dennoch für die Funktion die saubere Variante wählen
Ist nicht länger, aber erfordert keine unnötige zeitintensive Fehlerbehandlung.--
If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
-- -
Hi Wolfgang,
ich habe den Code weiter oben (zweites Posting) entsprechend den Hinweisen von petaod aktualisiert. Du kannst ihn kopieren/einfügen, dann sollte es jetzt gehen.
Die Funktion von petaod habe ich auch nocheingebaut (nur mit deutschen Namen um der Linie treu zu bleiben) -> wenn Du neben den angegeben Farben weitere einfügen möchtest ist die Anpassung einfacher und macht den Code auch schlanker!
Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „cry.baby“ ()
-
Hi cry.baby & petaod
Vielen Dank, das Ihr beide Euch Zeit für mich genommen habt. Es funktioniert jetzt.
Ich hatte allerdings etwas vergessen zu erwähnen.
In der originalen Tabelle1 sind in Spalte C mal SN: Nr. vorhanden und mal keine vorhanden. (Siehe Anhang)
Ich möchte das er in Spalte A nur die farblich markiert, wo keine SN: Nr. in Spalte C neben der entsprechenden GV steht. Wenn eine SN: Nr. drin steht, soll er die Zelle unberührt lassen (farblos) und einfach mit dem Zählen zur nächsten GV springen und in der entsprechenden Farbe markieren.
Denn überall wo eine SN: Nr. vorhanden ist soll in Spalte A grau markiert werden. Alles andere in den Farben zur Tabelle2.
Das grau markieren habe ich bereits mit einer einfachen IF Abfrage hin bekommen. Allerdings schaffe ich es nicht zu programmieren, das er immer einen Schritt weiter mit den Farben springen soll.
Habe folgendes für die GV0598 und fabe blau ausprobiert.
Also eigentlich nur z als Range deklariert
Die rote Zeile hinzugefügt und in der IF Bedingung den roten Teil als weitere Bedingung hinzugefügt.
Funktioniert aber nicht so leicht wie ich dachte.
Visual Basic-Quellcode
- With Sheets("Tabelle1")
- GezähltGV0598 = 0
- Dim z As Range
- For Each r In Intersect(Tabelle1.UsedRange, Tabelle1.Range("B:B"))
- For Each z In Intersect(Tabelle1.UsedRange, Tabelle1.Range("C:C")) ' <<---
- ' vvvvvvvvvv
- If r = "GV0598" And z = "" And GezähltGV0598 < AnzahlGV0598_blau Then
- GezähltGV0598 = GezähltGV0598 + r.Count
- r.Offset(0, -1).Interior.Color = Blau
- End If
- Next z
- Next r
- End With
- End Sub
Code-Tags eingefügt. Die Farbe "Rot" ist der Moderation vorbehalten. ~ThunderboltDieser Beitrag wurde bereits 3 mal editiert, zuletzt von „Thunderbolt“ ()
-
-
Hammer
Vollzitat entfernt. ~Thunderbolt
Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Thunderbolt“ ()
-
Hast Du vllt noch was vergessen uns zu sagen? Hm? Also irgend ne Spalte nicht erwähnt oder so?
Vollzitat entfernt. ~Thunderbolt
Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Thunderbolt“ ()
-
cry.baby schrieb:
Hast Du vllt noch was vergessen uns zu sagen? Hm? Also irgend ne Spalte nicht erwähnt oder so? <img src="https://www.vb-paradise.de/wcf/images/smilies/biggrin.png" alt=":D" />
<span style="color: #FF0000"><b>Vollzitat entfernt.</b> ~Thunderbolt</span>
Glaube nicht oder lass mal überlegen
Habe das fast fertige Programm mal als Text-Datei angehangen. Funktioniert super.
Ist aber etwas lang geworden mit 2752 Zeilen....
Habe auch direkt die Farben die verwendet werden dürfen fest vorgegeben, damit nicht ausversehen eine fremde Farbe genommen werden kann, die dann nicht erkannt wird.
Habe noch nicht alle GV Nr. integriert. Denke werden am Ende ca. 3000 Zeilen sein.
Ohne Deinen Code hätte ich das aber nicht geschafft.
Habe aber trotzdem sehr viel dabei gelernt.
Ich muss noch irgendwie versuchen, das die Farbwahl individuell sein darf und nicht fest vorgegeben ist.
Ab und zu kann es vorkammen das ich pro GV Nr. 3 Farben vergeben muss, weil ich 3 Aufträge glaichzeitig geplant habe. Werde mal versuchen Deinen Code daraufhin zu erweitern.
Lg Wolfgang
Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Parawolli“ ()
-
Ähnliche Themen
-
Sortieren einer JoiningView in einer DatagridView
michivandersar - - Daten(bank)programmierung