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

Forumthread: VBA globale Variable nach "End" gelöscht

VBA globale Variable nach "End" gelöscht
14.05.2020 17:18:47
W
Hallo Forum,
ich nutze verschiedene eigene Funktionen für bestimmte Dinge, will damit zum Ausdruck bringen, dass ich
mich zum Zeitpunkt x nicht unbedingt in der Funktion bzw der Sub befinde, die primär aufgerufen wurde.
Da die einzelnen Hilfsfunktionen teilweise vom Ergebnis einer weiteren Hilfsfunktion abhängig sind, und es schier unmöglich ist, das Auftreten eines Fehlers bis in die Ursprungs-Function/Sub zurückzumelden, beende ich die Makroausführung mit einem "End" in dem Code, in welchem der Fehler festgestellt wurde. Damit ist sichergestellt, dass nicht mit falschen Daten weitergearbeitet wird.
Mein aktuelles Problem dabei: In der Workbook_Open-Routine werden verschiedene globale Variable gesetzt. Nach einem Abbruch mit "End" sind diese Variablen alle nicht mehr gesetzt.
Wie kann ich dieses Problem lösen? Wer hat dazu eine Idee?
Gruß
W H21
Anzeige

14
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: VBA globale Variable nach "End" gelöscht
14.05.2020 17:41:45
onur
Microsoft:
END:
Beendet die Ausführung sofort. Wird nie für sich selbst benötigt, kann jedoch an einer beliebigen Stelle in einer Prozedur eingefügt werden, um die Codeausführung zu beenden, Dateien, die mit der Open -Anweisung geöffnet wurden, zu schließen und Variablen zu löschen.
Entweder, wenn möglich, die Werte im Code setzen, oder in irgend einer Zelle zwischenspeichern.
Oder natürlich "END" löschen.
Anzeige
AW: VBA globale Variable nach "End" gelöscht
14.05.2020 17:59:27
Rudi
Hallo,
&gt &gtbeende ich die Makroausführung mit einem "End" in dem Code, in welchem der Fehler festgestellt wurde. &lt &lt
Exit Sub statt End
Gruß
Rudi
AW: VBA globale Variable nach "End" gelöscht
14.05.2020 18:10:16
W
Hallo Rudi,
auch Dir herzlichen Dank für Deinen Vorschlag. Allerdings wird durch "Exit Sub" die Kontrolle an den aufrufenden Code zurückgegeben, der möglicherweise eine Antwort erwartet, die nicht gegeben wird. Die Folge: unabsehbar.
Bitte noch einmal meine Anfrage genau lesen.
Gruß
W H21
Anzeige
AW: VBA globale Variable nach "End" gelöscht
14.05.2020 18:07:49
W
Hallo onur,
Danke für Deine Antwort. "End" zu löschen kommt nicht in frage. Die Begründung steht in meiner Anfrage.
Workbook-Open ein 2. mal zu durchlaufen ist auch nicht die Lösung. Aber Dein Vorschlag, die Werte in einer Tabelle zu speichern, die gefällt mir. Muss mir jetzt nur noch einen passenden Platz dafür aussuchen.
Gruß
W H21
Anzeige
AW: VBA globale Variable nach "End" gelöscht
14.05.2020 18:10:50
Rudi
Hallo,
&gt&gtAber Dein Vorschlag, die Werte in einer Tabelle zu speichern&lt&lt
Alternativ kannst du die Werte auch in Namen speichern.
Gruß
Rudi
AW: VBA globale Variable nach "End" gelöscht
14.05.2020 18:12:19
W
Hallo Rudi,
was genau meinst du mit "Namen"?
Gruß
W H21
AW: VBA globale Variable nach "End" gelöscht
14.05.2020 18:18:36
Daniel
was bringts wenn die Werte in Tabellen oder Namen stehen?
dann sind sie immer noch nicht in den Variablen drin.
dh der Code zum Befüllen der Variablen muss troztdem ausgeführt werden, oder man muss den kompletten Quellcode so umschreiben, dass anstelle der globalen Variablen die Tabellenwerte oder Namen verwendet werden. Wird auf jedenfall umständlich, vorallem dann wenn die Globalen Variablen Objektvariablen sind.
dann wird aus der kurzen variable wsEingabe (bspw für das Worksheet mit dein Eingabefeldern) ein umständliches: Worksheets(Sheets("Variablen").Range("A1").Value)
scheint mir nicht sinnvoll.
Gruß Daniel
Anzeige
AW: VBA globale Variable nach "End" gelöscht
14.05.2020 18:34:37
W
Hallo Daniel,
ich möchte auch diese Antwort von Dir beantworten.
Im aktuellen Projekt geht es um eine Boolean-Variable und eine Integer-Variable, die nach "End" neu gesetzt werden müssen. Normalerweise werden sie in Workbook_Open gesetzt. Und im Normalfall gibt es nur eine Funktion, welche der Anwender per Klick aufruft. Dort müssten diese beiden Werte wieder auf den Stand gebracht werden, wie sie in Workbook-Open gesetzt wurden. Ich möchte aber nicht nochmals eine Stelle im Code haben, wo entschieden wird, wie diese beiden Variablen gesetzt werden sollen. Das soll ausschließlich in Workbook_Open geschehen.
Gruß
W H21
Anzeige
AW: VBA globale Variable nach "End" gelöscht
14.05.2020 18:46:39
Daniel
Hi
gibt's auch Eventmakros, die die diese Variablen verwenden?
wenn nein, würde ich die Zuweisung doch in dem Makro machen, welches der Anwender starten kann.
Wenn du die Zuweisung unbedingt im Workbook_Open-Eventmakro haben willst, dann kannst du auch, wenn die Variablen nochmal befüllt werden müssen, das Workbook_Open-Event von deinem Makro aus ausführen lassen.
dazu müsst du im Modul "DieseArbeitsmappe" das "Private Sub" in "Public Sub" abändern (auf die Event-funtktionalität hat das keinen Einfluss, solange du den Rest der Kopfzeile nicht änderst) und dann kannst du dieses Makro von jedem anderen Makro aus mit Call DieseArbeitsmappe.Workbook_Open ausführen lassen.
Gruß Daniel
Gruß Daniel
Anzeige
AW: VBA globale Variable nach "End" gelöscht
14.05.2020 19:34:21
Rudi
Hallo Daniel,
&gt&gtwas bringts wenn die Werte in Tabellen oder Namen stehen?&lt&lt
Man muss nur konsequent die Variablen durch die Zellen/ Namen ersetzen. ;-)
Gruß
Rudi
VBA globale Variable nach "End" gelöscht - gelöst
15.05.2020 07:44:29
W
Hallo an alle, die mir auf meine Frage geantwortet haben.
Ich habe das Problem in der Weise gelöst, dass ich in Workbook_Open die erforderlichen Daten in einer bereits vorhandenen Tabelle als nicht sichtbare Einträge an bisher ungenutzter Stelle bereitstelle. Wenn nun der Anwender mit einem "Klick" die Verarbeitung (wieder) startet, wird geprüft, ob die globalen Variablen (die durch "End" ggf. auf "Grundstellung" gebracht wurden) gesetzt waren. Wenn nein (also möglicherweise durch "End" gelöscht), wird in der oben genannten Tabelle geprüft, wie die Einstellungen durch Workbook_Open vorgenommen wurden, und die globalen Variablen werden entsprechend der gesicherten Informationen erneut gesetzt.
Ich möchte nochmals erwähnen, dass es sich in meinem Fall um eine Boolean- und um eine Integer-Variable handelt.
Wird die Tabelle geschlossen und erneut geöffnet, entscheidet nur Workbook_Open, wie die Variablen gesetzt werden, und hinterlegt die Informationen an dem dafür vorgesehenen Platz,
Das Verfahren ist bereits mehrfach getestet und funktioniert.
Nochmals "Danke" für alle Antworten.
Gruß
W H21
Anzeige
AW: VBA globale Variable nach "End" gelöscht
14.05.2020 18:34:10
onur
Ich persönlich mache das meistens so (fast das Selbe wie Daniels Vorschlag):
Eine Sub, die auch von Workbook_Open aufgerufen wird, (z.B. Sub DatenLesen) zum Beschreiben/Lesen der globalen Variablen inkl. eine Variable (boolean) Namens "eingelesen", die dort auf true gesetzt wird.
Und in allen Subs, wo diese Variablen benötigt werden, am Anfang der Sub:
If NOT eingelesen Then DatenLesen

Sin die Variablen durch (z.B.) ein "END" gelöscht worden, springt "eingelesen" automatisch auf FALSE.
Anzeige
AW: VBA globale Variable nach "End" gelöscht
14.05.2020 18:01:12
Daniel
Hi
die Idee von Onur mal etwas ausführlicher:
1. Lagere das setzen der Globalen Variablen in ein eigenes Makro aus
2. dieses Makro rufst du dann im Workbook-Open-Event Event auf, sowie am Anfang jedes Makros, welches der Anwender direkt ausführen kann.
sollte das ein aufwendiger Prozess sein, kannst du natürlich beispielhaft den Wert einer solchen Variable abfragen und daran entscheiden, ob das Befüllen ausgeführt werden muss oder nicht.
eine weitere alternative wäre, dass du eine zusätzliche globale Variable vom Typ boolean einfügst, welche anstelle von END im Code auf TRUE gesetzt wird. Diese fragst du dann an geeigneter Stelle ab und kannst das Makro mit Exit Sub verlassen.
Das erspart dir dann das Händling mit den Übergabeparametern.
Gruß Daniel
Anzeige
AW: VBA globale Variable nach "End" gelöscht
14.05.2020 18:25:18
W
Hallo Daniel,
auch Dir herzlichen Dank für Deine Vorschläge.
Deinen ersten Vorschlag muss ich mir noch genau überlegen und ihn gegen den Vorschlag mit dem Auslagern in einen Bereich in einer Tabelle abwägen. Was mich stört: grundlegende Einstellungen werden dann nicht mehr in Workbook_Open gemacht, sondern in einem anderen Code. Übersichtlicher wird die Angelegenheit dadurch nicht.
Der 2 Vorschlag ist nicht realisierbar. Nach jedem Aufruf einer der möglichen Funktionen müsste die globale Variable überprüft werden. Wenn man sich dabei eine Hierachie vorstellt, und die letzte Funktion in der Kette etwas aus dem Internet laden soll, dann müsste jeder der zwischengeschaltenen Funktionen die Variable prüfen und sofort seinen Code verlassen. Und wehe ...... Da ist End in meinen Augen die bessere Möglichkeit. Selbstverständlich sollte der Anwender vom Abbruch und ggf. der Ursache informiert werden. Und er kann den Prozess - ggf. nach Reparatur - erneut starten - und hoffen, dass es dann klappt.
Gruß
W H21
Anzeige

Forumthreads zu verwandten Themen

Anzeige
Anzeige
Anzeige
Anzeige

Infobox / Tutorial

VBA globale Variablen nach "End" erhalten


Schritt-für-Schritt-Anleitung

  1. Globale Variablen deklarieren: Stelle sicher, dass Du Deine globalen Variablen im richtigen Bereich deklarierst. Dies sollte in einem Modul geschehen, nicht in einer Sub oder Funktion. Beispiel:

    Public wsEingabe As Worksheet
    Public eingelesen As Boolean
  2. Workbook_Open verwenden: In der Workbook_Open-Prozedur kannst Du die globalen Variablen initialisieren:

    Private Sub Workbook_Open()
       Set wsEingabe = ThisWorkbook.Sheets("Eingabe")
       eingelesen = True
    End Sub
  3. Exit Sub anstelle von End verwenden: Um die Ausführung sicher zu beenden, kannst Du Exit Sub verwenden, anstatt End. Dies lässt die globalen Variablen unberührt. Beispiel:

    If Not eingelesen Then
       ' Fehlerbehandlung
       Exit Sub
    End If
  4. Werte speichern: Um die Werte Deiner globalen Variablen zu erhalten, kannst Du sie in einer Tabelle oder in benannten Bereichen speichern, bevor Du die Ausführung mit Exit Sub beendest.


Häufige Fehler und Lösungen

  • Fehler: Globale Variablen werden gelöscht: Dies geschieht oft, wenn End verwendet wird. Vermeide die Verwendung von End, da es die gesamte Ausführung stoppt und Variablen löscht. Nutze stattdessen Exit Sub.

  • Fehler: Unzureichende Rückmeldung nach Fehlern: Wenn Du Exit Sub verwendest, kannst Du sicherstellen, dass die aufrufende Funktion informierte Rückmeldungen erhält, ohne dass die Variablen verloren gehen.


Alternative Methoden

  • Verwendung von benannten Bereichen: Du kannst die Werte in benannten Zellen speichern und sie bei Bedarf abrufen. So bleibst Du flexibel und musst nicht die gesamte Struktur ändern.

  • Makros für Variablen setzen: Lagere das Setzen der globalen Variablen in eine separate Subroutine aus. So kannst Du diese Routine sowohl in Workbook_Open als auch an anderen Stellen im Code aufrufen:

    Public Sub SetzeGlobaleVariablen()
       Set wsEingabe = ThisWorkbook.Sheets("Eingabe")
       eingelesen = True
    End Sub

Praktische Beispiele

  1. Globale Variable einlesen:

    Sub DatenLesen()
       If Not eingelesen Then
           Set wsEingabe = ThisWorkbook.Sheets("Eingabe")
           eingelesen = True
       End If
    End Sub
  2. Verwendung in mehreren Subs:

    Sub BeispielSub1()
       If Not eingelesen Then DatenLesen
       ' Weiterer Code
    End Sub
    
    Sub BeispielSub2()
       If Not eingelesen Then DatenLesen
       ' Weiterer Code
    End Sub

Tipps für Profis

  • Verwende Public Variablen: Damit kannst Du sicherstellen, dass die Variablen über verschiedene Module hinweg zugänglich sind.

  • Fehlerprotokollierung: Implementiere ein Fehlerprotokoll, um zu dokumentieren, wann und wo Fehler auftreten. Dies kann helfen, die Kontrolle über die globalen Variablen zu behalten.

  • Überwache Variablen: Nutze Debugging-Tools in Excel VBA, um den Status Deiner Variablen während der Ausführung zu überwachen.


FAQ: Häufige Fragen

1. Warum werden meine globalen Variablen gelöscht? Die Verwendung von End stoppt die gesamte Ausführung des Codes und löscht alle Variablen. Verwende stattdessen Exit Sub.

2. Wie kann ich globale Variablen nach einem Fehler zurücksetzen? Speichere die notwendigen Werte in einer Tabelle oder in benannten Zellen, bevor Du die Ausführung mit Exit Sub beendest, und lade sie bei Bedarf erneut.

3. Kann ich globale Variablen in verschiedenen Modulen verwenden? Ja, wenn Du die Variablen mit Public deklarierst, sind sie in allen Modulen zugänglich.

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige