Excel 2010 Sortierproblem

Hallo,

ich möchte gerne nach einer Spalte sortieren, deren Zellen nur Zahlen (2010, 2011) enthalten können oder Zahlen und Text (z.B „2011 Start“," 2012 Ende"). Einfache Aufgabenstellung: Es soll nach den führenden Zahlen sortiert werden. Leider werden die Felder, die nur aus Zahlen bestehen separat sortiert. Ich habe das Zellformat auch für alle Felder auf „Text“ gestellt. Gleiches Problem. Idee?
Grüße, Joe

Grüezi Joe

ich möchte gerne nach einer Spalte sortieren, deren Zellen nur
Zahlen
(2010, 2011) enthalten können oder Zahlen und Text (z.B
„2011 Start“," 2012 Ende").

Gemischte Daten (Text und Zahlen) zu sortieren ist immer etwas tricky… :wink:

Einfache Aufgabenstellung: Es soll
nach den führenden Zahlen sortiert werden. Leider werden die
Felder, die nur aus Zahlen bestehen separat sortiert. Ich habe
das Zellformat auch für alle Felder auf „Text“ gestellt.
Gleiches Problem. Idee?

Das einfache Umformatieren reicht nicht aus - die Daten müssen zwingend alle als Text erfasst werden, damit korrekt sortiert werden kann.

Zuverlässig umformatieren kannst Du mit den folgenden Schritten:

  • Spalte markieren

  • Menü: ‚Daten‘

  • Text in Spalten

  • [x] Getrennt

  • [Weiter >]

  • [Weiter >]

  • Datenformat der Spalten: [x] Text

  • [Fertig stellen]

Mit freundlichen Grüssen

Thomas Ramel

  • MVP für MS-Excel -

Hallo jörg,
wenn Du Lust hast, kannst Du auch mein kleines vba-Makr ausprobieren:

Option Explicit
Dim AR As Integer
Dim AC As Integer
Dim LR As Integer
Dim LC As Integer
Dim R1 As Integer
Dim C1 As Integer
Dim R0 As Integer
Dim i As Integer

Sub sortieren_nach_aktueller_Spalte_2003()
'dieses Makro läuft auch unter Excel 2003.

'Dieses Makro sortiert alle belegten Zellen
'unterhalb der letzten ÜberschriftenZeile nach
'der Spalte, in der der Cursor bei Auslösung steht.
'Vorher werden alle ausgeblendeten Zellen eingeblendet und Filter zurückgesetzt.
'Voraussetzung: Überschriften und Konstanten in Zeile 1 bis 8 ( werden nicht mitsortiert )
’ Spalten vor c1 werden ebenfalls nicht mitsortiert.
If Cells(1, 20) = 0 Then Cells(1, 20) = 9
If Cells(1, 21) = 0 Then Cells(1, 21) = 1
R1 = Cells(1, 20) ’ erste DatenZeile, ggf. anpassen
C1 = Cells(1, 21) ’ erste DatenSpalte, ggf. anpassen
’ r1=9:Überschriften NUR OBERHALB Zeile 9!!!
’ c1=4:Steuerungs-Spalten NUR VOR Spalte 4!!!

Application.ScreenUpdating = False
Application.Calculation = xlCalculationManual
'Application.DisplayAlerts = False

LR = ActiveCell.SpecialCells(xlLastCell).Row
LC = ActiveCell.SpecialCells(xlLastCell).Column
AR = ActiveCell.Row
AC = ActiveCell.Column
If ActiveSheet.FilterMode Then ActiveSheet.ShowAllData
’ Rows(R1 - 1).AutoFilter
’ Rows(R1 - 1).AutoFilter
Cells.EntireColumn.Hidden = False
Cells.EntireRow.Hidden = False
Range(Cells(R1 - 1, C1), Cells(LR, LC)).Select

Selection.Sort Key1:=Range(Cells(R1, AC), Cells(LR, AC)), Order1:=xlAscending, Header:=xlYes, _
OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom, _
DataOption1:=xlSortTextAsNumbers

Cells(AR, AC).Select

Application.ScreenUpdating = True
Application.Calculation = xlCalculationAutomatic
End Sub

Durch „DataOption1:=xlSortTextAsNumbers“ wird Alles als Text behandelt.

ACHTUNG:
Vorher sicherheitshalber Kopie speichern und dafür sorgen, dass
die zu sortierenden Daten unterhalb Zeile 8 stehen!

Viel Spaß und Erfolg
Thomas

Hallo Thomas,

du benutzt in deinem Code Specialcells(xlLastCell)
Ich finde die Möglichkeiten/Parameter von Specialcells
schon sehr schön.
ABER bitte beherzige meine Warnung, Specialcells ist tückisch :frowning:

Nimm mal ein leeres Blatt wo noch nie was drin stand, also garantiert keine Altlasten vorhanden sind.

Dann schau dir mal diesen Code an:
Sub tt()
Range(„A1“).Value = „huhu“
Range(„X50“).Value = „huhu2“
MsgBox Range(„A:A“).SpecialCells(xlCellTypeLastCell).Row
End Sub
Ohne Test erwarte ich, vielleicht du auch, daß eine 1 angezeigt wird.
Denn im Code steht ja quasi direkt LastCell von A.
Leider wird aber die 50 angezeigt.

Du benutzt ActiveCell.SpecialCells(xlLastCell).Row
Okay, sah ich so noch nie aber das ist ja wurscht.
Ich will dir mit diesem Hinweis nur sagen, bei Benutzung von
Specialcells sei wachsam, mehr nicht.

Du benutzt Integr für Zeilenvariablen.
Da sind zwei Dinge erwähnenswert.
Zum einen „kracht“ das wenn die Zeilennummer größer 32xxx wird.
Zum anderen, Cells(Zeile,Spalte) erfordert Longwerte.
D.h. deine Integerwerte werden sowieso in Longwerte umgewandelt.

Ergo, und ist auch einfach umzusetzen, definiere ich Zeile UND Spalte immer als Long. das löst zuverlässig beide Problematiken.

Gruß
Reinhard

1 Like

besser?
Hallo Reinhard,
natürlich hast Du recht, dass Integer-Variablen für die möglichen Zeilen nicht immer reichen. Das ist bei mir allerdings auch noch nicht vorgekommen, dass ich über 30.000 Zeilen sortieren wollte. Habe ich nun geändert.
Die SpecialCells-Abfrage hat bei mir immer richtig funktioniert.
Ich kenne aber auch keine Alternative. Da wäre dann die Frage an Dich, was man zuverlässiger einsetzt.
In Deinem Beispiel beziehst Du Dich auf einen SonderFall, nämlich die Frage nach der letzten benutzten Zelle in einer bestimmten Spalte. Das habe ich bisher so nicht eingesetzt. Auch da wäre eine Alternative interessant für spätere Verwendung.
Dann habe ich vor dem Sortieren den Bereich markiert mit select.
Nett, dass Du da nicht geschimpft hast. Das habe ich schon ´mal versucht, wegzubekommen, bin aber gescheitert.
Das letzte select muss dann leider auch drin bleiben, weil ich damit die Startzelle wieder anspringe ( Naja, jedenfalls dieselbe Zelle nach Zeilen- und SpaltenNummer. Optimal wäre, genau die Zelle anzuspringen, wo der Cursor bei Start des Makros war, auch wenn diese woanders hinsortiert wird. Möglicherweise passiert das ja automatisch, wenn man alle selects weglässt - glaube ich aber erst, wenn ich das sehe :wink: )

Da dieses Makro bei mir in vielen Tabellen Anwendung findet, bin ich über jeden Tip zur Verbesserung besonders dankbar.

Freundliche Grüße aus Oldenburg von
Thomas

Option Explicit
Dim AR As Long
Dim AC As Long
Dim LR As Long
Dim LC As Long
Dim R1 As Integer
Dim C1 As Integer

Sub sortieren_nach_aktueller_Spalte_2003()
'dieses Makro läuft auch unter Excel 2003.

'Dieses Makro sortiert alle belegten Zellen
'unterhalb der letzten ÜberschriftenZeile nach
'der Spalte, in der der Cursor bei Auslösung steht.
'Vorher werden alle ausgeblendeten Zellen eingeblendet und Filter zurückgesetzt.
'Voraussetzung: Überschriften und Konstanten in Zeile 1 bis 8 ( werden nicht mitsortiert )
’ Spalten vor c1 werden ebenfalls nicht mitsortiert.
If Cells(1, 20) = 0 Then Cells(1, 20) = 9
If Cells(1, 21) = 0 Then Cells(1, 21) = 1
R1 = Cells(1, 20) ’ erste DatenZeile, ggf. anpassen
C1 = Cells(1, 21) ’ erste DatenSpalte, ggf. anpassen
’ r1=9:Überschriften NUR OBERHALB Zeile 9!!!
’ c1=4:Steuerungs-Spalten NUR VOR Spalte 4!!!

Application.ScreenUpdating = False
Application.Calculation = xlCalculationManual

LR = ActiveCell.SpecialCells(xlLastCell).Row
LC = ActiveCell.SpecialCells(xlLastCell).Column
AR = ActiveCell.Row
AC = ActiveCell.Column
If ActiveSheet.FilterMode Then ActiveSheet.ShowAllData
Cells.EntireColumn.Hidden = False
Cells.EntireRow.Hidden = False
Range(Cells(R1 - 1, C1), Cells(LR, LC)).Select
Selection.Sort Key1:=Range(Cells(R1, AC), Cells(LR, AC)), Order1:=xlAscending, Header:=xlYes, _
OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom, _
DataOption1:=xlSortTextAsNumbers

Cells(AR, AC).Select

Application.ScreenUpdating = True
Application.Calculation = xlCalculationAutomatic
End Sub

Hallo Thomas,

natürlich hast Du recht, dass Integer-Variablen für die
möglichen Zeilen nicht immer reichen. Das ist bei mir
allerdings auch noch nicht vorgekommen, dass ich über 30.000
Zeilen sortieren wollte.

schon, aber es kann doch leicht vorkommen daß du den Code/mappe an andere weitergibst, ggfs. wie hier in einem Forum anderen zur Verfügung stellst.
Und da weiß man nie was da vorliegt.
Grad heuer wenn da mehr und mehr Xl ab 2007 genutzt wird.

Wobei ich mich manchmal so schon frage wenn da jmd. einen riesigen Datenbstand hat mit 600.000 Zeilen, 5.000 Spalten ob er da nicht je nach Fall besser beraten würde er würde Access oder ähnliches
benutzen.
Access ist doch m.E. dafür optimiert worden um da zu sagen
zeig mir mal fix alle Datenzeilen der 600.000 wo der Verkäufer
in München sitzt und zwischen 60.000 und 80.000 € Umsatz hat.
Aber okay, kenn mich mit Access nicht aus, vielleicht fehlt
Access wiederum manches was Excel besser kann.

Ich denke die richtige Mischung macht es.
Wenn man Excel gewöhnt ist und dann die schlappen Möglichkeiten
sieht die Word für Wordtabellen anbietet um das was zu berechnen
kriegt man erstmal einen Schock :smile:
Aber wenn man geschickt beides nutzt, also eine Exceltabelle oder Diagramm in Word einbinden so ist man doch klar im Vorteil.

Habe ich nun geändert.

Wie du magst, ist ja kein Muß oder Dogma wenn ich hier Wissen weitergebe. Es soll einzig dir oder Mitlesenden helfen.
Dann kann natürlich jeder für sich entscheiden ob er das so macht oder anders.
Wichtig ist einzig daß er beide bzw. weitere Möglichkeiten kennt einen Code zu basteln.

Die SpecialCells-Abfrage hat bei mir immer richtig
funktioniert.

Würdest du darauf 1 Million € verwetten wenn du grad nur 1 Mio hättest?
Hier oder war das im VB-Brett, da hatte ich aktuell eine
Beitragsfolge mit Rolf Ernst wo (fast) unentdeckt blieb das da
Specialcells() einen falschen Wert zurückliefert.
Daß die Codezeile mit Specialcells() keine Fehlermeldung bedeutet
ja keinesfalls daß Specialcells() genau das tat was ich/man/du
erhoffte

Ich kenne aber auch keine Alternative. Da wäre dann die Frage
an Dich, was man zuverlässiger einsetzt.

K.A. bzw. sorry, weiß ich nicht.

In Deinem Beispiel beziehst Du Dich auf einen SonderFall,
nämlich die Frage nach der letzten benutzten Zelle in einer
bestimmten Spalte. Das habe ich bisher so nicht eingesetzt.

Ist aber ein recht häufiger Fall daß man im Code ermitteln muß
wie „lang“ die Eintrgasliste in einer Spalte ist.
Ggfs. die „unterste“ Zeile eines Spaltenbereichs ermitteln.

Dann habe ich vor dem Sortieren den Bereich markiert mit
select.

Das siehste nie in einem professionellen Code.
Select wird grundsätzlich nur dann eingesetzt wenn es zwingend nötig ist.

Nett, dass Du da nicht geschimpft hast.

Aha, ich glaub ich muß mal mit meinem Pressesprecher sprechen daß das
nicht immer als Geschimpfe rüberkommt sondern so wie es gemeint ist.
Als möglichst hilfreicher Hinweis.

Das habe ich schon
´mal versucht, wegzubekommen, bin aber gescheitert.

Wodran genau?
An der Änderung von

Range(Cells(R1 - 1, C1), Cells(LR, LC)).Select
Selection.Sort Key1 …

zu
Range(Cells(R1 - 1, C1), Cells(LR, LC)).Sort Key1:
sicher nicht.

Das letzte select muss dann leider auch drin bleiben, weil ich
damit die Startzelle wieder anspringe ( Naja, jedenfalls
dieselbe Zelle nach Zeilen- und SpaltenNummer. Optimal wäre,
genau die Zelle anzuspringen, wo der Cursor bei Start des
Makros war, auch wenn diese woanders hinsortiert wird.

Okay, das Anspringen einer Zelle ist einer der Fälle wo man Select braucht.
Um das was du beschreibst zu lösen könntest du zu Anfang des Codes
schreiben:
Set rngMerker=Activecell
und am Ende des Codes dann
rngMerker.select

Möglicherweise passiert das ja automatisch, wenn man alle
selects weglässt - glaube ich aber erst, wenn ich das sehe :wink:
)

? Dann mach das doch erstemal, also das Weglassen.

Da dieses Makro bei mir in vielen Tabellen Anwendung findet,
bin ich über jeden Tip zur Verbesserung besonders dankbar.

Gut, ich nehme mir mal deinen Code vor und sezesiere ihn.
Dann schreibe ich was mir daran nicht passt und ggfs. was ich für besser halte.
Manches davon ist/wird dann auf deine Vba-Zukunft bezogen sein.

D.H. für Kleinigkeiten wie ein Modul mit 5 Prozeduren ist es
noch nicht richtig wichtig.
Bei 20 Modulen mit je 10 Prozeduren umso wichtiger.

Gruß
Reinhard

Application.Calculation am Fremd PC abändern
Hallo Thomas,

der Thread wird zwar dadurch länger aber insgesamt übersichtlicher.
Deshalb gehe ich jetzt einzeln auf bestimmte Dinge.

Du benutzt anfangs des Codes

Application.Calculation= xlCalculationManual
und am Ende dann
Application.Calculation= xlCalculationAutomatic

Das ist nicht korrekt. Es gilt immer, dein Code auf einem Fremdrechner
sollte den Fremdrechner so verlassen wie vorgefunden.
Ergo ist die sicherere Löung so:

Anfangs des Codes:
lngMerker =Application.Calculation
Application.Calculation= xlCalculationManual
am Ende dann
Application.Calculation=lngMerker

PS: mea culpa, ich hab hier sicher auch schon Code gezeigt wo ich
auch erst auf Manual und dann auf Automatic setzte :frowning: :smile:

Gruß
Reinhard

1 Like

Vba, Value, Value2, Text
Hallo Thomas,

du benutzt
Cells(1, 20)

okay, schreib ich auch gelegentlich so obwohl ich an sich betrebt bin .Value immer dran zu hängen.
Du solltest dich zumindest in der Hilfe schlau machen warum es
Value, Value2 und Text gibt.
Jetzt nicht für Jux und Dollerei. Wenn ich hier Tabellenbereiche
präsentiere benutze ich meinen Code aus FAQ:2363
Da mußte ich z.B. Cells(1,20) .Text benutzen.

Ähm, Value2 habe ich noch nie benutzt. Schau in die Hilfe dann
weißte dazu so viel wie ich :smile:

Gruß
Reinhard

IIf ist dein Freund, Referenzierung Withschleife
Hallo Thomas,

du benutzt
If Cells(1, 20) = 0 Then Cells(1, 20) = 9
If Cells(1, 21) = 0 Then Cells(1, 21) = 1
R1 = Cells(1, 20) ’ erste DatenZeile, ggf. anpassen
C1 = Cells(1, 21) ’ erste DatenSpalte, ggf. anpassen

später dann im Code
Activesheet…

Mache das bitte gleich richtiger, das sieht dann so aus:

With Activesheet 'oder auch With Worksheets("Tabelle4711")
 If .Cells(1, 20) = 0 Then .Cells(1, 20) = 9
 If .Cells(1, 21) = 0 Then .Cells(1, 21) = 1
 R1 = .Cells(1, 20) ' erste DatenZeile, ggf. anpassen
 C1 = .Cells(1, 21) ' erste DatenSpalte, ggf. anpassen
 '...
End With

Der Punkt vor .Cells entscheidet, entweder bezieht sich das ohne
Punkt auf das grad aktive Blatt oder mit Punkt auf das Blatt was With angibt.

Zu IIf.
Ich gebe zu, anfänglich gewöhnungsbedürftig aber später
sehr vorteilhaft, u.a. weil der Code leicht/leichter lesbar bleibt.
Das sieht dann so aus:

With Activesheet 'oder auch With Worksheets("Tabelle4711")
 R1 = IIf(.Cells(1, 20).value = 0,9, .Cells(1, 20).value)
 C1 = IIf(.Cells(1, 21).value = 0,1, .Cells(1, 21).value)
 '...
End With

Gruß
Reinhard

1 Like

Hi,

ich mache das immer anders:

R1 = .Cells(..).Value: If R1 = 0 Then R1 = 9
C1 = .Cells(..).Value: If C1 = 0 Then C1 = 1

damit VBA nicht zwei Mal auf .Cells zugreifen muß. M.E. ist der Code zudem noch leichter lesbar.
Was meinen die Profis dazu?

Gruß

Markus

Herzlichen Dank!
…am Wochenende probier ich´s aus :smile:

Beste Grüße, Jö

Dankeschön!
…ich probier erstmal die Variante ohne VB,
legs mir aber „in´s eisfach“ :smile:

Danke, beste Grüße, J.

Hallo Reinhard,
wenn ich BeispielCode hier poste ist das immer ohne Gewähr und mit Empfehlung einer vorherigen DatenSicherung.
Zu Access und Word habe ich keine nennenswerten Erfahrungen.
Wie gesagt bin ich für VerbesserungsVorschläge offen und dankbar.
Wenn ich 20 Millionen € hätte würde ich keinen Cent auf die reproduzierbare Richtigkeit einer Excel-Operation wetten.
Ein Fehler bei der Berechnung der letzten belegten Zelle hätte in diesem Fall nur zur Folge, dass nicht Alles sortiert wird.
Und wenn es keine Alternative gibt muss man halt mit dem klarkommen, was geht. Eine UniversalLösung für alle häufig benötigten AnwendungsFälle wird man wohl nicht finden.
Woran es bei mir ohne „select“ gescheitert ist habe ich leider vergessen :frowning: Muss ich eben noch einmal versuchen…
Vielen Dank für Deine Mühe mit der Verbesserung meines Makros.
Hast ja oben auch schon fleißig geschrieben. Werde versuchen, ebenso strukturiert zu antworten bzw. Deine Tips umzusetzen. Bin aber immernoch im DauerStress, so dass es nicht so schnell gehen wird.
Um meine Zukunft als vba-Programmierer mache ich mir mit fast 50 Jahren aber keine großen Hoffnungen :wink:
Freundliche Grüße
Thomas

Hallo Reinhard,
ist einleuchtend. Habe ich auch erst kürzlich auf einer anderen Seite gelesen und mir vorgenommen, das zu beherzigen --> fließt Alles in meine neue MakroVersion ein :smile:
Danke und Gruß
Thomas

Hallo Reinhard,
hallo Mitlesende,
nun habe ich Deine VerbesserungsVorschläge einmal einfließen lassen.
Es ging jetzt sogar auf AnHieb ohne Select ( keine Ahnung, was ich damals falsch probiert habe … )
Hier das Ergebnis:

Option Explicit
Dim AR As Long
Dim AC As Long
Dim LR As Long
Dim LC As Long
Dim R1 As Integer
Dim C1 As Integer
Dim Merker_DA As String
Dim Merker_SU As String
Dim Merker_Calc As String

Sub sortieren_nach_aktueller_Spalte_2003()
'dieses Makro läuft auch unter Excel 2003.

'Dieses Makro sortiert alle belegten Zellen unterhalb der letzten ÜberschriftenZeile nach
'der Spalte, in der der Cursor bei Auslösung steht. Vorher werden alle ausgeblendeten Zellen eingeblendet und Filter zurückgesetzt.
'Voraussetzung: Überschriften und Konstanten in Zeile 1 bis 8 ( werden nicht mitsortiert )
’ Spalten vor c1 werden ebenfalls nicht mitsortiert.
Merker_SU = Application.ScreenUpdating
Application.ScreenUpdating = False
Merker_Calc = Application.Calculation
Application.Calculation = xlCalculationManual
'Merker_DA = Application.DisplayAlerts
'Application.DisplayAlerts = False

With ActiveSheet
R1 = IIf(.Cells(1, 20).Value = 0, 9, .Cells(1, 20).Value) ’ R1=9:Überschriften NUR OBERHALB Zeile 9!!!
C1 = IIf(.Cells(1, 21).Value = 0, 1, .Cells(1, 21).Value) ’ R1=4:Steuerungs-Spalten NUR VOR Spalte 4!!!
If .FilterMode Then .ShowAllData
End With

LR = ActiveCell.SpecialCells(xlLastCell).Row
LC = ActiveCell.SpecialCells(xlLastCell).Column
AR = ActiveCell.Row
AC = ActiveCell.Column

Cells.EntireColumn.Hidden = False
Cells.EntireRow.Hidden = False
Range(Cells(R1 - 1, C1), Cells(LR, LC)).Sort Key1:=Range(Cells(R1, AC), Cells(LR, AC)), Order1:=xlAscending, Header:=xlYes, _
OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom, _
DataOption1:=xlSortTextAsNumbers

Application.ScreenUpdating = Merker_SU
Application.Calculation = Merker_Calc
'Application.DisplayAlerts = Merker_DA
End Sub

Vielen Dank für deine Hilfe.
Freundliche Grüße
Thomas

Hallo Reinhard,
die Eigenschaft .value kenne ich. Manchmal muss man es verwenden, manchmal weiß Excel, dass es gemeint ist :smile:
Klar, dass man am besten eindeutigen Code benutzt.
Die Hilfe zu .value2 habe ich leider nicht verstanden.
Vielleicht erklärt es mir noch Jemand. Aber, wenn selbst Du keine Erfahrung damit hast, denke ich, dass ich es nicht unbedingt brauchen werde.
Es gibt da viele interessante Eigenschaften, aber wenn ich so etwas brauche muss ich sowieso zeitnah suchen und probieren, weil ich mir das schlecht merken kann.
Trotzdem vielen Dank für die Tips und schönen Abend
thomas

Hallo Thomas,

du hast da die Merker als String deklariert.
Teste bitte mal
MsgBox TypeName(Application.ScreenUpdating)
MsgBox Application.ScreenUpdating * 1

Also in dem Fall kein String sondern ein boolscher
Wert.
In Excel ist es so,
Wahr = 1
Falsch = 0

In Excel-Vba (Word-Vba, Vb)
True= - 1
False = 0

Wie schon gesagt, bezogen auf viele Module rentiert es
sich diese „Beschleunigungs“-maßnahmen nicht in jede
Prozedur reinzuschreiben.
Dann wird es wieder effektiv dafür eine eigene Prozedur
zu schreiben.

In den Modulen wo das genutzt werden soll schreibt man dann
nur noch zu Anfang:
Call Getmorespeed(True)
und am Ende
Call Getmorespeed(False)
Nachfolgend ist entsprechender Code für so eine Prozedur.
Hinweis, sie muß erst eingeschaltet werden bevor du sie
ausschalten kannst sonst kommt ein Fehler.

Bei „Cursor“ hat der Autor nicht die benannten Excelkonstanten
-Parameter genommen sondern Zahlenwerte.
Wenn du auf sowas triffst ist es mühsam herauszufinden was denn nun
die 2 oder die -4143 bedeutet.

Ertesten kannst du das mit
MsgBox Application.Cursor
Dann siehst du die Zahl für den Standardcursor. (-4143)
Dann ggfs. per Excel oder wie hier per Code bei .Cursor
nacheinander die vier Konstanten von Cursor einstellen
und anzeigen lassen.
Dann weißt du auch was in dem Fall die 2 bedeutet (Sanduhr)

Was in so Fällen oftmals schneller ist, benutze das Direktfenster.
Du siehst ja in der Hilfe die vier Auswahlmöglichkeiten
für .Cursor
xlDefault
xlWait
xlNorthwestArrow
xlIBeam

Schreibe im Direktfenster ein Fragezeichen, direkt dahinter
den betreffenden Konstantennamen, also so
?xlNorthwestArrow
und drücke auf Enter…

Gruß
Reinhard

Public Static Sub GetMoreSpeed(Optional ByVal Modus As Boolean = True)
Dim intCalculation As Integer
If Modus = True Then intCalculation = Application.Calculation
With Application
 .ScreenUpdating = Not Modus
 .EnableEvents = Not Modus
 .Calculation = IIf(Modus = True, xlManual, intCalculation)
 .Cursor = IIf(Modus = True, 2, -4143)
End With
End Sub

Hallo Reinhard,
mit iif habe ich mich durch Deinen Hinweis erstmalig beschäftigt und stelle fest, dass der Code kompakter wird. Außerdem ähnelt die Syntax der Verwendung von Wenn() in Tabellen.
Beides kommt mir entgegen. Deshalb vielen Dank hierfür und
beste Grüße aus OL
Thomas

Grüezi zusammen

mit iif habe ich mich durch Deinen Hinweis erstmalig
beschäftigt und stelle fest, dass der Code kompakter wird.
Außerdem ähnelt die Syntax der Verwendung von Wenn() in
Tabellen.
Beides kommt mir entgegen.

…dagegen sprechen könnte bei extensiver Nutzung der erforderliche Zeibedarf. IIF() wertet immer beide Versionen die als Rückgabe in Frage kommen komplett aus, was mehr Zeit in Anspruch nimmt als ein Bedingter Vergleich mit dem ‚normalen‘ If…Then.

Aber wie gesagt spielt das bei kleinen Schleifen nicht wirklich eine Rolle.

Mit freundlichen Grüssen

Thomas Ramel

  • MVP für MS-Excel -

Moin Markus,
was die Profis dazu sagen würde ich auch gerne wissen :smile:
Ich muss allerdings sagen, dass hier die Funktionalität nicht ganz getroffen wird, weil ich die Zellen dazu missbrauche, die Werte zu speichern, so dass ich sie auch ohne vba sehen und ändern kann.
( Sicher gibt es dazu auch andere Methoden … )
Interessant finde ich die Möglichkeit, mehrere Anweisungen in eine Zeile zu schreiben. Das habe ich bisher noch nie gesehen in vba-code.
Könnte in manchen Fällen dazu führen, dass man ein Makro ansehen kann ohne zu scrollen :smile:
Dafür vielen Dank und einen schönen Abend
thomas