Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1040to1044
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

Endlosschleife

Endlosschleife
25.01.2009 02:25:00
Kalle
Hallo,
ich habe zwei Fragen.
1. Warum erhalte ich als Rückgabewert z.B 109,779998779296 zurück und nicht den Inhalt der Zelle 109,78 (also 109,78000000000).
und
2. Wenn die Bedingung für die äußere Schleife
(Do Until ActiveCell.Value = 1)
erneut erfüllt ist, bevor die Bedingung der inneren Schleife
(Do Until ActiveCell.Offset(0, -1).Value = proof + ref2)
erfüllt ist, läuft die Schleife endlos weiter bzw. liefert den Rückgabewert der letzten Abfrage (z.B. die 1. Bedingung liefert den Rückgabewert der 2. Bedingung).
Wie kann ich die innere Schleife zwingen auf die äußer zu "warten"?

Private Sub CommandButton1_Click()
Dim proof As Single
Dim ref1 As Single
Dim ref2 As Single
Dim marker As String
ActiveSheet.Range("b2").Select
weiter:
Do Until ActiveCell.Value = 1
ActiveCell.Offset(1, 0).Select
If ActiveCell.Value = "" Then Exit Sub
Loop
proof = ActiveCell.Offset(0, -1)
marker = ActiveCell.Offset(0, 1).Address
ref1 = "-0,2"
ref2 = "+0,4"
ActiveSheet.Range("b2").Select
Do Until ActiveCell.Offset(0, -1).Value =  _
proof + ref2
ActiveCell.Offset(1, 0).Select
If ActiveCell.Value = "" Then Exit Sub
Loop
proof = ActiveCell.Offset(0, -1).Value
Range(marker).Select
ActiveCell.Value = proof
ActiveCell.Offset(1, -1).Select
GoTo weiter
End Sub


4
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
Endlospgm nicht -schleife
25.01.2009 03:11:00
Luc:-?
Hallo Kalle,
zu 1.: Eine Subroutine gibt keinen Wert zurück! Du meinst sicher die Eintragung des Wertes von proof in die selektierte Zelle. Da proof aber auch nur einem um eine Addition vergrößerten Zellwert entspricht, liegt das wohl am ursprünglichen Zellinhalt. Als xlProfi sollte man schon wissen wie Xl Zahlen darstellt und deshalb den Unterschied zwischen formatierter und gerundeter Zahlenanzeige bzw "Zahlwert wie angezeigt" kennen!
zu 2.: Du hast keine äußere und innere Schleife, nur 2 separate! Von innerer und äußerer Schleife spricht man nur dann, wenn die bd Schleifen ineinander geschachtelt wdn. Auf diese Weise wird immer die innere Schleife zuerst beendet. Die Do-Schleifen können vorzeitig mit Exit Do beendet wdn. Exit Sub ist idR eine zu rigorose Lösung. Der Rücksprung vor dem Ende des Pgms sorgt dafür, dass es endlos läuft, falls nicht eine der bd Exit Sub-Bedingungen erfüllt wird. Dann wird allerdings auch nicht proof in eine Zelle zurückgeschrieben!
Fazit: Nochmal die VBE-Hilfe zu Do nachlesen, im Forumsarchiv nach Do-Schleifen-Bspp suchen und die vielen völlig unnützen Select durch Direktansprache der Zellen ersetzen (ebenfalls Bspp in VBE-Hilfe und Archiv).
Gruß Luc :-?
Anzeige
AW: Programm unklar
25.01.2009 11:33:00
Erich
Hallo Kalle,
man könnte schon sagen, dass du drei Schleifen in der Prozedur hast: Zwei Do-Schleifen und eine,
die über "weiter:" und "Goto weiter" und gesteuert wird.
"Goto" sollte man so nur in Ausnahmefällen verwenden.
Ohne zu verstehen, was die Prozedur überhaupt bewirken soll,
vermute ich doch, dass hier kein solcher Ausnahmefall vorliegt.
Vielleicht kannst du die Aufgabe der Prozedur etwas klarer formulieren - im Text oder als Code.
Zur Zahlenungenauigkeit:
Warum verwendest du Single statt Double? Hier stehen dazu einige Links:
https://www.herber.de/forum/archiv/1028to1032/t1031484.htm#1031516
Und wenn ref1 und ref2 Zahlenvariablen sind, solltest du denen keine TEXTE zuweisen,
also ref1 = -0.2 statt ref1 = "-0,2"
Rückmeldung wäre nett! - Grüße von Erich aus Kamp-Lintfort
Anzeige
AW: Endlosschleife
25.01.2009 13:20:14
Daniel
Hi
ohne mich jetzt genauer mit deinem Programm zu befassen:
zu 1)
das liegt daran, daß Computer dual rechnen und wir dezimal, da kommt es bei der Umrechnung zu Ungenauigkeiten, insbesondere beim Datentyp SINGLE. Besser ist hier der Datentyp DOUBLE, der genauer ist, da für die Darstellung der Zahl mehr Speicherplatz verwendet wird.
zu 2)
aus dem oben genannten Grund sind DO-Schleifen mit "=" als Abbruchbedingung für Endlosschleifen besonders anfällig (auch bei beim Datentyp DOUBLE kann das auftreten).
Auf der sicheren Seite steht man, wenn man als Abbruchbedingung dann ">=" bzw " falls das nicht geht, sollte man zumindest mit der ROUND-Funktion sicherstellen, daß der Fehler kompensiert wird.

Do Until Round(ActiveCell.Value, 3) = 1


Gruß, Daniel

Anzeige
AW: Endlosschleife
25.01.2009 14:41:23
Kalle
Ich werde das Programm nochmal überarbeiten und ggf. nochmal posten. Vielen Dank für eure Hilfe.
Gruß
Pascal

Links zu Excel-Dialogen

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige