Clever-Excel-Forum

Normale Version: Lebensdauer von Variablen
Du siehst gerade eine vereinfachte Darstellung unserer Inhalte. Normale Ansicht mit richtiger Formatierung.
Seiten: 1 2
Hallo wertes Forum,

ich verzweifel gerade an einem Problem mit der Lebensdauer von Variablen. Leider finde ich auch keine für Nicht-Informatiker verständliche vollständige Erklärung...

Ich möchte eine Variable deklarieren, die in einem Modul in mehreren Prozeduren verwendet wird. Zusätzlich brauche ich sie in einem Userform.
Wie und wo deklariere ich sie am Besten und wie bekomme ich sie zu Beginn des meines Makros sicher leer?
Aktuell habe ich Sie im Kopf des Moduls als Public deklariert, dadurch ist sie aber nicht immer zu Beginn des Makros leer, sondern behält manchmal ihren Wert (der dann ungewollt ein Feld im Userform vorbelegt).

Vielen Dank,
Lutz
Hi,

zu Beginn des Makros leeren.
Hallöchen,

1)
warum füllst Du im Userform ein Feld mit dem Inhalt einer Variable, wenn es leer bleiben soll?

2)
was soll denn da mit der Variable alles im UF passieren? Willst Du die dort nur über das besagte Feld mit neuem Inhalt versehen oder brauchst Du den alten Inhalt noch für irgend was?
Hallo,

die Variablen werden im UF gefüllt und sind zuerst leer. Anschließend werden sie für eine SAP-Abfrage verwendet.
Sollte bei der SAP-Abfrage ein Fehler auftreten, öffne ich das UF erneut zur Prüfung auf den Fehler und möchte die Textboxen mit den letzten Eingaben füllen.

Aufgrund des erneuten Öffnens des UF habe ich folgenden Code als Teil im Initalize:
Code:
Private Sub UserForm_Initialize()

txtboxBenMat.SetFocus

If lngBenMat > 0 Then
    txtboxBenMat.Value = lngBenMat
    With txtboxBenMat
        .SetFocus
        .SelStart = 0
        .SelLength = Len(.Text)
    End With
End If
If lngAbgehMat > 0 Then
    With txtboxAbgehMat
        .Value = lngAbgehMat
        .Enabled = False
        .ForeColor = RGB(128, 128, 128)
    End With
End If
Eigentlich soll er nur beim erneuten Aufruf des UF die Textboxen füllen, beim ersten Aufruf sollen sie leer bleiben.
Dummerweise ist lngBenMat als Public deklariert, damit nicht sicher zu Beginn des Makros leer und ich bekomme ab und zu beim Start des Makros die Werte des letzten Durchlaufs schon beim ersten Öffnen des UF angezeigt.

Oder gibt es eine andere Möglichkeit ein UF ein zweites Mal einzublenden und nur für diesen speziellen Fall Textboxen zu deaktivieren und den Text grau zu färben?
Bisher nutze ich beim Verlassen des UF immer "Unload me".

Gruß,
Lutz
Hallo

im Makro, wo sie sicher gelöscht sein soll leeren, oder in dem Makro noch mal am Anfang mit Dim deklarieren. Dann ist sie leer!

mfg Gast 123
Hallöchen,

Zitat:Dummerweise ist lngBenMat als Public deklariert

Zitat:Sollte bei der SAP-Abfrage ein Fehler auftreten, öffne ich das UF erneut zur Prüfung auf den Fehler und möchte die Textboxen mit den letzten Eingaben füllen.

So, jetzt wäre die Frage, wie Excel unterscheiden soll und kann, ob es sich um eine Ersteingabe oder eine Korrektureingabe handelt.

1)
Du startest das UF z.B. über einen Button. Eine erforderliche Korrektur wird in einem Makro erkannt und das Makro startet die UF
--> dann kannst Du eine zusätzliche, z.B. boolsche Variable nutzen. Wenn Du den Button drückst, wird sie auf false gesetzt und wenn das Makro das UF aufruft, auf True. Dann kannst Du die im UF_Ini.. prüfen und davon abhängig die Textbox füllen oder nicht

2)
Du startest das UF z.B. immer über einen Button.
--> dann die Variable siehe 1) Du programmierst aber im Buttoncode eine Abfrage (MsgBox) Ersteingabe oder Korrektur und setzt in Abhängigkeit davon die Variable...

3)
Das UF soll nur beim ersten Aufruf eine Ersteingabe sein, alles andere sind korrekturen
--> dann setze die Variable im UF. Falls es OK und Abbrechen gibt - wäre ja auch über X möglich, dann setzte die Variable im Code des OK-Buttons

4)
...
...
Hallo zusammen,

vielen Dank für Eure Hilfe.

Ich werde mich morgen mal ans Testen machen.

Gruß,
Lutz
Hallo zusammen,

nochmals vielen Dank für Eure Hilfe.
Ich habe jetzt ein wenig rumprobiert und es läuft wie es laufen soll.

@snb, dein Link war wie so häufig sehr hilfreich. Leider fehlt genau das, was ich benötigt habe: Welcher Typ von Variablen-Deklaration bleibt wir lange erhalten?

@André, Möglichkeit 3 fand ich für's erste am Besten, habe sie aber nicht zum Laufen bekommen.
Nach dem OK-Button leere ich das UF mit Unload Me. Dann wird es beim nächsten Initalize wieder leer geöffnet. Damit sind die Zuweisungen der Variablen zu den Textboxen weg.

Habe dann die Möglichkeit 1 umgesetzt. Dabei muss natürlich die Boolsche Variable ebenfalls als Public deklariert sein und zu Beginn auf False gesetzt werden. Eine lokale Deklaration führt dazu, dass sie bei jedem Aufruf des UF wieder auf False gesetzt wird (was ja genau nicht sein soll). Ein Globale Deklaration ohne Setzen auf False bringt dasselbe Problem wie ursprünglich, die Variable ist zu Beginn des Makros nicht sicher auf False gesetzt.

Gruß,
Lutz
Es gibt kein 'Lebensdauer' von Variablen.
Die Frage ist nur 'wo' statt 'wie lange'

Wenn man in einem Prozedur (makro, Function) arbeitet sind lokale Varaiablen gelöscht wenn die Prozedur beendet ist.

Wenn ein variable deklariert ist am Anfang eines Arbeitsmappemoduls, Arbeitsblattmodusl, Userformmuduils, Classmoduls oder Makromoduls, steht die Wert eines solchen Private Variable zur Verfügung aller Prozeduren (Makros, Function) in diesem Modul.
Macht man mit "Dim x' oder 'Private x'

Ein Public Varaibele kann man nur deklarieren am Anfang eines Makromoduls. 'Public x'
Die Wert steht dan zur Verfügung für alle Prozeduren (Makros, Function) im ganzes Atbeitsblatt (= VBProject).
Wenn die Arbeitsmappe (VBProject) beendet wird, sind alle Variablen 'verschwunden'.

Wenn ein Userform beendet wird (Unload Me) sind alle controls leer.
Wenn du die Werte der Controls behalten willst kannst du 'Hide' benützern.
Im Gegensatz zu übrige Modulen kan ein Userform im Arbeitsspeicher gelöscht ('unloaded') werden. Deswegen die _Initialize Prozedur.
Seiten: 1 2