Frage zur Sortierung einer Liste
#1
Code:
Private Sub OptionButton302_Click() 'Sortieren nach NL 1
  Richtung = 1
  Sort_A = "D4"
  Sort_B = "A4"
  Sort_C = "W4"
  Call Sortieren
With Worksheets("Auswahl")
    ListBox1.RowSource = "Auswahl!" & .Range(.Cells(4, 1), .Cells(n + 3, 125)).Address
End With
Code:
Sub Sortieren()
    With Worksheets("Auswahl").Range("A4:DS10000")
        .Sort Key1:=.Range(Sort_A), Order1:=Richtung, Key2:=.Range(Sort_B) _
        , Order2:=xlAscending, Key3:=.Range(Sort_C), Order3:=xlAscending, Header:= _
        xlNo, OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom, _
        DataOption1:=xlSortTextAsNumbers, DataOption2:=xlSortNormal, DataOption3 _
        :=xlSortNormal
    End With
End Sub
Diese Univeral-Sortierung wird von vielen anderen Subs angesprungen und funktioniert einwandfrei.
Die Variable "RICHTUNG" ist in den meisten Fällen =1, manchmal aber auch =2

Jetzt möchte ich bei nochmaligem Klick auf den gleichen OptionButton die Sortierrichtung umdrehen.
Also mit jedem Klick AUF und AB Sortieren.
Aber mit IF Richtung=1 THEN Richtung =2 geht das nicht.

Ich habe mal vor langer Zeit was gesehen mit einer Variablen vom Typ BOOLEAN, die man da in die Sortierung mit einbaut.
Aber ich weiß leider nicht wie und wo genau.

Kann mir da jemand helfen?
Top
#2
Hallo Achim,

die einfachste Formel wäre

Richtung = Abs(Richtung -3)

Nur ist ein OptionButton ein OptionButton, der eben nur eine Option zulässt/einstellt!!

Gruß Uwe
Top
#3
Hallo Achim,

ein Optionbutton ändert nicht nur in Excel seinen Inhalt nur einmal, egal wie oft Du auf ihn klickst - wenn Du nicht zwischendurch auf einen anderen der gleichen Gruppe klickst. Entweder hast Du für Deinen Zweck zwei, oder Du nimmst eine Checkbox.

Die Sache mit dem boolean ist schon ein richtiger Ansatz - allerdings solltest du besser den Zustand des Optionbuttons (oder der empfohlenen Checkbox) auswerten. So etwa in der Art:
Code:
If OptionButton302 Then Richtung = 1 else Richtung = 2

Übrigens würde ich auch empfehlen, dass Du Deinen Steuerelementen aussagekräftige Namen gibst. Ich weiß nicht, ob Du wirklich 302 hast, wenn ja, dann sage mir doch aus dem Kopf mal, was die 166 macht ? Huh

Wenn Du den obt_Sort nennst, dann sieht das schon besser aus. Wenn es mehrere zum Sortieren gibt, kann man ja noch was kennzeichnendes dazu schreiben. Auch wenn Du in der Liste der Objekte und Makros suchst, dann wird es einfacher, das richtige zu finden.
.      \\\|///      Hoffe, geholfen zu haben.
       ( ô ô )      Grüße, André aus G in T  
  ooO-(_)-Ooo    (Excel 97-2019+365)
Top
#4
Mein Ziel ist es mit jedem Klick auf den OptionButton innerhalb des Klick_Ereigniss den Zustand einer Variablen zu drehen
und als Parameter in die Sortierroutine zu übergeben.
Na gut, muss ich mir was anderes überlegen.

Erst mal Danke für die Hinweise dazu.
Top
#5
Hallo Achim,

vielleicht wäre ein ToggleButton eine Alternative. Je nachdem ob der ToggleButton gedrückt (vertieft) oder nicht kannst Du den Wert ändern.

Code:
Private Sub ToggleButton1_Click() 'Sortieren nach NL 1
  Richtung = ToggleButton1.Value + 2
  'Richtung = Abs(ToggleButton1.Value) + 1'oder so
  Sort_A = "D4"
  Sort_B = "A4"
  Sort_C = "W4"
  Call Sortieren
With Worksheets("Auswahl")
    ListBox1.RowSource = "Auswahl!" & .Range(.Cells(4, 1), .Cells(n + 3, 125)).Address
End With
Gruß Stefan
Win 10 / Office 2016
Top
#6
Hallo Achim,

ich nochmal. Hast Du meine Antwort richtig gelesen? Auf dem Option-Button kann Man auf und nieder springen, nach dem ersten Klick tut sich nix mehr. Da geht höchstens der Bildschirm von kaputt. :15:
Da wird das Clickereignis nicht nochmal ausgelöst, es sei denn, siehe oben - du klickst erst auf einen anderen der Gruppe.

Nur eine Checkbox ändert mit jedem Klick ihren Wert. Nimm also so eine und packe das mit meinem codevorschlag - natürlich dann mit checkbox... und nicht optionbutton302 - in das Click-Makro der Checkbox.
.      \\\|///      Hoffe, geholfen zu haben.
       ( ô ô )      Grüße, André aus G in T  
  ooO-(_)-Ooo    (Excel 97-2019+365)
Top
#7
Hallo Achim,

ich noch mal. Falls Du die Sortierung nur über einen Schalter regelst, egal ob Togglebutton, Obtionbutton oder Checkbox, müsstest Du auch die Aufschrift ändern - sonst weiß der user gar nicht auf Anhieb, in welcher Richtung sortiert wird.

Falls Du doch zwei Optionbuttons für die Sortierung hast, dann ist es einfach und Du gibst jedem die entsprechende Richtung mit.
.      \\\|///      Hoffe, geholfen zu haben.
       ( ô ô )      Grüße, André aus G in T  
  ooO-(_)-Ooo    (Excel 97-2019+365)
Top
#8
Ich muss mein Vorhaben mal etwas genauer beschreiben.
OB = OptionButton
CB = Checkbox
TB = Togglebutton

Leider ist es in der Listbox nicht möglich auf die Überschrift zu klicken und mit jedem Klick ein Auf- und Abwärtssortieren.

Also habe ich mir 6 OB in einen Frame zusammengestellt.
Die Sortierung nach der jeweiligen Vorgabe funktioniert einwandfrei; aber immer nur Aufwärts sortiert.
Es ist - logischerweise - immer nur ein OB aktiv.

Nehme ich jetzt eine CB, habe ich das Problem, dass die CB im Gegensatz zum OB eine UND Sache ist. Ich kann ja mehre CB anwählen, ohne das eine andere CB deaktiviert wird. Keine gute Lösung.

Nehme ich einen TB, wäre das schon etwas besser. Ich klicke auf TB1 und lasse dabei automatisch die anderen 5 TB wieder auf FALSE stellen. Irgendwie auch nicht das wahre.

Kommen wir zurück auf meinen OB. Ich klicke den OB und löse dabei das Ereignis Sortieren aus.
Dabei mache ich noch OB1.caption = "Aufwärts"
Am Ende des Codes setze ich noch den Focus z.B. auf die Listbox, um den Focus vom OB zu nehmen.

Jetzt muss es doch möglich sein beim nächsten Klick auf den OB das Ereignis wieder aufzurufen, aber dieses Mal mit Sortierung Abwärts und als OB.caption = "Abwärts" zu erhalten.
Ich muss nach dem Klick auf den OB die Liste sortieren und dabei gleich noch am Ende nach der Sortierung einen Wechsel von Aufwärts oder Abwärts erzeugen, so dass der nächste Klick auf en OB das durchführt....Und das geht meines Erachtens irgendwie mt einer Variable vom Typ Boolean.

Ich hoffe, dass mein Anliegen jetzt verständlicher beschrieben habe.
Top
#9
Hi Achim,

(15.08.2014, 14:47)maine-coon schrieb: Nehme ich jetzt eine CB, habe ich das Problem, dass die CB im Gegensatz zum OB eine UND Sache ist. Ich kann ja mehre CB anwählen, ohne das eine andere CB deaktiviert wird. Keine gute Lösung.

Nehme ich einen TB, wäre das schon etwas besser. Ich klicke auf TB1 und lasse dabei automatisch die anderen 5 TB wieder auf FALSE stellen. Irgendwie auch nicht das wahre.

Jetzt muss es doch möglich sein beim nächsten Klick auf den OB das Ereignis wieder aufzurufen, aber dieses Mal mit Sortierung Abwärts und als OB.caption = "Abwärts" zu erhalten.

zum Ersten:
ich habe hier irgendwo etwas angefragt mit drei CB pro Zeile in vielen Zeilen untereinander, bei der immer nur die CB in einer Zeile miteinander verknüpft/gruppiert sind. Such mal, wie das per VBA gelöst ist. Wenn Du die CB also "ODER" verknüpft haben willst, dann mußt Du sie nur gruppieren.

zum Zweiten: warum sollten beim Klick auf TB1 die anderen 5 TB automatisch auf FALSE gestellt werden, wenn Du das nicht explizit so programmierst? Du kannst doch jeden TB unabhängig vom anderen auf TRUE oder FALSE stellen.

Code:
Option Explicit

Private Sub ToggleButton1_Click()
   If Me.ToggleButton1.Value = False Then
      'Dein Sortier-Code 1 ' Aufwärts
      Me.ToggleButton1.Caption =  "Abwärts Sortieren"
   Else
      'Dein Sortier-Code 2 ' Abwärts
      Me.ToggleButton1.Caption = "Aufwärts Sortieren"
   End If
End Sub

Code:
Private Sub ToggleButton1_Click()
   If ToggleButton1 Then
      'Dein Sortier-Code 1 ' Aufwärts
      ToggleButton1.Caption =  "Abwärts Sortieren"
   Else
      'Dein Sortier-Code 2 ' Abwärts
      ToggleButton1.Caption =  "Aufwärts Sortieren"
   End If
End Sub

Code:
Option Explicit

Private Sub ToggleButton1_Click()
   Dim Sort_A As String
   Dim Sort_B As String
   Dim Sort_C As String
  
   Sort_A = "D4"
   Sort_B = "A4"
   Sort_C = "W4"
  
   If ToggleButton1 Then
      With Worksheets("Auswahl").Range("A4:DS10000")
         .Sort Key1:=Range(Sort_A), Order1:=xlAscending, _
             Key2:=.Range(Sort_B), Order2:=xlAscending, _
             Key3:=.Range(Sort_C), Order3:=xlAscending, _
             Header:=xlNo, OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom, _
             DataOption1:=xlSortTextAsNumbers, DataOption2:=xlSortNormal, _
             DataOption3:=xlSortNormal
      End With
      ToggleButton1.Caption = "Abwärts Sortieren"
   Else
      With Worksheets("Auswahl").Range("A4:DS10000")
         .Sort Key1:=Range(Sort_A), Order1:=xlDescending, _
             Key2:=.Range(Sort_B), Order2:=xlAscending, _
             Key3:=.Range(Sort_C), Order3:=xlAscending, _
             Header:=xlNo, OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom, _
             DataOption1:=xlSortTextAsNumbers, DataOption2:=xlSortNormal, _
             DataOption3:=xlSortNormal
      End With
      ToggleButton1.Caption = "Aufwärts Sortieren"
   End If
   With Worksheets("Auswahl")
      ListBox1.RowSource = "Auswahl!" & .Range(.Cells(4, 1), .Cells(n + 3, 125)).Address
   End With
End Sub


.xlsb   ToggleButton.xlsb (Größe: 22,55 KB / Downloads: 4)

ich glaube, so kannst Du noch den verschiedenen TB unterschiedliche Werte zuweisen:
Code:
Private Sub ToggleButton6_Click()
    ToggleButton1 = TRUE
    ToggleButton2 = FALSE
    ToggleButton3 = Not ToggleButton6
    ToggleButton4 = Not ToggleButton6
    ToggleButton5 = Not ToggleButton6
End Sub

Du kannst diese Zeilen bei Bedarf auch in die einzelnen TBs reinsetzen, dann passiert das, was Du oben als "nicht das wahre" beschrieben hast.

zum Dritten: evtl. könntest Du über eine zusätzliche Variable ("Auf" - "Ab"), die beim Klicken auf den OB abgefragt wird, die Richtung auslesen und dann in einer IF-Else-Entscheidung entweder aufwärts oder abwärts sortieren und dann die Variable für den nächsten Klick entsprechend setzen.

Und das ist genau das, was der TB auto-"magisch" macht, ohne es extra zu programmieren.
Top
#10
Hallo Achim,

Zitat:Leider ist es in der Listbox nicht möglich auf die Überschrift zu klicken und mit jedem Klick ein Auf- und Abwärtssortieren.

es ist relativ einfach, im Anhang ein simples Beispiel, wie das geht.


Angehängte Dateien
.xls   Lisbox sortieren bei Click in Überschrift.xls (Größe: 57,5 KB / Downloads: 12)
Gruß Atilla
[-] Folgende(r) 1 Nutzer sagt Danke an atilla für diesen Beitrag:
  • Steffl
Top


Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste