Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1616to1620
Aktuelles Verzeichnis
Verzeichnis Index
Übersicht Verzeichnisse
Vorheriger Thread
Rückwärts Blättern
Nächster Thread
Vorwärts blättern
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

Absteigend Sortieren fnktioniert nicht.

Absteigend Sortieren fnktioniert nicht.
12.04.2018 13:42:44
blangmantl
Hallo,
ich hatte bereits u diesem Thema einen Post hier
https://www.herber.de/cgi-bin/callthread.pl?index=1616030
ich habe dort folgenden Code erhalten.

Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
Dim lngZeile As Long, lngSpalte As Long
Dim lngColumn As Long, blnOrder As Boolean
Cancel = True
If Target.Value = "" Then Exit Sub
If Target.Row = 2 Then  'Doppelklick in Zeile 2
lngZeile = Range("A" & Rows.Count).End(xlUp).Row  'letzte befüllte Zeile in Spalte A
lngSpalte = Cells(2, Columns.Count).End(xlToLeft).Column 'letzte befüllte Spalte in zeile  _
2
If Target.Column = lngColumn Then
blnOrder = IIf(blnOrder = 0, -1, 0)
Else
lngColumn = Target.Column
blnOrder = -1
End If
'Bei Sortierung nach Namen wird der Vorname als 2. Sortierschlüssel aufgenommen,
'Bedingungen: 1. Spalte "Vorname" muss direkt rechts neben Spalte "Name" liegen,
If blnOrder = True Then
'Es wurde bereits geklickt, also jetzt absteigend sortieren
If Target = "Nachname" Then
Range(Range("A2"), Cells(lngZeile, lngSpalte)).Sort Key1:=Target, Order1:=blnOrder + 2, Key2: _
=Target. _
Offset(0, 1), Order2:=blnOrder + 2, order3:=xlAscending, Header:=xlYes
Else
Range(Range("A2"), Cells(lngZeile, lngSpalte)).Sort Key1:=Target, Order1:=blnOrder + 2,  _
order3:=xlAscending, Header:= _
xlYes
End If
'und Variable auf False setzen
blnOrder = False
Else
'Variable steht auf false, also wieder aufsteigend sortieren
If Target = "Nachname" Then
Range(Range("A2"), Cells(lngZeile, lngSpalte)).Sort Key1:=Target, Order1:=blnOrder + 2, Key2: _
=Target. _
Offset(0, 1), Order2:=blnOrder + 2, order3:=xlDescending, Header:=xlYes
Else
Range(Range("A2"), Cells(lngZeile, lngSpalte)).Sort Key1:=Target, Order1:=blnOrder + 2,  _
order3:=xlDescending, Header:= _
xlYes
End If
'und Variable auf true setzen
blnOrder = True
End If
ElseIf Target.Column = 12 Then  'Doppelklick in Spalte L
'E-mail Adresse durch Doppelklick auf die Spalte der E-Mail Adresse als E-Mail formatieren
If IsValidMailAddress(Target) Then
Cancel = True
Me.Hyperlinks.Add Anchor:=Target, Address:="mailto:" & Target.Text, TextToDisplay:= _
Target.Text
End If
End If
End Sub
code>
allerdings funktioniert die absteigende Sortierung nicht, was ich nicht ganz verstehe, da dies ja über die Variable blnOrder ja entweder auf True oder false gesetzt wird.
Wer weiß da rat?
Danke und Gruß

16
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Absteigend Sortieren fnktioniert nicht.
12.04.2018 14:05:02
Luschi
Hallo blangmantl,
wüdest Du mit Breakepoints (Haltepunkten) arbeiten und mit F8 den Code durchsteppen, würdest
Du bei der Verzweigung feststellen, das immer nur der Else-Zweig durchlaufen wird:

If Target.Column = lngColumn Then
blnOrder = IIf(blnOrder = 0, -1, 0)
Else
lngColumn = Target.Column
blnOrder = -1
End If
Denn die Variable 'lngColumn' hat zu diesem Zeitpunkt immer den Wert '0'; es gibt nirgens eine Zuweisung vor der Verzweigung, und mit 'Dim' deklarierte Variablen verlieren ihren Wert nach Verlassen der Prozedur!
Wenn Du den Wert dieser Variablen behalten willst, mußt Du sie in einem normalen Modul als 'Public' definieren oder innerhalb der Prozedur als 'Static'.
Gruß von Luschi
aus klein-Paris
Anzeige
AW: Absteigend Sortieren fnktioniert nicht.
12.04.2018 14:24:13
blangmantl
Hallo Luschi,
Denn die Variable 'lngColumn' hat zu diesem Zeitpunkt immer den Wert '0'; es gibt nirgens eine  _
Zuweisung vor der Verzweigung, und mit 'Dim' deklarierte Variablen verlieren ihren Wert nach Verlassen der Prozedur!
Wenn Du den Wert dieser Variablen behalten willst, mußt Du sie in einem normalen Modul als 'Public' definieren oder innerhalb der Prozedur als 'Static'.
Hallo Luschi, konntest du bitte so lieb sein und mir sagen, wie ich das mit dem Modul mache?
AW: Absteigend Sortieren fnktioniert nicht.
12.04.2018 14:32:13
Daniel
der Code ist sehr umständlich und unlogisch.
z.B. warum wird blnOrder als Boolean deklariert, wenn man sie dann doch wie eine normale Zahlvariable behandelt?
bei Boolschen Variablen kannst du einfach mit x = not x umschalten und brauchst kein IIF.
Warum gibt es zwei verschiedene Codes für auf- und absteigendes Sortieren, wenn man hierfür extra die Variable blnOrder angelegt hat und beide Sortierrichtungen in der gleichen Programmzeile durchführen zu können?
Der Grundfehler ist, dass nicht beachtet wurde dass mit DIM deklarierte Variablen bei jedem Makrostart leer sind bzw den Standardwert enthalten (0 für zahlvariablen, FALSE für Boolean, "" für String)
bei den Variablen blnOrder und lngcolumn muss jedoch der Wert von der letzten Ausführung bekannt sein, damit das umschalten funktioniert!
Daher müssen diese beiden Variablen als Static deklariert werden, dann behalten sie ihren Wert bei Makroende.
zum Sortieren: Wenn du keinen 2. oder 3. Key hast, brauchst du auch kein 2. oder 3. Order
Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
Dim lngZeile As Long, lngSpalte As Long
Static lngColumn As Long
Static blnOrder As Boolean
Cancel = True
If Target.Value = "" Then Exit Sub
If Target.Row = 2 Then  'Doppelklick in Zeile 2
lngZeile = Range("A" & Rows.Count).End(xlUp).Row  'letzte befüllte Zeile in Spalte A
lngSpalte = Cells(2, Columns.Count).End(xlToLeft).Column 'letzte befüllte Spalte in zeile  _
2
If Target.Column = lngColumn Then
'Es wurde bereits geklickt, also zwischen auf- und absteigend sortiert umschalten
blnOrder = Not blnOrder
Else
'erster Klickt in dieser Spalte, dann aufsteigend sortieren
lngColumn = Target.Column
blnOrder = True
End If
'Bei Sortierung nach Namen wird der Vorname als 2. Sortierschlüssel aufgenommen,
'Bedingungen: 1. Spalte "Vorname" muss direkt rechts neben Spalte "Name" liegen,
If Target = "Nachname" Then
Range(Range("A2"), Cells(lngZeile, lngSpalte)).Sort _
Key1:=Target, Order1:=blnOrder + 2, _
Key2:=Target.Offset(0, 1), Order2:=blnOrder + 2, _
Header:=xlYes
Else
Range(Range("A2"), Cells(lngZeile, lngSpalte)).Sort _
Key1:=Target, Order1:=blnOrder + 2, _
Header:=xlYes
End If
End If
End Sub
das mit den Mails müsstest du noch einfügen, ich habs jetzt mal als störend für die Hauptaufgabe entfernt.
gruß Daniel
Anzeige
Ein wenig Senf dazu...
12.04.2018 15:00:49
Peter(silie)
Hallo,
blnOrder ist finde ich nicht unlogisch.
Ein bool ist -1 oder 0
Das Enum für Order kann 0 Oder 1 sein.
Also xlAscending=0 und xlDescending=1
Somit ist blnOrder + 2 immer eines der beiden Enums
und es wird keine weitere zuweisung o.ä. benötigt.
Iff ist varaltet aber das Equivalent zu:
(Ist das gleiche wie die WENN Funktion)
x = y ? n : x

Was nichts anderes ist als ein Single Line If, also:
If x = y Then
x = n
Else
x = x
End if 
Wird in Sprachen wie Java, C#, C++ und so weiter gerne mal verwendet.
In manchen Situationen sehr praktisch, aber du hast natürlich recht mit dem
Umschalten, dass sollte man so machen wie du!
Ob es jetzt sinnvoller ist, die Variablen Static oder Private
zu machen, darüber lässt sich streiten.
Da es is VBA unüblich ist, mit Static zu arbeiten,
würde ich hier Private bevorzugen und Static nur für Funktionen verwenden,
also z.B. Private Static Function TotalAmount(ByVal x As Long) As Long
Anzeige
AW: Ein wenig Senf dazu...
12.04.2018 15:08:43
BLangmantl
Auf jeden Fall do wie ich den Code gepostet habe funktioniert es nur in eine Richtung beim zweiten Doppelklick macht er dann nix mehr richtig wäre aber:
1. Doppelklick aufsteigend
2. Doppelklick absteigend
3. Doppelklick wieder aufsteigend und so weiter
AW: Ein wenig Senf dazu...
13.04.2018 12:22:06
blangmantl
Hallo, ich habe die Version von Daniel jetzt genommen, und die haut hin, Vielen Dank
AW: Ein wenig Senf dazu...
12.04.2018 15:25:21
Daniel
Hi
natürlich ist blnOrder ansich nicht unlogisch.
aber wenn ich schon eine Boolsche Variable verwende, die ich bei jedem Lauf umschalten will, dann schreibe ich einfach x = not x und nicht x = iif(x = 0, -1, 0). Das ist unlogisch.
Ebenso unlogisch ist, dass der Sortiercode für auf- und absteigendes Sortieren angegeben wurde, obwohl die Sortierrichtung dann im Code über die Variable gesteuert wurde.
entweder schreibe ich:
If blnOrder then
... .Sort ... Order1:=xlascending
Else
... .sort ... Order1:=xldescending
End if

oder ich schreibe
... .sort Order1:=blnOrder + 2
aber die Dopplung ist grober Unfug:
If blnOrder then
... .Sort ... Order1:=blnOrder + 2
Else
... .sort ... Order1:=blnOrder + 2
End if
Gruß Daniel
Anzeige
Da hast du absolut recht!..owT
12.04.2018 15:27:15
Peter(silie)

Und noch etwas Senf zu deinem Senf....
12.04.2018 16:03:46
EtoPHG
Peter,
Zitat:
Iff ist varaltet aber das Equivalent zu:
(Ist das gleiche wie die WENN Funktion)
x = y ? n : x 
Was nichts anderes ist als ein Single Line If, also:
If x = y Then
x = n
Else
x = x
End if

Das kann ich so nicht stehen lassen.
Wieso ist IIF veraltet? Es gehört immer noch zum offiziellen Sprachumfang von VBA!
IIF funktioniert nicht wie ein IF THEN ELSE!
Ersteres wertet immer beide Zweige aus!
Letzteres wertet genau einen Zweig (entweder THEN oder ELSE aus)
' Darum läuft dieser auf einen Fehler
Dim A, B, C
B = 1: C = 0
A = IIf(True, "Hallo", B / C)
' Dieser hingegen nicht!
If True Then
A = "Hallo"
Else
A = B / C
End If
Gruess Hansueli
Anzeige
Wie meinst Du das?
12.04.2018 16:41:01
lupo1
IIF funktioniert nicht wie ein IF THEN ELSE!
Ersteres wertet immer beide Zweige aus!
Letzteres wertet genau einen Zweig (entweder THEN oder ELSE aus)

Was ist hier denn genau unterschiedlich? Dass das eine in einer Anweisung steht, und das andere in mehreren, wirst Du damit ja wohl nicht gemeint haben.
Probier die beiden Codes aus!
12.04.2018 17:49:18
EtoPHG
Lupo,
Du wirst sehen, das der IIF auf einen Fehler läuft, obwohl der 'ELSE' Zweig/Ausdruck, gar nicht ausgewertet werden müsste. Beim IF THEN ELSE spielt der Code im 'ELSE' erst dann eine Rolle, wenn der Interpreter ihn durchlaufen müsste, aber das muss er im vorliegenden Beispiel nicht!
Ein IIF ist wegen diesem Verhalten auch grundsätzlich langsamer, wie ein IF THEN ELSE!
Gruess Hansueli
Anzeige
Hier ist zu IIf vs If...Then...Else...
12.04.2018 23:31:26
Luc:-?
…ja schon einiges Richtige gesagt worden, Peter (& Lupo),
aber eine Richtigstellung/Präzisierung scheint noch zu fehlen:
Die vbFkt IIf entspricht nur formal der xlFkt WENN (If). Der xlFmlText-Interpreter reagiert aber anders auf WENN (und auch WAHL) als VBA auf IIf! In einfacheren Fällen entspricht die xlReaktion eher der Verarbeitung eines If…Then…Else-Konstruktes in VBA. Das dürfte dann unter die in der xlHilfe postulierte Fml-(Berechnungs-)Optimierung fallen.
Man sollte niemals vergessen, dass sowohl vbPgmm als auch xlFmln Texte sind, die erst durch ihre (gelungene) Interpretation (durch ein anderes Pgm) zu Rechen- bzw Arbeitsvorschriften wdn. Keine xlFml rechnet von sich aus (war leider schon in der Schule so ;-])!
🙈 🙉 🙊 🐵 Gruß, Luc :-?
„Die Intelligenzmenge ist auf diesem Planeten eine Konstante, die Bevölkerung nimmt aber zu!“ Auch deshalb informieren mit …
Anzeige
AW: Hier ist zu IIf vs If...Then...Else...
12.04.2018 23:55:57
Blangmabtk
Und welcher Lösungsansatz funktioniert nun?
Meiner.
13.04.2018 00:47:40
Daniel
Gruß Daniel
Danke Luc, wieder was gelernt :) ...owT
13.04.2018 08:59:02
Peter(silie)

Bitte sehr & schöWE! ;-) owT
13.04.2018 14:15:55
Luc:-?
:-?

302 Forumthreads zu ähnlichen Themen

Anzeige
Anzeige
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige