For-Schleife läuft unterschiedlich je Datentyp

Hallo Wissende,

begonnen hat alles mit
**/t/vereinfachung-eines-vba-macros-ecxel-2010/7298028
aber das braucht ihr gar nicht lesen, naja das von Peter vllt.

Es geht um diesen (Vba-) Code:

Sub Test()
Dim Zei As Long
Zei = 5
For Zei = 1 To Zei
 MsgBox Zei
Next Zei
End Sub

So wie er ist wird er 5mal durchlaufen wie geplant. Bei Dim Zei as Byte, Single,
Integer auch. Ist Zei als Variant deklariert/definiert wird der Code nur
einmal durchlaufen.
Ich habe daraus mit VB5.0 eine .exe gebildet, Verhalten identisch mit Vba.

Meine Fragen:
a) ist das in einer VB.Net-exe genauso?
b) Warum „klappt“ es bei Variant nicht?
c) Ist „For Zei = 1 To Zei“ ein NoGo?

Gruß ^ Danke
Reinhard**

Falsches Brett
Fragen zu VBA bitte ins VBA-Brett.

Ich fange mal mit deiner letzten Frage an:

Ist For Zei = 1 To Zei ein NoGo?

Meiner Meinung nach, ja. Denn sowohl deine Laufvariable als auch die obere Grenze sind identisch. Dass es trotzdem fünf mal durchläuft überrascht mich etwas. Wahrscheinlich integriert der VBA-Compiler irgendwelche Mechanismen, damit das nicht ins Endlose läuft. Das ist vermutlich auch der Grund, warum es für einige Datentypen funktioniert und für andere nicht.
Du solltest lieber folgende Schleife verwenden:

For zei As Long = 1 To 5
 ...
Next

Nico

Nö, Brett ist genau richtig
Hallo Nico,

Fragen zu VBA bitte ins VBA-Brett.

pauschal völlig richtig aber ich glaube in diesem speziellen Fall falsch.

Meine Fragen sind ja
a) ist das in einer VB.Net-exe genauso?
b) Warum „klappt“ es bei Variant nicht?
c) Ist „For Zei = 1 To Zei“ ein NoGo?

Und das sind doch wohl reine .Net-Fragen *find*

Was bei dem gleichen einfachen Code in VB und (Excel-)-Vba geschieht habe
ich ja beschrieben. Jetzt interessiert es mich wie das in einer .Net-Exe abläuft.

Als .Net-dAU habe ich nicht die geringste Ahnung ob ihr (die .Netler *gg*)
den Code unverändert zu einer exe kompilieren lassen könnt.
Wenn ja, wie oft läuft dann die Schleife bei Zei as Long und bei Zei as Variant.

Ich fange mal mit deiner letzten Frage an:

Ist For Zei = 1 To Zei ein NoGo?

Meiner Meinung nach, ja. Denn sowohl deine Laufvariable als
auch die obere Grenze sind identisch. Dass es trotzdem fünf
mal durchläuft überrascht mich etwas. Wahrscheinlich
integriert der VBA-Compiler irgendwelche Mechanismen, damit
das nicht ins Endlose läuft. Das ist vermutlich auch der
Grund, warum es für einige Datentypen funktioniert und für
andere nicht.

Vllt. ist Variant ein anderer Datentyp als andere für eine For-Schleife in Frage
kommende. Andrer Datentyp = kein Datentyp genaugenommen.

Du solltest lieber folgende Schleife verwenden:
For zei As Long = 1 To 5
Next

Das ist wohl .Net-Syntax, die (das „as Long“) geht so in VB/Vba nicht.
Aber die Lsg. geht am Problem leider vorbei. Die „5“ ist bei Prozedurstart
nicht bekannt und wird erst vor der For-Schleife ermittelt.
Dafür steht beispielhaft Zei=5 im Code.

So kam es zu
Dim Zei as Long
Zei =5
For Zei=1 to Zei

Seitdem habe ich aus immenser VBA-Neugier den Gebet :smile:)

Gruß
Reinhard

Stimmt
Stimmt, hast recht. Hab da wohl etwas zu flüchtig gelesen.
Ich war schon kurz davor, die Schleife anders zu schreiben, aber hab es dann doch nicht getan. Wenn die obere Grenze variabel ist, kannst du das auch umsetzen:

Dim obereGrenze As Long = 5
For zei As Long = 1 To obereGrenze
 ...
Next

Das ist etwas übersichtlicher als deine Variante. Ich habe es aber gerade mal probiert. Deine Variante funktioniert in .Net auch. Sowohl mit Long als auch mit Variant. Vermutlich wird die obere Grenze zwischengespeichert.

Nico