Das Clever-Excel-Forum.de - Treffen
findet vom 15. - 17. September 2017 in Thüringen / Region Großer Inselsberg statt. Hotelbuchung ab sofort möglich.


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?
Gruß Achim
Jeder Mensch macht Fehler. Die Kunst liegt darin, sie zu machen, wenn keiner zuschaut.
to 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
to 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-2016)
to 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.
Gruß Achim
Jeder Mensch macht Fehler. Die Kunst liegt darin, sie zu machen, wenn keiner zuschaut.
to 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 7 / Office 2007
to 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-2016)
to 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-2016)
to 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.
Gruß Achim
Jeder Mensch macht Fehler. Die Kunst liegt darin, sie zu machen, wenn keiner zuschaut.
to top
#9
Hi Achim,

(15.08.2014, 13: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.
Gruß Ralf

?mage

Die deutsche Rechtschreibung ist Freeware, d.h. du kannst sie kostenlos nutzen.
Allerdings ist sie nicht Open Source, deswegen darfst du sie nicht verändern oder in veränderter Form veröffentlichen.
to 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: 9)
Gruß Atilla

Excel 2007
[-] Folgende(r) 1 Benutzer sagt Danke an atilla für diesen Beitrag:
Steffl
to top


Möglicherweise verwandte Themen...
Thema Verfasser Antworten Ansichten Letzter Beitrag
  Sortierung von einer Analyse JimmyJoe 11 91 Vor 4 Stunden
Letzter Beitrag: JimmyJoe
Rainbow Automatisch alle Namen der Tabellenblätter in einer DropDown-Liste supajanni 1 43 24.11.2016, 13:52
Letzter Beitrag: chris-ka
  Automatische Sortierung zweier Werte Firason 5 97 16.11.2016, 17:54
Letzter Beitrag: shift-del
  Hilfe bei Sortierung Gabifat 14 146 27.10.2016, 11:43
Letzter Beitrag: Gabifat
  Sortierung der Spalten in Zeilen mabis 1 61 17.10.2016, 11:54
Letzter Beitrag: Peter
  Sortierung mehrerer Zeilen nach Größe einer bestimmten Zelle Godman2 8 205 05.10.2016, 18:30
Letzter Beitrag: schauan
  Erstellen einer dyn. Liste aus mehreren Tabellenblättern Tim1711 3 200 22.08.2016, 14:28
Letzter Beitrag: Tim1711
  Zellenformatierung als Scanbereich mit anschließender Sortierung rincewind 10 345 22.08.2016, 10:59
Letzter Beitrag: rincewind
  Lösung zu: Automatische sortierung der Tische Gast 123 2 208 17.08.2016, 15:32
Letzter Beitrag: Gast 123
  Automatische sortierung der Tische Rabe79 127 5.121 16.08.2016, 05:45
Letzter Beitrag: Rabe79

Gehe zu:


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