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

Goto vermeiden

Goto vermeiden
30.01.2020 09:25:00
Joachim
Hallo Excelfans,
ich habe folgendes Problem:
Mein Code hat sehr viele ineinander verschachtelte Laufschleifen.
In jeder Laufschleife wird überprüft, ob es sinnvoll die weiteren Laufschleifen zu durchlaufen.
Die Überprüfung selbst ist aufwändig und ich möchte schon die Überprüfung abbrechen, sobald festgestellt wird, dass es nicht sinnvoll ist weiterzurechnen.
Wie gesagt, ich habe es mit "goto" gelöst.
im folgenden nenne ich die Laufschleifenvariable "i1", meine aber immer alle i1, i2, i3, ....
Wenn ich bei der Feststellung, dass eine weitere Überprüfung nicht sinnvoll ist, i1 um 1 hochzähle, ist nicht überprüft ob i1+1 eine sinnvolle Lösung ergibt. ich müsste also an den Anfang der Laufschleife zurückkehren, was ich mit einem Goto machen kann. Genauso gut kann ich aber auch ans Ende springen, und ein goto mit einem anderen goto zu ersetzen löst mein Problem nicht.
Wenn ich mit exit for aus der Laufschleife rausgehe, werden die verbleibenden i1 nicht mehr gerechnet und mir fehlen die Lösungen.
Wenn ich mit "if not sinnvoll then next i1" aus der Überprüfung raus will, dann motzt VBA wegen "next ohne for"
Gibt es eine Möglichkeit das ganze ohne goto hinzubekommen?
Danke für Euere Bemühungen
Joachim

for i1 =1 to x
Berechnung
Beginn der Überprüfung
ggf. Feststellen, dass es nicht sinnvoll ist weiter zu überprüfen, goto ELS1
Ende der Überprüfung
for i2 = 1 to y
Berechnung
Beginn der Überprüfung
Ggf. Feststellen, dass es nicht sinnvoll ist weiter zu überprüfen, goto ELS2
Ende der Überprüfung
for i3 = 1 to z
Berechnung
Beginn der Überprüfung
Ggf. Feststellen, dass es nicht sinnvoll ist weiter zu überprüfen, goto ELS3
Ende der Überprüfung
for i4 = 1 to y
Berechnung
Beginn der Überprüfung
Ggf. Feststellen, dass es nicht sinnvoll ist weiter zu überprüfen, goto ELS4
Ende der Überprüfung
for i5 = 1 to y
Berechnung
Ggf. Feststellen, dass es nicht sinnvoll ist weiter zu überprüfen, goto ELS5
Ende der Überprüfung
sehr viele weitere Laufschleifen
ELS5:
next i5
ELS4:
next i4
ELS3:
next i3
ELS2:
next i2
ELS1:
next i1




		

6
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Goto vermeiden
30.01.2020 10:13:59
Zwenn
Hallo Joachim,
es ist zwar sehr wahrscheinlich, dass so viele ineinander geschachtelte Schleifen nicht notwending sind, aber wenn eine Schleife vor Erreichen ihrer Abbruchbedingung verlassen werden soll, funktioniert das bei For-Schleifen mit Exit For und bei Do-Schleifen mit Exit-Do.
Viele Grüße,
Zwenn
AW: Goto vermeiden
30.01.2020 12:06:21
Joachim
Hallo Zwenn,
danke für Deine Nachricht.
Exit for verlässt die Schleife ohne die restlichen Variablen zu durchlaufen.
Bsp. mit i1=2, i2=3, i3=4, i4=5 (alle bis 10) wird bei der Prüfung festgestellt, dass die Kombination aus i1=2, i2=3, i3=4, i4=5 fehlerhaft ist.
Dann müssen die nächsten Laufschleifen, die alle mit i1=2, i2=3, i3=4, i4=5 ja auch einen Fehler produzieren würden nicht mehr durchlaufen werden, also soll der Code prüfen ob die Kombination i1=2, i2=3, i3=4, i4=6 bis 10 noch eine Lösung bildet.
Wenn i1=2, i2=3, i3=4, i4=6 DIE Lösung ist, muss der Code sie auch finden.
Wird Exit For angewendet, wird i4=6 nicht mehr kontrolliert und die Lösung wäre weg.
Das Ganze ist so ne Art Routenplaner, und ich überprüfe ob ich am Ziel angekommen bis, Wege sich kreuzen oder doppelt begangen werden. Das sind dann Abbruchkriterien. Dazu durchsuche ich alle Kombinationen die möglich sind. Ohne die Abbruchkriterien ist die Laufzeit ca. 5 Minuten, mit goto läufts so schnell, dass die Uhrzeit am Beginn der Rechnung und am Ende in 90% der Fälle identisch ausgegeben wird (Range("A1")=now am Beginn, Range("B1")=now am Ende der Berechnung). Also brauch ich was, das die Prüfung abbricht, goto liefert das gewünschte Ergebnis, soll man aber nicht benutzen.
Also meine Frage, wie ich in diesem Fall goto vermeiden kann.
Wenn Du eine Idee hast, wie ich das ohne verschachtelte Laufschleifen hinbekomme: Ich bin offen für jeden Tipp
ich brauche aber folgendes in der Laufschleife:

for i1=1 to 10
Festlegung der Bedingungen für Laufschleife 2
for i2=1 to 10
Berechnung
Prüfung der Lösung für i1 und i2, Bei Auftreten eines Fehlers Abbruch der Prüfung und mit  _
dem nächsten i2 weitermachen
for i3=1 to 10
Berechnung
Prüfung der Lösung für i1, i2 und i3, bei Auftreten eines Fehlers Abbruch und nächstes i3
fori4=1 to 10
Berechnung
Prüfung der Lösung für i1, i2, i3 und i4, Fehler -> Abbruch, nächstes i4
etc.pp
Gruß
Joachim
Anzeige
AW: Goto vermeiden
30.01.2020 12:49:56
Zwenn
Hallo Joachim,
das ist ein Problem der Graphentheorie, welches man typischerweise durch Rekursion löst. Die ist vor allem für Anfänger oft schwer nachzuvollziehen, aber auch Fortgeschrittene und selbst Profis tun sich mitunter schwer damit. Das ist so, weil der Mensch seiner Natur nach nicht auf mehreren Ebenen denkt.
Hier allegmeine Infos zu Graphentheorie:
https://de.wikipedia.org/wiki/Graphentheorie
Hier die mathematischen Hintergründe zu Graphentheorie:
https://mathepedia.de/Graphentheorie.html
https://studyflix.de/informatik/grundbegriffe-der-graphentheorie-1285
Hier allgemeine Infos zu Rekursion auf Wikipedia:
https://de.wikipedia.org/wiki/Rekursion
Hier speziell auf rekursive Programmierung bezogen:
https://de.wikipedia.org/wiki/Rekursive_Programmierung
Hier ist eine Lösung zum Finden eines Weges durch ein Labyrinth von onur:
https://www.herber.de/forum/cgi-bin/callthread.pl?index=1603219
Hier noch eine Lösung zum Finden eines Teilpfades zwischen zwei gegebenen Verzeichnissen:
https://www.herber.de/forum/cgi-bin/callthread.pl?index=1570655#1571193
Vielleicht gibt Dir das wenigstens einen Einblick aus welcher Ecke Deine Problemstellung überhaupt zu betrachten ist.
Viele Grüße,
Zwenn
Anzeige
AW: Goto vermeiden
30.01.2020 12:24:11
SH95
Hallo :)
Wenn ich dich richtig verstanden habe, solls ja weiterhin so laufen wie jetzt, wenn die Prüfung bei I4 keinen Sinn ergibt, willst du direkt zu Next i4 springen und nicht die anderen For schleifen abarbeiten?
Dann könntest du das als If formulieren,
jetzt mal vereinfacht dargestellt:
     for i4 = 1 to y
If "Deine Feststellung die momentan zu Goto ELS4 führt" = "Dein Ergebnis" then
for i5 = 1 to y
Berechnung
Ggf. Feststellen, dass es nicht sinnvoll ist weiter zu überprüfen, goto  _
ELS5
Ende der Überprüfung
next i5
End if
next i4
So würdest du deine "Verschachtelung" behalten, müsstest das Goto nicht verwenden und überspringst die Sachen wie bisher.
Drei Fliegen mit einer Klappe ;)
Hoffe das hilft dir :)
Gruß
Stefan
Anzeige
AW: Goto vermeiden
30.01.2020 12:56:04
Joachim
Hallo Stefan,
Jepp, das isses!!!
Danke!!!
Joachim
gerne und
30.01.2020 13:14:21
SH95
danke für die Rückmeldung.
Viel Spaß noch
Gruß
Stefan

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige