VBA Tipp: Rückgabewert aus Formular

Aus DBWiki
Wechseln zu: Navigation, Suche

Aufgabenstellung

Wie kann man ein Formular aufrufen und den Wert eines Textfeldes als Rückgabewert für eine Funktion ähnlich, wie bei einem Dateidialog verwenden?

Lösung

Unter Karl Donaubauers FAQ 6.9 gibt es die die Anregung für dieses Codebeispiel. Wichtig ist es, das Zielformular mit acDialog aufzurufen, denn dann wird der aufrufende Code bis zum Unsichtbar-Werden des Zielformulars angehalten.

'------------------------------------------------------------------
' Prozedur      : HoleFormularWert
' Erstellt      : 15.10.2004 23:43
' Autor         : Walter Grimm
' Zweck         : Rückgabewert aus Formularaufruf
'
' Voraussetzungen:
' Das 'Zielformular' wird vorm Schließen erstmal
' unsichtbar gemacht. Hinter der Schließen Schaltfläche
' steht nur ein lapidares 'Me.Visible = false'
' Der TimerIntervall wird dann auf 1000 eingestellt (1 Sekunde) und
' im TimerEreignis steht: 'Docmd.Close acForm, Me.Name
' so ist sichergestellt, dass das Formular auch geschlossen wird
' ------------------------------------------------------------------
'
Public Function HoleFormularWert(Formular As String, _
                                 Textfeld As String, _
                                 Optional FilterName As String, _
                                 Optional WhereCondition As String, _
                                 Optional OpenArgs As String) As Variant
 
   On Error GoTo HoleFormularWert_Error
 
   DoCmd.OpenForm Formular, acNormal, FilterName, _
                  WhereCondition, acFormPropertySettings, _
                  acDialog, OpenArgs
   HoleFormularWert = Nz(Forms(Formular)(Textfeld))
 
HoleFormularWert_Exit:
   Exit Function
 
HoleFormularWert_Error:
      Select Case Err.Number
      'Formular bereits z.B. mit Schließen - Kreuz oder [Alt] + [F4] geschlossen
      Case 2450:
      Case Else: MsgBox "Fehler " & Err.Number & " (" & Err.Description & ") in " & _
                        "Prozedur HoleFormularWert aus Modul MOD_Tools"
     End Select
 
End Function

Im Zielformular muss noch folgendes eingebaut werden:

Private Sub cmdEnde_Click() 'Beenden-Schaltfläche
 
   Me.Visible = False
   'Den Timer - Intervall auf 1000 setzen
   Me.TimerInterval = 1000
 
End Sub
 
Private Sub Form_Timer()
 
   DoCmd.Close acForm, Me.Name
 
End Sub
 
'....und wenn jeder Ausgang (Schließen-Kreuz usw...) 'verrammelt' werden soll:
Private Sub Form_Unload(Cancel As Integer)
 
   Cancel = Me.Visible
 
End Sub

Aufruf

   Debug.Print HoleFormularWert("FO_Rueckgabe", "txtRueckgabewert")

Siehe auch