Anzeige
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

Steigerung von Exit Sub möglich?

Forumthread: Steigerung von Exit Sub möglich?

Steigerung von Exit Sub möglich?
08.12.2003 01:37:17
Franz W.
Hallo Freunde,

habe zu später Stunde noch eine Frage, von der ich mal wieder nicht weiß, ob es das überhaupt gibt.

Mit Exit Sub kann man aus einer Prozedur aussteigen.

Wurde diese Prozedur aber von einem Makro aus aufgerufen, dann wird nach dem Ausstieg mit dem Code des aufrufenden Makros weitergemacht.

Ist es möglich, auch das zu unterbinden? Gibt es also ein Anweisung, mit der man aus allen Makros - auch aus allen aufrufenden Makros aussteigen kann (vgl. Access: StoppMakro - StoppAlleMakros) ???

Vielen Dank für Eure Hilfe und Grüße
Franz
Anzeige

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

Betreff
Datum
Anwender
Anzeige
AW: Steigerung von Exit Sub möglich?
08.12.2003 01:52:48
PeterW
Hallo Franz,

da fängst du gerade an, vernünfigen Code zu produzieren und willst jetzt einen überflüssigen Befehl einsetzen. :-)

Gib der aufgerufenen Unterprozedur eine boolsche Variable mit, werte deren Wahrheitswert bei der Rückkehr in die Hauptprozedur aus und beende in Abhängigkeit davon die Hauptprozedur.

Gruß
Peter
Anzeige
So macht man das...
08.12.2003 02:04:39
Franz W.
Hallo Peter,

vielen Dank für die Blumen!! Und daran bist Du nicht ganz unschuldig :-))). In meiner absoluten Anfangszeit wollte ich gleich mal was, was damals für mich viel zu groß war. Du hast mir sehr geduldig da durch geholfen mit dem anschließenden Rat, viel im Forum mitzulesen, mitzumachen, ... Und das war's in der Tat, das hat mir sehr geholfen. Dir dafür auf jeden Fall ganz vielen Dank!! Dafür und für Deine Hilfe, die Du mir immer weider zukommen lässt.

Zum Thema: werd Deinen Tipp gleich mal umzusetzen versuchen, bin mir aber noch nicht ganz sicher, ob das in diesem Fall zieht, bzw. wie ich es konstruieren muss. Weil nämlich u.U. sehr viele nicht mehr sinnvolle Wechsel zu aufrufenden Makros durchlaufen werden, aber mal schauen.

Wenn Du (so spät noch) magst, könnt ich Dir die Datei auch hochladen, Du würdest das vielleicht schneller durchschauen. Aber gib mir bitte vorher Bescheid, will Dir das ja nicht aufdrücken.

Vielen Dank auf jeden Fall schon mal und Grüße
Franz
Anzeige
AW: So macht man das...
08.12.2003 02:13:44
PeterW
Hallo Franz,

bleib mir weg mit Dateien, in deren Struktur und Code ich mich erste einlesen muss. :-)

Vielleicht ein kleines Beispiel: der Code "unterroutine" wird gestartet, ruft "unter" auf und liefert in "unterroutine" den (geänderten) boolschen Wert.

Sub unterroutine()
Dim bTest As Boolean
bTest = True
MsgBox bTest
Call unter(bTest)
MsgBox bTest
End Sub



Sub unter(bTest As Boolean)
bTest = Not (bTest)
End Sub


Gruß
Peter
Anzeige
Dacht ich's mir doch :-)))
08.12.2003 02:33:12
Franz W.
Hallo Peter,

schon klar, drum hab ich sie auch nicht gleich mit geschickt. Wollte nur umgehen, das Problem schildern zu müssen, weil mir nicht ganz klar war, wie ichs sagen soll. Aber ich versuche es (und wenn DU Dir das jetzt nicht mehr reinziehen magst, ist auch okay! Hab ich vollste Verständnis dafür!!):

Hab eine UF, die ich mit einem einzigen Makro lade, und mit demselben Makro - je nach gedrücktem Button - so oder anders auswerte und wieder schließe (es handelt sich um Datensätze: ein Datensatz wird ausgewählt und die UF dann mit den dazugehörigen Daten geöffnet).

In der UF hab ich auch noch 2 Buttons, mit denen ich im Blatt einen Datensatz weiter vor oder zurück wandern kann, dazu müssen natürlich die Einträge in der UF angepasst werden. Also lasse ich von Button "Nächster Datensatz" die UF schließen, eine Zeile nach unten springen und die UF wieder öffnen. Dazu wird wieder obiges Makro aufgerufen. Wenn ich jetzt 20 Mal die Tasten "Voriger" oder "Nächster" drücke, wird immer wieder das obige Makro aufgerufen, ohne beendet zu werden. Wenn ich jetzt die UF schließe - per Abbrechen oder per Ok - wird der Rest des obigen Makros abgearbeitet, und jedesmal am Ende wird eines der beiden Makros "Voriger" oder "Nächster" gerufen, nur um noch "End Sub" zu sagen. Und so geht es dann 20 Mal hin und her.

Und mit einer Booleschen Variablen läuft das doch genau so, oder täusch ich mich da? Es wird immer das aufrufende Makro wieder gerufen, die Boolesche Variable ausgewertet, und dann wieder und dann wieder...

Und darum erschien es mir am einfachsten, alles Prozeduren auf einmal beenden zu können. Aber ich werde wohl das ganze Konstrukt ein wenig abändern müssen. Eine Sofortlösung hab ich inzwischen gefunden: Das Makro, das die UF aufruft, beende ich nach dem Aufruf der UF. Die Auswertung der Eingaben und das Schließen der UF schreibe ich in ein anderes Makro, das ich getrennt aufrufen kann. Damit ist der wichtigste Teil meines Problems gelöst. Und den Rest werde ich auch noch kriegen.

Vielen Dank auf jeden Fall für Deine Hilfe, beste Grüße (und gute Nacht(?))
Franz
Anzeige
AW: Dacht ich's mir doch :-)))
08.12.2003 03:12:08
PeterW
Hallo Franz,

habe gelesen aber nicht verstanden. :-)

Warum schließt du das Userform um einen neuen Datensatz anzeigen zu lassen?? Und warum lädst du das Userform und willst es im gleichen Code auswerten?? Mach das doch Schritt für Schritt: lade das Userform, lies Werte ein, lies in bestimmte Steuerelemente des UF andere Werte ein, verlass das UF und verarbeite dabei die aktuellen Werte des UF in der Tabelle.

Nochmal: gaaanz ruhig, Schritt für Schritt - im Bedarfsfall viiiile Unterroutinen - und jede einzelne sauber beenden.

Und Schritt für Schritt solltest du auch an Detailprobleme rangehen: eine Listbox kann man mit dem Userform_Inizialize Ereignis ebenso füllen wie mit dem Listbox_Change.

Hoffentlich war die Botschaft klar: wenn alles in einem Code (einer Sub) läuft machst du dir das Leben unnötig schwer.

Apropos schwer - so fühl ich mich im Moment und verlasse diesen Ort. :-)
Gruß
Peter
Anzeige
AW: Dacht ich's mir doch :-)))
08.12.2003 03:32:33
Franz W.
Hallo Peter,

" Hoffentlich war die Botschaft klar: wenn alles in einem Code (einer Sub) läuft machst du dir das Leben unnötig schwer. "

Oh wie recht Du hast, so langsam kapier ich das auch, mittlerweile mach ich das auch nicht mehr so. Aber am Anfang hab ich halt nacheinander hingeschrieben, was zu tun war, und dann stand eben alles in einem einzigen Makro. Und mit sowas hab ich's jetzt zu tun. Das Problem, weswegen ich diesen Thread ursprünglich aufgemacht habe, ist auch inzwischen durch Zerlegen eines Makros in mehrere Teile gelöst.

Das mit Laden und Neuladen werde ich auch noch Ändern, aber dazu muss ich einiges umschreiben. Und darum behelfe ich mir erstmal damit.

Aber so ein Tritt ab und zu kann sehr hilfreich sein.

Nochmal Danke und Gute Nacht
Franz
Anzeige
AW: Dacht ich's mir doch :-)))
08.12.2003 06:46:20
Hajo_Zi
Hallo Franz

ich habe jetzt nicht alle Beiträge gelesen. Die brutalste Methode zum Abbruch von Makros ist "End". Damit wird alles beendet.

Bitte keine Mail, Probleme sollten im Forum gelöst werden.

Microsoft MVP für Excel

Das Forum lebt auch von den Rückmeldungen.
Betriebssystem XP Pro und Excel Version XP Pro


Anzeige
AW: Dacht ich's mir doch :-)))
08.12.2003 07:59:51
Franz W.
Guten Morgen Hajo,

schön, von Dir auch wieder zu hören bzw. sehen. Vielen Dank für den Tipp. Aber wenn Du es schon "brutalst" nennst, sollte "End" doch wohl besser vermieden und das so Ganze umgeschrieben werden, dass man ohne das auskommt.

Vielen Dank und Grüße
Franz
AW: Dacht ich's mir doch :-)))
10.12.2003 21:06:28
Franz W
Hallo Hajo,

das "End" war mir zunächst eine große Hilfe, um mir aus meiner "größten Verzweiflung" rauszuhelfen. Aber inzwischen ist es mir gelungen alles so umzuschreiben, dass ich ohne das auskomme (siehe meine Antwort an PeterW von heute abend, wenn Du Lust hast).

Trotzdem vielen Dank und beste Grüße
Franz
Anzeige
Danke mal wieder für den Schuhlöffel ;-))
10.12.2003 21:03:31
Franz W.
Hallo Peter,

vielen Dank für die Tipps (Tritte?!? :-))), falls Du hier unten noch mal reinschaust.

Hab glaub ich inzwischen alles umgesetzt, bin mehrmals gescheitert, hab mehrmals wieder vonvorne angefangen, aber jetzt klappts: u.a. drei längere Routinen in acht kleine zerlegt, zweimal eine Boolesche Variable rein um Fehler zu vermeiden... Komme u.a. jetzt aus, ohne die UF immer wieder zu schließen und dann gleich wieder zu öffnen, geht jetzt alles bei geöffneter UF, bis alles fertig ist.

War also ein sehr konstruktiver Abend, der Montag, und dank Deiner Anregungen hab ich mich an das Entscheidende rangetraut. Ganz nüchtern ohne jetzt abzuschmalzen, Du hast neben anderen entscheidenden Anteil daran, dass ich da bin, wo ich jetzt bin!! Aber vor allem kam von Dir schon mehr als ein Mal so eine Initialzündung, wie die vom Montag. Und dafür mal wieder ein herzliches Dankeschön.

Schönen Abend ung beste Grüße
Franz
Anzeige
AW: Danke mal wieder für den Schuhlöffel ;-))
10.12.2003 22:53:23
PeterW
Hallo Franz,

natürlich lese ich auch "hier unten" noch - zumindest die Threads, in denen ich geschrieben hatte (für mehr reicht meine Zeit nicht).

Den größten Anteil an deinen Fortschritten hast du selbst: du liest, probierst, scheiterst und findest dann doch eine Lösung. Da mcht es wirklich Spaß, Anregungen zu geben; und natürlich auch, weil es immer eine Rückmeldung (und diesmal sogar eine sehr nette) von dir gibt.

Gruß
Peter
Anzeige
;
Anzeige

Infobox / Tutorial

Exit Sub in Excel VBA: So steigerst du deine Effizienz


Schritt-für-Schritt-Anleitung

  1. Verwendung von Exit Sub

    • Der Befehl Exit Sub wird verwendet, um aus einer Sub-Prozedur vorzeitig auszutreten. Dies ist nützlich, wenn bestimmte Bedingungen erfüllt sind und der restliche Code nicht mehr ausgeführt werden soll.
      Sub Beispiel()
      If SomeCondition Then
         Exit Sub
      End If
      ' weiterer Code
      End Sub
  2. Boolesche Variable zur Kontrolle

    • Du kannst eine boolesche Variable an eine aufgerufene Sub übergeben, um die Ausführung der aufrufenden Prozedur zu steuern.
      
      Sub Hauptprozedur()
      Dim bTest As Boolean
      bTest = True
      Call Unterprozedur(bTest)
      If bTest = False Then
         Exit Sub
      End If
      End Sub

    Sub Unterprozedur(ByRef bTest As Boolean) bTest = False End Sub

  3. Beenden aller aufrufenden Makros

    • Es gibt keinen direkten Befehl in Excel VBA, um alle aufrufenden Makros mit einem einzigen Befehl zu beenden. Du kannst jedoch die Logik deiner Prozeduren umstrukturieren, um dies zu erreichen.

Häufige Fehler und Lösungen

  • Problem: Exit Sub funktioniert nicht wie gewünscht.

    • Lösung: Stelle sicher, dass Exit Sub an der richtigen Stelle platziert ist, und überprüfe, ob es keine nachfolgenden Befehle gibt, die ausgeführt werden, bevor Exit Sub erreicht wird.
  • Problem: Fehler beim Aufruf von Sub-Prozeduren.

    • Lösung: Vergewissere dich, dass die Sub- und Funktionsaufrufe korrekt sind und die Parameterübergabe passt.

Alternative Methoden

  • Verwendung von End

    • Obwohl die Verwendung von End die brutalste Methode ist, um ein Makro sofort zu beenden, sollte sie mit Vorsicht eingesetzt werden, da sie alle laufenden Prozesse stoppt.
      Sub BrutalBeenden()
      End
      End Sub
  • Fehlerbehandlung mit On Error

    • Mit On Error kannst du Fehler abfangen und steuern, wie das Programm reagieren soll, ohne dass es abrupt beendet wird.
      Sub Fehlerbehandlung()
      On Error GoTo Fehler
      ' Code
      Exit Sub
      Fehler:
      MsgBox "Ein Fehler ist aufgetreten."
      End Sub

Praktische Beispiele

  1. Beispiel mit UserForms

    • Wenn du ein UserForm hast, das durch einen Button geöffnet wird, kannst du den Aufruf so gestalten, dass das restliche Makro nicht ausgeführt wird, wenn das UserForm geschlossen wird.
      Sub ÖffneUserForm()
      UserForm1.Show
      If UserForm1.Tag = "Abbrechen" Then Exit Sub
      ' Weiterer Code
      End Sub
  2. Verwendung von Listenfeldern

    • Du kannst Listenfelder mit dem UserForm_Initialize-Ereignis initialisieren.
      Private Sub UserForm_Initialize()
      ListBox1.AddItem "Element 1"
      ListBox1.AddItem "Element 2"
      End Sub

Tipps für Profis

  • Saubere Strukturierung

    • Plane deine Makros im Voraus und strukturiere sie in kleinere, gut benannte Sub-Prozeduren. Das erleichtert die Wartung und das Testen.
  • Vermeide zu viele Aufrufe

    • Zu viele verschachtelte Aufrufe von Sub-Prozeduren können die Nachvollziehbarkeit erschweren. Halte die Anzahl der verschachtelten Aufrufe minimal.

FAQ: Häufige Fragen

1. Was ist der Unterschied zwischen Exit Sub und End? Exit Sub beendet lediglich die aktuelle Sub-Prozedur, während End alle laufenden Makros sofort stoppt.

2. Kann ich Exit Sub in einer Fehlerbehandlung verwenden? Ja, du kannst Exit Sub innerhalb einer Fehlerbehandlung verwenden, um die Ausführung der Sub-Prozedur bei einem Fehler zu beenden.

3. Wie kann ich sicherstellen, dass alle Variablen richtig übergeben werden? Verwende ByRef oder ByVal bei der Parameterübergabe in deinen Sub-Prozeduren, um sicherzustellen, dass die Variablen wie gewünscht übergeben werden.

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