Live-Forum - Die aktuellen Beiträge
Anzeige
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

VBA-For-Schleife für Profis

Forumthread: VBA-For-Schleife für Profis

VBA-For-Schleife für Profis
03.01.2015 19:29:23
Michael
Liebe Leute,
ist eigentlich je jemandem aufgefallen, daß Excel "seltsam" zählt?
Userbild
Ich würde jedenfalls erwarten, daß i nach der Schleife den Wert hat, den *ich* programmiert habe, nämlich 255 und NICHT 256 - weshalb der Überlauf des Byte erfolgt.
Naja, wenn man's weiß, isses ja nicht soo schlimm. Ach so, und das nicht nur mit X2000.
Schöne Grüße und gute Zeit,
Michael

Anzeige

11
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
Dim i as Long ... owT
03.01.2015 19:32:32
Matthias

AW: VBA-For-Schleife für Profis
03.01.2015 20:12:00
Gerd
Hallo Michael,
es ist eine Eigenschaft von For .. To - Schleifen, dass der Schleifenzähler um einen Schritt über die vorgegebene Obergrenze erhöht wird, um die Schleife abzuschließen.
Gruß Gerd

trotzdem ... as Long
03.01.2015 21:34:05
Matthias
Hallo
Ich bleibe dabei als Long zu deklarieren,
oder man verlässt die Schleife einfach beim höchsten Wert, da gibts dann auch kein Next.
Dim i As Byte
For i = 1 To 255
If i >= 254 Then MsgBox "i ist >=" & i: Exit For
Next
MsgBox i
Gruß Matthias

Anzeige
AW: trotzdem ... as Long
03.01.2015 22:22:24
Luschi
Hallo Matthias,
diese Diskussion gab es schon mal hier: http://www.ms-office-forum.net/forum/showthread.php?t=317546
Für den Anfangswert/Endwert der For-Schleife ist Byte als Datentyp für 'i' zu wenig, da dieser Schleifen-Typ 'kopfgesteuert' ist und somit Gerd's Begründung voll zutrifft.
Wenn man es supergenau nimmt, dann sollte 'i' als Integer deklariert werden, da Excel den _ Startwert '1' und den Endwert '255' in die Kategorie 'Integer' einordnet - und somit kein Casting zwischen den Datentypen erfolgen muß. Ich schreibe das in VB.Net so:

Dim i As Long
For i = 1 To CLng(255)
If i >= 254 Then MsgBox "i ist >=" & i: Exit For
Next
MsgBox i
Gruß von Luschi
aus klein-Paris

Anzeige
as Long und dann clng(Zahl) ?
04.01.2015 03:19:33
Matthias
Hallo Luschi
Gerd's Begründung habe ich ja auch nicht in Frage gestellt.
Habe nur hingewiesen das ich für solche Dinge immer Long benutze.
VB.Net kenn ich nicht, aber ist nicht ...
 Dim i As Long
 For i = 1 To CLng(255)
... doppelt gemoppelt?
Ich benutze schon seit Ewigkeiten statt Byte und Integer, eben Long
und erspare mir somit diese Überlauf-Fehlermeldungen ( siehe Michael [mit Byte] )
Diese 2 Byte zw. Integer und Long muss ich in diesem Computerzeitalter auch nicht mehr sparen ;-)
Gruß Matthias

Anzeige
int, long: schon klar, aber ...
04.01.2015 15:46:54
Michael
Liebe Leute,
- "Computerzeitalter", ja, ja. Ich hab aber im "alten" angefangen, und überhaupt bin ich auf die Geschichte nur gestoßen, weil ich ein bitpfriemeliges Zeug programmiert hab, und da hat ein byte eben ausgereicht bzw. eine Typkonvertierung überflüssig gemacht.
Ich hab das Ding mal in Pascal getestet (kriegt bitte nicht gleich die Krise), und da funktioniert es so wie erwartet:

// compiled at
// http://www.tutorialspoint. _
com/compile_pascal_online.php
var i:byte;
begin
for i:=1 to 255 do
if i>253 then writeln('innen: ',i);
writeln('aussen: ',i);
end.
Das sieht dann so aus ...
Userbild
... und das ist halt, was ich erwarte, kopfgesteuert hin oder her.
@Luschi: danke für den Link.
Tja, es geht mir eigentlich nicht primär um den Überlauf (da isses mir halt aufgefallen), sondern darum, daß i am Ende immer Endwert+1 hat. Das finde ich etwas unsauber implementiert.
Vielen Dank erst Mal und schöne Grüße,
Michael

Anzeige
VBA/VBS/VB sind nicht die einzigen Sprachen ...
04.01.2015 17:44:00
Luc:-?
…in denen das so ist, Michael,
Pascal hin oder her! ;-]
Der Zyklus wird solange durchlaufen wie die LaufVariable ≤ dem 1malig und unveränderbar im Kopf angegebenen Endwert ist. Folglich muss sie bei regulärem ZyklusEnde größer sein. Erhöht wird die LaufVariable bei Next, also am ZyklusEnde. In Pascal mag das am ZyklusAnfang getestet wdn oder ein Schalter wird bei Erreichen des Endwerts gesetzt; das ist halt ein anderes SprachKonzept.
Gruß, Luc :-?

Anzeige
AW: VBA/VBS/VB sind nicht die einzigen Sprachen ...
05.01.2015 16:49:38
Michael
Hallo Luc :-?,
Du hast ja Recht.
Ich kann natürlich auch sehr gut mit VBA leben, aber ich konnte einfach nicht widerstehen, ein bissl über diesen Sachverhalt zu meckern- manchmal packt's mich einfach.
Ich wünsche ne gute Zeit und happy exceling,
Michael

AW: VBA/VBS/VB sind nicht die einzigen Sprachen ...
05.01.2015 17:54:56
daniel
Hi
Das was du hier "anmeckerst", hat einen grossen Vorteil.
Dadurch dass bei einem vollständigen Durchlauf der Schleifenzähler einen Step weiter läuft, kann ich einfach überprüfen, ob die Schleife vorzeitig beendet wurde, wenn ich mit Exit For arbeite.
Anderenfalls wäre bei einem vorzeitigen Abbruch im letzten Umlauf keine Unterscheidung zu einem vollständigen Durchlauf möglich und man müsste eine zusätzliche Variable verwenden.
Außerdem ist der Datentyp Byte in der Verarbeitung so schnell wie Variante.
Gruß Daniel

Anzeige
AW: VBA/VBS/VB sind nicht die einzigen Sprachen ...
05.01.2015 18:35:08
Michael
Hi Daniel,
auf die Idee bin ich bisher noch nicht gekommen.
Abgesehen davon: man sollte meinen, daß Byte auf 32-bit-Systemen eh für die Katz ist: wie soll der Rechner ein einzelnes Byte adressieren?
Muß los.
Gruß,
Michael

Genau, das hatte ich noch vergessen zu ...
05.01.2015 18:43:00
Luc:-?
…erwähnen, Folks;
bei einer For Each-Schleife ist's übrigens ähnlich → ein LaufVariablen-Objekt wird nach vollständigem Durchlauf automatisch auf Nothing, ein -Variant auf Empty gesetzt. Bei Exit For aber nicht!
Gruß, Luc :-?
Anzeige
;

Forumthreads zu verwandten Themen

Anzeige
Anzeige
Entdecke relevante Threads

Schau dir verwandte Threads basierend auf dem aktuellen Thema an

Alle relevanten Threads mit Inhaltsvorschau entdecken
Anzeige

Infobox / Tutorial

VBA-For-Schleife für Profis


Schritt-für-Schritt-Anleitung

  1. Deklaration von Variablen: Beginne mit der Deklaration deiner Variablen. Verwende den Datentyp Long für die Schleifenvariable, um Überlaufprobleme zu vermeiden.

    Dim i As Long
  2. Die For-Schleife: Setze die Schleife mit For i = 1 To 255 auf. Beachte, dass der Schleifenzähler nach dem letzten Durchlauf um eins erhöht wird.

    For i = 1 To 255
  3. Bedingte Anweisungen: Füge Bedingungen hinzu, um die Schleife bei einem bestimmten Wert zu beenden, z.B. wenn i >= 254.

    If i >= 254 Then MsgBox "i ist >= " & i: Exit For
  4. Nächster Schritt: Beende die Schleife mit Next.

    Next
  5. Ausgabe: Verwende eine MsgBox, um den Endwert von i anzuzeigen.

    MsgBox i

Häufige Fehler und Lösungen

  • Überlauf-Fehler: Wenn du Byte anstelle von Long verwendest, kann es zu Überlaufproblemen kommen. Achte darauf, immer Long zu verwenden, wenn du mit größeren Zahlen arbeitest.

  • Endwert + 1: Dies ist eine Eigenschaft der For ... To-Schleife. Es ist normal, dass i nach der Schleife den Wert des Endwertes + 1 hat. Dies kann verwirrend sein, aber es ist das erwartete Verhalten der kopfgesteuerten Schleife.


Alternative Methoden

  • For Each-Schleife: Wenn du mit Collections oder Arrays arbeitest, könnte eine For Each-Schleife nützlicher sein.

    Dim Item As Variant
    For Each Item In Collection
       ' Deine Logik hier
    Next Item
  • VBA For in: Eine weitere Möglichkeit ist die Verwendung von For ... In, um durch Elemente einer Collection zu iterieren.


Praktische Beispiele

Hier ist ein einfaches Beispiel für eine VBA For-Schleife, die die Werte von 1 bis 10 ausgibt:

Sub BeispielForSchleife()
    Dim i As Long
    For i = 1 To 10
        MsgBox "Der aktuelle Wert ist: " & i
    Next i
End Sub

Wenn du eine For ... To-Schleife in einer Funktion verwenden möchtest:

Function SummeBisN(N As Long) As Long
    Dim i As Long
    For i = 1 To N
        SummeBisN = SummeBisN + i
    Next i
End Function

Tipps für Profis

  • Verwende Long für Zähler: Bei Schleifen ist es immer besser, Long zu verwenden, um sicherzustellen, dass du keine Überlauf-Fehler bekommst.

  • Optimierung: Wenn du viele Schleifen hast, versuche, die Anzahl der Iterationen zu minimieren, um die Leistung deiner VBA-Excel-Anwendung zu verbessern.

  • Debugging: Verwende Debug.Print anstelle von MsgBox, um die Leistung zu verbessern, wenn du viele Werte ausgeben musst.


FAQ: Häufige Fragen

1. Warum sollte ich Long anstelle von Byte verwenden?
Die Verwendung von Long verhindert Überlauf-Fehler, da der Long-Datentyp einen größeren Wertebereich hat.

2. Was ist der Unterschied zwischen For und For Each?
For wird verwendet, um eine bestimmte Anzahl von Iterationen durchzuführen, während For Each verwendet wird, um durch alle Elemente einer Collection oder eines Arrays zu iterieren.

3. Wie kann ich eine Schleife vorzeitig beenden?
Verwende Exit For, um die Schleife sofort zu verlassen, wenn eine bestimmte Bedingung erfüllt ist.

4. Was passiert, wenn ich i nicht deklariere?
Wenn du i nicht deklarierst, verwendet VBA den Datentyp Variant, was die Leistung beeinträchtigen und zu unerwarteten Ergebnissen führen kann. Es ist immer besser, die Variablen explizit zu deklarieren.

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Entdecke mehr
Finde genau, was du suchst

Die erweiterte Suchfunktion hilft dir, gezielt die besten Antworten zu finden

Suche nach den besten Antworten
Unsere beliebtesten Threads

Entdecke unsere meistgeklickten Beiträge in der Google Suche

Top 100 Threads jetzt ansehen
Anzeige