Anzeige
Archiv - Navigation
1400to1404
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

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

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

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 :-?

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

Anzeige
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

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

Anzeige
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 :-?

313 Forumthreads zu ähnlichen Themen

Anzeige
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige