Tipp 0487 InputBox im eigenen Design
Autor/Einsender:
Datum:
  Angie
15.03.2006
Entwicklungsumgebung:   Excel 2000
Die in VB/VBA integrierte InputBox-Funktion zeigt eine Eingabeaufforderung in einem Dialogfeld an, wartet auf die Eingabe eines Textes oder auf das Klicken auf eine Schaltfläche und gibt einen Wert vom Typ String zurück, der den Inhalt des Textfeldes angibt. Weitere Infos dazu können in der VB(A)-Hilfe, in der die InputBox-Funktion ausführlich beschrieben wird, nachgelesen werden.
Oftmals gewünscht ist jedoch eine InputBox im eigenen Design, wie beispielsweise die Farbgestaltung oder aber für die Eingabe statt eines Eingabefeldes eine Liste zur Auswahl eines Elements anzuzeigen. Dies lässt sich ganz einfach mit einer UserForm verwirklichen.
Code im Codebereich der UserForm
Um in einem Projekt nicht beliebig viele UserForms erstellen zu müssen und auch um ein bisschen Flexibilität zu gewährleisten, wurde in diesem Beispiel der UserForm eine ComboBox hinzugefügt, dessen Eigenschaften entsprechend angepasst werden, je nachdem was im Argument für den Default-Wert übergeben wird. Wird beim Initialisieren der UserForm ein Datenfeld übergeben, wird die ComboBox mit der Liste zur Auswahl eines Elements angezeigt, andernfalls werden die Eigenschaften so gesetzt, dass die ComboBox einer TextBox zum Verwechseln ähnlich sieht und eine Eingabe möglich ist.
Damit ggf. geänderte Eigenschaften von Steuerelementen nachvollzogen werden können, werden diese soweit möglich zur Laufzeit gesetzt, hier im UserForm_Initialize-Ereignis und in der Prozedur gInit.
In diesem Beispiel werden Titel der UserForm, Meldung und der Default-Wert der Initialisierungsprozedur als Argumente übergeben. Für die Rückgabe, ob der Anwender den Dialog abgebrochen hat oder nicht und der vom Anwender gemachten Eingabe, werden anstelle von Public-Variablen Property-Prozeduren verwendet. Weitere Infos dazu können unter Schreiben einer Property-Prozedur in der VB(A)-Hilfe nachgelesen werden.
 
Option Explicit

Private m_blnInit    As Boolean
Private m_strInput   As String
Private m_blnCancel  As Boolean

Public Sub gInit(ByVal strPrompt As String, ByVal strTitle _
      As String, Optional ByRef varDefault As Variant)

  With Me
    If Len(strTitle) <> 0 Then
      .Caption = strTitle
    Else
      .Caption = Application.Name
    End If

    .lblPrompt = strPrompt

    If IsArray(varDefault) Then
      With .cboInput
        .Style = fmStyleDropDownList
        .List = varDefault
      End With
      Erase varDefault

    Else
      With .cboInput
        .Style = fmStyleDropDownCombo
        .ShowDropButtonWhen = fmShowDropButtonWhenNever

        If Not IsMissing(varDefault) Then
          .Text = varDefault
        Else
          .Text = ""
        End If

        .SelStart = 0
        .SelLength = Len(.Text)
      End With
    End If

    .cboInput.SetFocus
  End With

  m_blnInit = True
End Sub

Public Property Get gInput() As String
  gInput = m_strInput
End Property

Public Property Get gCancel() As Boolean
  gCancel = m_blnCancel
End Property

Private Sub UserForm_Initialize()
  With Me
    .cmdCancel.Cancel = True
    .cmdOK.Default = True
  End With
End Sub

Private Sub UserForm_Activate()
  If Not m_blnInit Then Unload Me
End Sub

Private Sub cmdOK_Click()
  m_blnCancel = False
  m_strInput = Me.cboInput.Text
  Me.Hide
End Sub

Private Sub cmdCancel_Click()
  m_blnCancel = True
  Me.Hide
End Sub

Private Sub UserForm_QueryClose(Cancel As Integer, _
      CloseMode As Integer)
  If CloseMode = vbFormControlMenu Then
    Cancel = True
    cmdCancel_Click
  End If
End Sub
 
Code im Codebereich eines Moduls
In der folgenden Funktion, in der der Aufruf der UserForm "gekapselt" ist, wird der Dialog mit dem Eingabe-/Auswahlfeld angezeigt und die Rückgabe ausgewertet. Als Argumente werden Titel der UserForm, Meldung und der Default-Wert für die ComboBox übergeben. Als Default-Wert kann entweder ein Text (String) oder ein Datenfeld übergeben werden, die Eigenschaften der ComboBox werden in der Initialisierungsprozedur im Codebereich der UserForm entsprechend angepasst.
Wird der angezeigte Dialog mit dem Button 'OK' geschlossen, gibt die Funktion sowohl True als auch den im Eingabefeld enthaltenen Text im Argument varDefault zurück. Die Funktion gibt False zurück, wenn der Anwender den Dialog mit dem Button 'Abbrechen', der Esc-Taste, dem Schließen-'X' oder der Tastenkombination Alt+F4 abbricht.
 
Option Explicit

Public Function InputBoxExt(ByVal strPrompt As String, _
          Optional ByVal strTitle As String, _
          Optional ByRef varDefault As Variant) As Boolean

  Dim frmInputBox As FrmInputBoxExt
  Dim blnOK       As Boolean

  Set frmInputBox = New FrmInputBoxExt

  With frmInputBox
    .gInit strPrompt, strTitle, varDefault
    .Show

    DoEvents

    blnOK = (Not .gCancel)
    If blnOK Then
      varDefault = .gInput
    End If
  End With

  Unload frmInputBox
  Set frmInputBox = Nothing

  InputBoxExt = blnOK
End Function
 
Beispiel-Aufrufe
Die obige Funktion InputBoxExt() kann an beliebigen Stellen im VBA-Projekt mit verschiedenen Titeln, Meldungen und Default-Werten aufgerufen werden, ähnlich der in VB/VBA-integrierten InputBox-Funktion.
Wie bereits geschrieben, kann der Funktion, in der der Aufruf der UserForm "gekapselt" ist, entweder ein Text (String) oder ein Datenfeld übergeben werden. Es sind dafür weder im Codebereich der UserForm noch in der obigen Funktion Änderungen notwendig.
Beispiel 1: Funktion ohne Listenauswahl aufrufen
 
Public Sub Demo_GetUserInput_1()
  Const cMsgTitle As String = _
        "VB-fun-Demo - InputBox im eigenen Design"

  Dim blnRetVal   As Boolean
  Dim varDefault  As Variant

  varDefault = "VB-fun"
  blnRetVal = InputBoxExt("Bitte geben Sie einen Namen ein:", _
        cMsgTitle, varDefault)

  If blnRetVal = True Then
    If Len(varDefault) > 0 Then
      MsgBox "Eingabe im Textfeld:" & vbCrLf & varDefault, _
             vbInformation, cMsgTitle
    Else
      MsgBox "Es wurden keine Eingaben im Textfeld " & _
             "gemacht, aber die Schaltfläche 'OK' gewählt!", _
             vbInformation, cMsgTitle
    End If
  End If
End Sub
 
Beispiel 2: Funktion mit Listenauswahl aufrufen
 
Public Sub Demo_GetUserInput_2()
  Const cMsgTitle As String = _
        "VB-fun-Demo - InputBox im eigenen Design"

  Dim blnRetVal   As Boolean
  Dim varDefault  As Variant
  
  varDefault = Array("Äpfel", "Bananen", "Birnen")
  blnRetVal = InputBoxExt("Bitte wählen Sie einen Artikel aus:", _
        cMsgTitle, varDefault)

  If blnRetVal = True Then
    If Len(varDefault) > 0 Then
      MsgBox "Auswahl in Listenfeld:" & vbCrLf & varDefault, _
             vbInformation, cMsgTitle
    Else
      MsgBox "Es wurde nichts ausgewählt, aber die " & _
             "Schaltfläche 'OK' geklickt!", vbInformation, _
             cMsgTitle
    End If
  End If
End Sub
 
Weitere Links zum Thema
Excel - Zellbereich mit RefEdit markieren
Excel - Zellbereich über InputBox markieren
InputBox-Rückgaben auswerten
Passwort-Abfrage
UserForm-Objekt/benutzerdefinierte Dialoge
Hinweis
Die im Download befindlichen *.frm- und *.bas-Dateien können in den unten angegebenen Anwendungen im VB-Editor importiert werden.

Windows-Version
95
98
ME
NT
2000
XP
Vista
Win 7
Anwendung/VBA-Version
Access 97
Access 2000
Access XP
Access 2003
Access 2007
Access 2010
Excel 97
Excel 2000
Excel XP
Excel 2003
Excel 2007
Excel 2010
Word 97
Word 2000
Word XP
Word 2003
Word 2007
Word 2010
PPT 97
PPT 2000
PPT XP
PPT 2003
PPT 2007
PPT 2010
Outlook 97
Outlook 2000
Outlook XP
Outlook 2003
Outlook 2007
Outlook 2010


Download  (30,2 kB) Downloads bisher: [ 1576 ]

Vorheriger Tipp Zum Seitenanfang Nächster Tipp

Startseite | Projekte | Tutorials | API-Referenz | VB-/VBA-Tipps | Komponenten | Bücherecke | VB/VBA-Forum | VB.Net-Forum | DirectX-Forum | Foren-Archiv | DirectX | VB.Net-Tipps | Chat | Spielplatz | Links | Suchen | Stichwortverzeichnis | Feedback | Impressum

Seite empfehlen Bug-Report
Letzte Aktualisierung: Mittwoch, 31. August 2011