Unterschied UserForm.Initialize vs. UserForm.Activate
- thowe
- Beiträge: 196
- Registriert: 12. Sep 2022, 16:57
- Hat sich bedankt: 78 Mal
- Danksagung erhalten: 67 Mal
- Kontaktdaten:
Unterschied UserForm.Initialize vs. UserForm.Activate
Moin euch Allen!
Die Frage - siehe Betreff - wurde schon des öfteren gestellt.
Hier der Versuch mit einfachen Worten den Unterschied zu erklären
Das Initialereignis - UserForm1_Initialize() - findet nur einmal statt.
Nämlich wenn die UserForm in den Arbeitsspeicher geladen wird.
Dies ist mit dem ersten Aufruf der UserForm der Fall. Oft hängt dies mit dem Ereignis UserForm1.Show zusammen.
Muss es nicht. Auch Load UserForm1 löst das Initialize Event aus, oder wenn zuvor das "rote X " oder Unload Me verwendet wurde.
Ich denke mir, jetzt kommt das "Aha-Erlebnis".
Wenn das Me.Hide Ereignis verwendet wurde - somit die UserForm - nur - ausgeblendet wurde - wird das .Activate Ereignis ausgeführt.
.Activate Ereigniss kann/soll man verwendet wenn man Controls (zB. Textboxes, Labels) aktualisiert.
Quellen neben vielen zahlreichen:
https://excelmacromastery.com/vba-userf ... s_Activate
https://www.mrexcel.com/board/threads/f ... st-1035473
https://www.herber.de/forum/archiv/1092 ... ize.html#1
lg thowe
Die Frage - siehe Betreff - wurde schon des öfteren gestellt.
Hier der Versuch mit einfachen Worten den Unterschied zu erklären
Das Initialereignis - UserForm1_Initialize() - findet nur einmal statt.
Nämlich wenn die UserForm in den Arbeitsspeicher geladen wird.
Dies ist mit dem ersten Aufruf der UserForm der Fall. Oft hängt dies mit dem Ereignis UserForm1.Show zusammen.
Muss es nicht. Auch Load UserForm1 löst das Initialize Event aus, oder wenn zuvor das "rote X " oder Unload Me verwendet wurde.
Ich denke mir, jetzt kommt das "Aha-Erlebnis".
Wenn das Me.Hide Ereignis verwendet wurde - somit die UserForm - nur - ausgeblendet wurde - wird das .Activate Ereignis ausgeführt.
.Activate Ereigniss kann/soll man verwendet wenn man Controls (zB. Textboxes, Labels) aktualisiert.
Quellen neben vielen zahlreichen:
https://excelmacromastery.com/vba-userf ... s_Activate
https://www.mrexcel.com/board/threads/f ... st-1035473
https://www.herber.de/forum/archiv/1092 ... ize.html#1
lg thowe
- Folgende Benutzer bedankten sich beim Autor thowe für den Beitrag:
- d'r Bastler
- d'r Bastler
- Beiträge: 670
- Registriert: 29. Aug 2022, 13:20
- Hat sich bedankt: 175 Mal
- Danksagung erhalten: 90 Mal
Re: Unterschied UserForm.Initialize vs. UserForm.Activate
Moin thowe,
interessant, was Du da schreibst. Danke! Bisher hatte ich die Mechanik des Handlings von USFs so verstanden:
Achja - und dann gibt es da ja auch noch Userform_Terminate ...
lg
interessant, was Du da schreibst. Danke! Bisher hatte ich die Mechanik des Handlings von USFs so verstanden:
- Initialize entweder gemäß der Vorgaben in den Properties oder in der entsprechenden Sub
- Mit Hide/Show bleiben eventuell gesetzte Werte erhalten, bzw. werden nach Vorgaben der Initialize aktualisiert
- Unload/Load löscht aktuelle Eingaben und geht wieder durch Initialize
- Deactivate, ob der X oder Sub, bewirkt das Gleiche wie Unload, bietet direkte Optionen für weitere Prozeduren. Activate macht nichts anderes als Initialize
Achja - und dann gibt es da ja auch noch Userform_Terminate ...
lg
d'r Bastler von den VBAsteleien.de
Win 10 + Office 2019 & Win11 + Office 2021 + Visio 2019 pro & macOS.X15 + Office2019pro & Android12 & XL365
Win 10 + Office 2019 & Win11 + Office 2021 + Visio 2019 pro & macOS.X15 + Office2019pro & Android12 & XL365
-
- Beiträge: 30
- Registriert: 30. Mai 2024, 19:42
- Hat sich bedankt: 2 Mal
- Danksagung erhalten: 34 Mal
- Kontaktdaten:
Re: Unterschied UserForm.Initialize vs. UserForm.Activate
Hi ihr,
das ist schon richtig was Thowe da schreibt. Auch wenn es schwer in Worte zu fassen ist. Man muss den Unterschied am Beispiel selbst erkunden.
Bei Load Userform1 wird, wie bereits beschrieben, das Initialize-Rreignis ausgeführt. Das Userform wird geladen aber noch nicht angezeigt.
Mit .Show holt man es dann in den Vordergrund und führt das Activate-Ereignis aus. Allerdings ist .Show so schlau bei einem noch nicht geladenen Userform den Load nachzuholen. Dann wird Initialize und Activate direkt nacheinander ausgeführt.
Activate is ein Ereignis das immer dann ausgeführt wird, wenn ein Fenster (in dem Fall das Userform) in den Vordergrund geholt und zur Eingabe bereit gemacht wird. Bei einem modeless Userform kann man nebenbei in Excel andere Eingaben machen. Springt man dann zum Userform zurück wird das Activate-Ereignis erneut ausgeführt. Übrigens: Auch Worksheets haben ein Activate-Ereignis, wobei ich mir noch nicht sicher bin, ob es sich dabei auch um Fenster handelt.
Mit .Hide wird das Userform nur versteckt bleibt aber gültig und noch geladen und kann mit .Show erneut angezeigt werden. Das Terminate-Ereignis wird ausgeführt bevor das Userform aus dem Speicher entladen wird. meisten beim Schließen oder Ausführen des Befehls Unload Userform1 bzw. Unload Me.
Übrigens: Me ist so ein tolles Wort. Das kann in jedem Klassenobjekt verwendet werden. Auch in Worksheets. Es bezieht sich immer auf die Klasse in der es sich befindet und gibt das entsprechende Objekt zurück. Aber das ist ein anderes Thema zu dem ich gerne mehr schreibe.
Gruß Mr. K.
das ist schon richtig was Thowe da schreibt. Auch wenn es schwer in Worte zu fassen ist. Man muss den Unterschied am Beispiel selbst erkunden.
Bei Load Userform1 wird, wie bereits beschrieben, das Initialize-Rreignis ausgeführt. Das Userform wird geladen aber noch nicht angezeigt.
Mit .Show holt man es dann in den Vordergrund und führt das Activate-Ereignis aus. Allerdings ist .Show so schlau bei einem noch nicht geladenen Userform den Load nachzuholen. Dann wird Initialize und Activate direkt nacheinander ausgeführt.
Activate is ein Ereignis das immer dann ausgeführt wird, wenn ein Fenster (in dem Fall das Userform) in den Vordergrund geholt und zur Eingabe bereit gemacht wird. Bei einem modeless Userform kann man nebenbei in Excel andere Eingaben machen. Springt man dann zum Userform zurück wird das Activate-Ereignis erneut ausgeführt. Übrigens: Auch Worksheets haben ein Activate-Ereignis, wobei ich mir noch nicht sicher bin, ob es sich dabei auch um Fenster handelt.
Mit .Hide wird das Userform nur versteckt bleibt aber gültig und noch geladen und kann mit .Show erneut angezeigt werden. Das Terminate-Ereignis wird ausgeführt bevor das Userform aus dem Speicher entladen wird. meisten beim Schließen oder Ausführen des Befehls Unload Userform1 bzw. Unload Me.
Übrigens: Me ist so ein tolles Wort. Das kann in jedem Klassenobjekt verwendet werden. Auch in Worksheets. Es bezieht sich immer auf die Klasse in der es sich befindet und gibt das entsprechende Objekt zurück. Aber das ist ein anderes Thema zu dem ich gerne mehr schreibe.
Gruß Mr. K.
- Folgende Benutzer bedankten sich beim Autor xlKing für den Beitrag:
- d'r Bastler
- thowe
- Beiträge: 196
- Registriert: 12. Sep 2022, 16:57
- Hat sich bedankt: 78 Mal
- Danksagung erhalten: 67 Mal
- Kontaktdaten:
Re: Unterschied UserForm.Initialize vs. UserForm.Activate
Hallo xlKing,
danke für dein - bessere - Ausführung dazu...
Richtig Me ist ein "Zauberwort" gilt auch für Workbook...., zum Beispiel:
danke für dein - bessere - Ausführung dazu...
Richtig Me ist ein "Zauberwort" gilt auch für Workbook...., zum Beispiel:
Code: Alles auswählen
With Me
.Worksheets ... zB PageSettings....
End with
- d'r Bastler
- Beiträge: 670
- Registriert: 29. Aug 2022, 13:20
- Hat sich bedankt: 175 Mal
- Danksagung erhalten: 90 Mal
Re: Unterschied UserForm.Initialize vs. UserForm.Activate
Moin, ihr Zwei,
@ Mr.K. Deine Erklärungen grenzen in ihrer Qualität an ein Tutorial! Der Hinweis auf mode/less war dabei für mich das Zauberwort bezüglich activate Viiielen Dank!
Überraschend ist für mich Eure Einigkeit bezüglich Me und oute mich mal andere Meinung. Hier meine Ideen zu diesem Stichwort:
Me hilft (ähnlich wie beim Aufruf einer Sub in einem allg. Modul) um IntelliSense zu nutzen. Daher benutze ich es gerne (auch in Klassen, in denen es eigentlich nicht nötig ist), um während des Coding / Debugging schnell auf die Gültigkeit von z.B. Controls, Eigenschaften, das Vorhandensein von Prozeduren, etc. zu prüfen. Oft konnte ich so z.B. Typos in Control-Namen ausfindig machen. Ein With Me verwende ich allerdings nirgends.
Die Idee Me auch auf Diese Arbeitsmappe anzuwenden, hat mich neugierig gemacht, in der Hoffnung, damit manche For ...Each durch die Sheets vereinfachen zu können.
Test1 funktioniert, Test2 (obwohl im IntelliSense verfügbar) schon leider nicht (Anwendungs/Objektfehler). Das war dann wohl leider nix ... also doch wieder:
Wie oft weiß ich nicht, aber ich habe in Foren schon sehr häufig den Hinweis gelesen, dass Me in Code, der innerhalb einer Klasse agiert und nur auf deren Controls zugreift eigentlich unnötig ist. Daher habe ich es mir entsprechend abgewöhnt (bin halt 'ne Schreib-faule Sau ) und lösche es nach einem geschafften Milestone auch einfach komplett aus dem Code. Eine bisher problemlos nutzbare Praxis.
I'll keep on learning !
lg
@ Mr.K. Deine Erklärungen grenzen in ihrer Qualität an ein Tutorial! Der Hinweis auf mode/less war dabei für mich das Zauberwort bezüglich activate Viiielen Dank!
Überraschend ist für mich Eure Einigkeit bezüglich Me und oute mich mal andere Meinung. Hier meine Ideen zu diesem Stichwort:
Me hilft (ähnlich wie beim Aufruf einer Sub in einem allg. Modul) um IntelliSense zu nutzen. Daher benutze ich es gerne (auch in Klassen, in denen es eigentlich nicht nötig ist), um während des Coding / Debugging schnell auf die Gültigkeit von z.B. Controls, Eigenschaften, das Vorhandensein von Prozeduren, etc. zu prüfen. Oft konnte ich so z.B. Typos in Control-Namen ausfindig machen. Ein With Me verwende ich allerdings nirgends.
Die Idee Me auch auf Diese Arbeitsmappe anzuwenden, hat mich neugierig gemacht, in der Hoffnung, damit manche For ...Each durch die Sheets vereinfachen zu können.
Code: Alles auswählen
Sub test1()
With Me.Sheets
MsgBox .Count
End With
End Sub
Sub test2()
With Me.Sheets
.Visible = True
End With
End Sub
Code: Alles auswählen
Sub test3()
Dim sht As Object
For Each sht In ThisWorkbook.Sheets
If sht.Visible = False Then
sht.Visible = True
End If
Next
End Sub
I'll keep on learning !
lg
d'r Bastler von den VBAsteleien.de
Win 10 + Office 2019 & Win11 + Office 2021 + Visio 2019 pro & macOS.X15 + Office2019pro & Android12 & XL365
Win 10 + Office 2019 & Win11 + Office 2021 + Visio 2019 pro & macOS.X15 + Office2019pro & Android12 & XL365
-
- Beiträge: 30
- Registriert: 30. Mai 2024, 19:42
- Hat sich bedankt: 2 Mal
- Danksagung erhalten: 34 Mal
- Kontaktdaten:
Re: Unterschied UserForm.Initialize vs. UserForm.Activate
Hallo heb,
Das stimmt schon irgendwie. In den allermeisten Fällen ist Me unnötig kann aber eine Hilfe sein um, wie du bereits festgestellt hast, das Intelli-Sense zu aktivieren und die Eigenschaften und Methoden des Moduls in dem Me steht anzuzeigen. Wenn du diese Eigenschaften und Methoden bereits aus dem FF kennst, brauchst du kein Me.
Ich benutze Me aber am meisten bei benutzerdefinierten Klassenobjekten um ein übergeordnetes Objekt an die Parent-Eigenschaft eines Untergeordneten Objekts zu übergeben. So kann ich mehrere Kaskaden von benutzerdefinierten Auflistungsobjekten anlegen und weiß immer zu welchem Elternteil ein Benutzerobjekt gehört.
Manchmal ist Me auch nützlich um bei gleichen Variablennamen auf die richtige Variable zuzugreifen. Wenn du z.B. einen Parameter xyz hast der in einer Sub übergeben wird, und zufällig auch eine Eigenschaft im Modul mit diesen Namen existiert (Sollte möglichst nicht vorkommen, weil das von schlechter Programmierung zeugt, lässt sich aber manchmal nicht vermeiden) kann man mit Me auf diese Moduleigene Variable/Eigenschaft zugreifen. Standardmäßig würde VBA sonst den Parameter überschreiben und die Variable/Eigenschaft im Modulkopf bleibt leer.
In diesem Beispiel funkioniert alles weil Name aus dem Parameter und nicht von der Eigenschaft geholt wird:
Will man jedoch z.B. vor dem Zuweisen des Namens den vorherigen Namen anzeigen kann man natürlich auf die Variable iName zurückgreifen. Im Beispiel will ich aber die Eigenschaft des Objekts bemühen. Grund in der Eigenschaft könnte zusätzlicher Code stehen der auch mit ausgeführt werden soll.
Gruß Mr. K.
Das stimmt schon irgendwie. In den allermeisten Fällen ist Me unnötig kann aber eine Hilfe sein um, wie du bereits festgestellt hast, das Intelli-Sense zu aktivieren und die Eigenschaften und Methoden des Moduls in dem Me steht anzuzeigen. Wenn du diese Eigenschaften und Methoden bereits aus dem FF kennst, brauchst du kein Me.
Ich benutze Me aber am meisten bei benutzerdefinierten Klassenobjekten um ein übergeordnetes Objekt an die Parent-Eigenschaft eines Untergeordneten Objekts zu übergeben. So kann ich mehrere Kaskaden von benutzerdefinierten Auflistungsobjekten anlegen und weiß immer zu welchem Elternteil ein Benutzerobjekt gehört.
Manchmal ist Me auch nützlich um bei gleichen Variablennamen auf die richtige Variable zuzugreifen. Wenn du z.B. einen Parameter xyz hast der in einer Sub übergeben wird, und zufällig auch eine Eigenschaft im Modul mit diesen Namen existiert (Sollte möglichst nicht vorkommen, weil das von schlechter Programmierung zeugt, lässt sich aber manchmal nicht vermeiden) kann man mit Me auf diese Moduleigene Variable/Eigenschaft zugreifen. Standardmäßig würde VBA sonst den Parameter überschreiben und die Variable/Eigenschaft im Modulkopf bleibt leer.
In diesem Beispiel funkioniert alles weil Name aus dem Parameter und nicht von der Eigenschaft geholt wird:
Code: Alles auswählen
'ein Normales Modul
Sub test()
Dim x As Klasse1
Set x = New Klasse1
x.Name_zuweisen "Peter"
MsgBox x.Name
End Sub
Code: Alles auswählen
'ein Klassenmodul mit Namen Klasse1
Dim iName As String
Public Property Get Name() As String
Name = iName
End Property
Friend Sub Name_zuweisen(Name As String)
iName = Name
End Sub
Code: Alles auswählen
'ein Normales Modul
Sub test()
Dim x As Klasse1
Set x = New Klasse1
x.Name_zuweisen "Peter"
x.Name_zuweisen "Klaus"
MsgBox x.Name
End Sub
Code: Alles auswählen
'ein Klassenmodul mit Namen Klasse1
Dim iName As String
Public Property Get Name() As String
'... zusätzlicher Code ...
Name = iName
End Property
Friend Sub Name_zuweisen(Name As String)
Debug.Print Me.Name
iName = Name
End Sub
Wer ist online?
Mitglieder in diesem Forum: 0 Mitglieder und 0 Gäste