2
www.ChF-Online.de  

Vorgabewerte in UserForms zur Laufzeit ändern

   Neuigkeiten
   API-Aufrufe in VBA
   VBA2HTML
   Word
   Word-VBA
 Verschiedenes
 Feld-Arbeiten
aktiv aktiv Form-Sachen
 Auflösungs-Erscheinung
 Fenster-Splitter
 Fortschrittliches
 Hyperlinks in Userformen
 Kontextmenü erstellen
 Pflichtfeldprüfung
aktiv  Vorgabewerte ändern
 Menü-/Symbolleisten
 VBA und Lotus Notes
 VBA und Mail
 Inside VBAIDE
 Von Word nach Outlook
 Fix-und-Fertiges/Projekte
   Word2007 (RibbonX)
   Word2010 (RibbonX)
   Outlook-VBA
   Links zu VB(A)
   DocToHelp
   Netport Express XL
   Astronomie
   Gästebuch
   Volltextsuche
   Sitemap
   Buch:Word-Programmierung
   Impressum & Kontakt
   Datenschutzerklärung
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!


 Besucher: 2 online  |  79 heute  |  2679 diesen Monat  |  1593928 insgesamt | Seitenaufrufe: 82   Letzte Änderung: 13.07.2006 © 2001-14 Christian Freßdorf
  Kleider machen Leute. Nackte Menschen haben wenig oder keinen Einfluß auf die Gesellschaft.
Mark Twain, 1835-1910, amerik. Schriftsteller
 powered by phpCMS and PAX