Aktuelle Seite:
/vba/vbachangepresetvalue.htm
Letzte Änderung: 13.07.2006

Getestet unter Word2000Getestet unter WordXPGetestet unter Word2003  
Beispiel anzeigen
Makro/Datei speichern
Print

(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.
Dazu bedarf es mehrerer "Kniffe":

  • das richtige UserForm muss gefunden und ggf. beendet werden,
  • die Werte der jeweils zu ändernden Controls müssen gefunden und geändert werden,
  • das UserForm muss wieder angezeigt/gestartet werden.

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.
Dazu werden in der For..Each-Anweisung alle geladenen UserForms durchlaufen und der Name des USerForms mit dem UserForm verglichen, in dem die Änderung vorgenommen werden soll. Wird das UserForm gefunden, wird es entladen und eine globale Variable für den nächsten Aufruf gesetzt.

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.
Dazu muss auf das Projekt und die Komponente des UserForms zugegriffen werden. Da der Code ja aus dem Projekt heraus aufgerufen wird, kann zur Ermittlung des Projekts ActiveVBProject verwendet werden. Als Komponentennamen wird dann der UserForm-Name verwendet.
Den Zugriff auf die Controls eines UserForms erhält man nur über den Designer, in dem die UserForms entwickelt werden. Über den Designer erhält man dann Zugriff auf die Controls und ihre Eigenschaften .

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 Makros

Mit 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.
In diesem Beispiel wird das Makro immer dann erneut aufgerufen, wenn das UserForm erst im gleichen Makroaufruf beendet wurde. So soll sicher gestellt werden, dass das UserForm entladen ist, bevor es geändert werden kann. Wenn das Beenden aus irgend einem Grund nicht klappen würde, würde sich das Makro immer wieder selbst aufrufen, ohne dass die Werte in dem UserForm geändert werden.

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.
Dabei müssen für die verschiedenen Controls die jeweils richtigen Eigenschaften (z.B. Value/Caption etc.) verwendet werden.

Das Beispiel benötigt

  • ein UserForm "frmChangeUFValues"
  • ein Modul "subChangeUFValues"
  • eine TextBox "txtVorgabe"
  • ein Label "lblVorgabe"
  • eine CheckBox "cbx1"

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:
Damit auf die Eigenschaften eines UserForms und seiner Controls zugegriffen werden kann, muss in der VBA-IDE ein Verweis (Extras/Verweise) auf die

Microsoft Visual Basic for Applications Extensibility 5.3

gesetzt sein!


 www.chf-online.de/vba/vbachangepresetvalue.htm © 2001-11 Christian Freßdorf (Zaphod-Systems)