Vorgabewerte in UserForms zur Laufzeit ändern |
|
|||||||||||||||||||||
(Fast) Jedes Steuerelement eines UserForms (Benutzerformular) lässt sicht mit einem Vorgabewert belegen. Dies kann in Textfeldern (TextBox) ein vorgegebener Text sein, in Bezeichnungsfeldern (Label) der Beschriftungstext oder in Kontrollkästchen (CheckBox) die Markierung. Diese Werte lassen sich nur dann ändern, wenn Sie das UserForm beenden - und somit entladen - und im VBA-Editor die Werte anpassen. Wichtig ist aber dabei, dass das UserForm vollständig aus dem Speicher entfernt ist, da ansonsten der Zugriff auf die Eigenschaften und Einstellungen des UserForms gesperrt sind.
Möchte man jedoch trotzdem bestimmte Vorgabewerte eines UserForms für den nächsten Aufruf ändern, so muss man oben genannten
einhalten, aber gleichzeitig dafür sorgen, dass per VBA-Code der Vorgabewert geändert und das UserForm wieder gestartet (angezeigt)
wird.
Finden und Beenden des UserForms
Mit Hilfe der UserForms-Auflistung und der Eigenschaften/Methoden des UserForms-Objektes wird zuerst geprüft
ob überhaupt UserForms geladen sind. Ist dies der Fall wird übrprüft, ob der Name des zu ändernden UserForms dabei ist und dieses
ggf. mit dem Unload-Befehl das UserForm geschlossen und entladen. If VBA.UserForms.Count > 0 Then For Each oUF In VBA.UserForms If oUF.Name = sUFName Then Unload oUF bclose = True Exit For End If Next oUF ElseIf VBA.UserForms.Count = 0 Then bclose = False End If Ändern der Vorgabewerte
Nur für den Fall, dass das UserForm nicht geladen ist (bclose = True),
können die Vorgabewerte (und auch weiteren Eigenschaften des UserForms
oder seiner Controls) direkt geändert werden. In diesem Beispiel wird der Vorgabewert des Textfeldes txtVorgabe um einen Wert hochgezählt. Gleichzeitig werden dieser Vorgabewert im Bezeichnungsfeld lblVorgabewert angezeigt und mit dem Kontrollkästchen cbx1 angezeigt, ob der Vorgabewert gerade oder ungerade ist. Anschließend wird das UserForm mit den geänderten Werten wieder neu gestartet. Dim vbc As VBComponent Set vbc = VBE.ActiveVBProject.vbcomponents(sUFName) vbc.Designer.Controls("txtVorgabe").Value = vbc.Designer.Controls("txtVorgabe").Value + 1 vbc.Designer.Controls("lblVorgabewert").Caption = "Vorgabewert: " & vbc.Designer.Controls("txtVorgabe").Value If 0 = vbc.Designer.Controls("txtVorgabe").Value Mod 2 Then vbc.Designer.Controls("cbx1").Value = True Else vbc.Designer.Controls("cbx1").Value = False End If frmChangeUFValues.Show vbModeless Automatisches (Neu-)Aufrufen eines MakrosMit der OnTime-Methode lassen sich zeitversetzt Makros aufrufen. Dazu wird der Funktion
neben dem aufzurufenden Makro auch die Zeitdifferenz oder die Uhrzeit des Aufrufs mitgegeben. If bclose = True Then Application.OnTime When:=Now + TimeValue("00:00:00"), _ Name:="subCallUFOnTime" GoTo subCallUFOnTime_ende End If Zusammenspiel der Funktionen
Miteinander verknüpft läuft die Änderung so ab, dass das Makro subCallUFOnTime über die
OnTime-Methode solange aufgerufen wird, bis die Überprüfung der geladenen UserForms die zu
ändernde nicht mehr findet. Erst dann werden mit Zugriff auf das aktive VBProjekt und den Designer, in dem ja die Gestaltung
eines UserForms stattfindet, die Vorgaben der verschiedenen Controls geändert. Das Beispiel benötigt
Const sUFName As String = "frmChangeUFValues" Sub subCallUFOnTime() Dim oUF As Object Dim bclose As Boolean: bclose = False Dim bset As Boolean: bset = False If VBA.UserForms.Count > 0 Then For Each oUF In VBA.UserForms If oUF.Name = sUFName Then Unload oUF bclose = True Exit For End If Next oUF ElseIf VBA.UserForms.Count = 0 Then bclose = False End If If bclose = True Then Application.OnTime When:=Now + TimeValue("00:00:00"), _ Name:="subCallUFOnTime" GoTo subCallUFOnTime_ende End If Dim vbc As VBComponent Set vbc = VBE.ActiveVBProject.vbcomponents(sUFName) vbc.Designer.Controls("txtVorgabe").Value = vbc.Designer.Controls("txtVorgabe").Value + 1 vbc.Designer.Controls("lblVorgabewert").Caption = "Vorgabewert: " & vbc.Designer.Controls("txtVorgabe").Value If 0 = vbc.Designer.Controls("txtVorgabe").Value Mod 2 Then vbc.Designer.Controls("cbx1").Value = True Else vbc.Designer.Controls("cbx1").Value = False End If frmChangeUFValues.Show vbModeless subCallUFOnTime_ende: End Sub Wichtig: Microsoft Visual Basic for Applications Extensibility 5.3
gesetzt sein! |
www.chf-online.de/vba/vbachangepresetvalue.htm | © 2001-11 Christian Freßdorf (Zaphod-Systems) |