ich bin schon seit längerem einem merkwürdigem Phänomen auf der Spur, das selbst für mich einfach nicht greifbar ist. Und zwar will ich Text aus einer TextBox im Userform in eine globale öffentliche Variable übergeben. Das klappt auch. Allerdings möchte ich nach dem Schließen des Userforms durch Unload Me, mit den Werten der Variablen weiter arbeiten. Solange das das Userform aufrufende Makro läuft, kein Problem. Sobald aber End Sub ausgeführt wird, wird das Userform endgültig entladen und geht in den Entwurfsmodus über. Im Einzelschritt wird dann das Modul mit dem Userform im Designmodus aktiviert. Dadurch werden leider alle globalen Variablen zurückgesetzt, auch solche die ich zuvor direkt definiert habe. Falls jemand dieses Problem nachvollziehen möchte, hier ein Testcode.
In ein Userform1, das eine Textbox1 und einen Commandbuton1 enthält kommt dieser Code:
Code: Alles auswählen
Private Sub CommandButton1_Click()
Test1 = TextBox1.Text
setTest2 TextBox1.Value
Unload Me
End Sub
Code: Alles auswählen
Option Explicit
Public Test1 As String
Public Test2 As String
Static Sub Test()
Static Test3 As String
Debug.Print "Test1_ALt: " & Test1
Debug.Print "Test2_Alt: " & Test2
Debug.Print "Test3_Alt: " & Test3
Test2 = 1
UserForm1.Show
Test3 = "Dies ist Test3"
Debug.Print "Test1_Neu:" & Test1
Debug.Print "Test2_Neu:" & Test2
Debug.Print "Test3_Neu:" & Test3
End Sub
Public Sub setTest2(ByVal txt As String)
Test2 = txt
End Sub
Und jetzt kommt der Witz: In manchen Fällen klappt es doch. Ich habe hier zwei Dateien mit exakt dem gleichen Code und Aufbau. Bei der einen Datei geht's, bei der anderen nicht. Sehr rätselhaft. Aber ich glaube eine Lösung gefunden zu haben, für alle die sich mit dem gleichen Problem rumschlagen: Wenn man das Userform mit dem Schlüsselwort New einer Variablen zuweist und dann die Variable mit Show aufruft, scheint das Phänomen nicht aufzutreten und alles läuft wie geplant. Zumindest bislang.
Der Code im allgemeinen Modul muss also wie folgt geändert werden.
Code: Alles auswählen
Option Explicit
Dim frm As UserForm1
Public Test1 As String
Public Test2 As String
Static Sub Test()
Set frm = New UserForm1
Static Test3 As String
Debug.Print "Test1_ALt: " & Test1
Debug.Print "Test2_Alt: " & Test2
Debug.Print "Test3_Alt: " & Test3
Test2 = 1
frm.Show
Test3 = "Dies ist Test3"
Debug.Print "Test1_Neu:" & Test1
Debug.Print "Test2_Neu:" & Test2
Debug.Print "Test3_Neu:" & Test3
End Sub
Public Sub setTest2(ByVal txt As String)
Test2 = txt
End Sub
Und schon kann man seinen VBAsteleien weiter frönen.
Gruß Mr. K.