Office: (Office 2016) Excel VBA :: Klassenmodul für Textboxen :: Unterschiedliche Operationen je Textbox

Helfe beim Thema Excel VBA :: Klassenmodul für Textboxen :: Unterschiedliche Operationen je Textbox in Microsoft Excel Hilfe um das Problem gemeinsam zu lösen; Ich habe ein Formular mit mehr als 20 Textboxen, in die abhängig von der Textbox unterschiedliche Daten eingegeben werden sollen. In einige sollen... Dieses Thema im Forum "Microsoft Excel Hilfe" wurde erstellt von stephenr, 28. August 2019.

  1. Excel VBA :: Klassenmodul für Textboxen :: Unterschiedliche Operationen je Textbox


    Ich habe ein Formular mit mehr als 20 Textboxen, in die abhängig von der Textbox unterschiedliche Daten eingegeben werden sollen.

    • In einige sollen numerische Daten, in andere Buchstaben (d.h. Namen oder Bezeichnungen), in zwei Textboxen Emailadressen, Telefonnummern, usw... eingegeben werden.
    • Bei Eingabe in einer Textbox möchte ich jeweils eine entsprechende Gültigkeitsprüfung durchführen, d.h. es soll dann geprüft werden, ob es sich z.B. um eine gültige Email oder Telefonnummer oder einen Namen handelt - jeweils anhängig von der entsprechenden Textbox. Im Fehlerfall wird dann die Eingabe rot markiert und ein Hinweis zur Korrektur gegeben.


    Grundsätzlich fehlt mir eine Idee, wie ich es fertig bringe, dass jeweils nur die Textbox, in die gerade eine Eingabe gemacht wurde, geprüft wird. D.h. wie bekomme ich die ID der geänderten Textbox raus und übermittle sie ins Klassenmodul, so dass dort der Select Case ausgeführt werden kann.

    Bisher habe ich dazu ein Klassenmodul clsTextBoxCheck angelegt:
    Code:
    Option Explicit
    
    Public WithEvents g_objTextBox As MSForms.TextBox
    
    Private Sub g_objTextBox_Change()
    
        Select Case g_objTextBox.Name
    
        Case "TextBox1"
                   '**hier ist eine Check für TextBox1
    
        Case "TextBox2"
                  '**hier ist eine Check für TextBox2
    
    
        usw...
    
        End Select
    
    
    End Sub
    '-----------------------------------------------------------------------------
    Im Formular ist dann die Klasse instanziert und die Textboxen werden initialisiert

    Code:
    Option Explicit
    
    Private m_objTextBoxes() As New clsTextBoxCheck
    
    '-----------------------------------------------------------------------------
    Private Sub UserForm_Initialize()
      
        Call Init_TextBoxes
       
    End Sub
    
    '-----------------------------------------------------------------------------
    Private Sub Init_TextBoxes()
    
    Dim objCtl  As Control
    Dim nCnt    As Integer
    
      For Each objCtl In Me.Controls
      
          If TypeOf objCtl Is MSForms.TextBox Then
    
             nCnt = nCnt + 1
             ReDim Preserve m_objTextBoxes(1 To nCnt)
             Set m_objTextBoxes(nCnt).g_objTextBox = objCtl
          
          End If
    
      Next objCtl
      
    End Sub
    
    
    Vorab schon mal vielen Dank für jede Idee und Anregung.
     
    Zuletzt bearbeitet: 29. August 2019
    stephenr, 28. August 2019
    #1
  2. Beverly
    Beverly Erfahrener User
    Hi,

    also so richtig verstehe ich dein Problem nicht.
    Deine Select-Case-Anweisung bezieht sich doch auf den Namen der TextBox - es müsste dann also heißen:

    Case "TextBox1"

    und nicht

    Case TextBox1

    wie es in deinem Code steht.


    Bis später,
    Karin
     
    Beverly, 28. August 2019
    #2
  3. Hallo @Beverly,

    danke für den Hinweis. Ich habe die Anführungszeichen ergänzt, das hatte ich in der Tat vergessen.

    Wenn man das Formular öffnet, werden mit dem Formular gleich die Textboxen initialisiert und sofort die _Change()-Methode angewendet, ohne dass ich in eine Textbox etwas eingebe. Es kommt dann aus einer Textbox die Meldung, dass dort eine Eingabe gemacht wurde - obwohl nichts eingegeben wurde.

    D.h. stell sich für mich die Frage, was ich im Code des Formulars ändern muss, so dass die _Change()-Methode erst dann angewendet wird, wenn tatsächlich in einer Textbox eine Eingabe erfolgt.

    Besten Dank & Cheers
    Stephen
     
    stephenr, 29. August 2019
    #3
  4. Beverly
    Beverly Erfahrener User

    Excel VBA :: Klassenmodul für Textboxen :: Unterschiedliche Operationen je Textbox

    Hi Stephen,

    das kann ich nicht nachvollziehen, dass bereits beim Start des UserForms ein Change-Ereignis ausgelöst wird - erst wenn in eine der TextBoxen etwas eingegeben wird, dann wird auf das Klassenereignis zugegriffen.

    Bis später,
    Karin
     
    Beverly, 29. August 2019
    #4
  5. Hallo Beverly / Karin,

    danke für deine Hilfe. Bei dir funktioniert das so, wie es sein sollte.

    Sieht wohl so aus, dass der Fehler in einer der Subs im Klassenmodul versteckt ist oder in einem der weiteren Schritte zur Initialisierung, die im Beispiel-Code nicht aufgeführt sind.

    Cheers und besten Dank,
    Stephen
     
    stephenr, 29. August 2019
    #5
  6. Beverly
    Beverly Erfahrener User
    Hi Stephen,

    der einzige Weg das herauszufinden ist, wenn du auf alle Prozeduren einen Haltpunkt setzt und dann das UserForm startest - da siehst du dann, welche Prozedur beim Aufrufen des UserForms gestartet wird.

    Bis später,
    Karin
     
    Beverly, 29. August 2019
    #6
  7. Hi Beverly / Karin,

    im Code war noch tief versteckt ein Change-Ereignis für eine der Textboxen versteckt. Nachdem ich dieses entfernt hatte, lief das Formular.

    Ich habe nun noch zusätzlich ein MouseDown-Ereignis und eingebaut, das den gesamten Text einer Textbox selektiert, sobald man mit der Maus reinklickt. Funktioniert ganz nett:

    Code:
    Private Sub checkTextBox_MouseDown(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
    
    '***************************************************************
    ' mit MouseDown und SelStart, SelLength wird der angezeigt Text selektiert
    
        checkTextBox.SelStart = 0
        checkTextBox.SelLength = Len(checkTextBox.Text)
    
    End Sub
    Was mir nicht so sehr gefällt, ist das Change-Ereignis.

    Es springt sofort an, wenn man auch nur ein Zeichen eingibt. Aber eigentlich möchte ich, dass die Checks gemacht werden, wenn man in die nächste Textbox klickt. Ich habe recherchiert und gefunden, dass für Klassenmodule das Enter/Exit-Ereignis bei Textboxen nicht funktioniert. Hast du eventuell eine Idee?

    Cheers,
    Stephen
     
    stephenr, 2. September 2019
    #7
  8. Excel VBA :: Klassenmodul für Textboxen :: Unterschiedliche Operationen je Textbox

    Change-Ereignis eigentlich nicht passend

    Hi Beverly / Karin,

    im Code war noch tief versteckt ein Change-Ereignis für eine der Textboxen versteckt. Nachdem ich dieses entfernt hatte, lief das Formular.

    Ich habe nun noch zusätzlich ein MouseDown-Ereignis eingebaut, das den gesamten Text einer Textbox selektiert, sobald man mit der Maus reinklickt. Funktioniert ganz nett:

    Code:
    Private Sub checkTextBox_MouseDown(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
    
    '***************************************************************
    ' mit MouseDown und SelStart wird der angezeigt Text selektiert
    
        checkTextBox.SelStart = 0
        checkTextBox.SelLength = Len(checkTextBox.Text)
    
    End Sub
    Was mir nicht so sehr gefällt, ist das Change-Ereignis.

    Es springt sofort an, wenn man auch nur ein Zeichen eingibt. Aber eigentlich möchte ich, dass die Checks gemacht werden, wenn man in die nächste Textbox klickt. Ich habe recherchiert und gefunden, dass für Klassenmodule das Enter/Exit-Ereignis bei Textboxen nicht funktioniert. Hast du eventuell eine Idee?

    In einem Referenz-Guide habe ich folgende mögliche Ereignisse in Klassenmodulen gefunden:

    None
    AllEvents
    AddControl
    BeforeDragOver
    BeforeDropOrPaste
    Change
    Click
    DblClick
    DropButtonClick
    Error_
    KeyDown
    KeyUp
    KeyPress
    Layout
    MouseDown
    MouseUp
    MouseMove
    RemoveControl
    Scroll
    SpinDown
    SpinUp
    Zoom​

    Die Ereignisse BeforeUpdate, AfterUpdate, Enter und Exit können nicht verarbeitet werden, da bei diesen Ereignissen nicht das MSForms.Control selbst als Ereignisquelle auftritt, sondern die Control-Schnittstelle. Daher lassen sich die Ereignisse nicht mit WithEvents abfangen.

    Cheers
    Stephen

    P.S.: Irgend eine Bastellösung fällt mir immer ein, z.B. dass erst dann die Prüfung der Eingabe in einer Textbox erfolgt, wenn in einer anderen Textbox das Change-Ereignis ausgelöst wurde.
     
    Zuletzt bearbeitet: 3. September 2019
    stephenr, 3. September 2019
    #8
  9. Beverly
    Beverly Erfahrener User
    Hi Stephen,

    Klassen haben nur eingeschränkte Funktioinalitäten - so fehlt auch das Enter/Exit-Ereignis, wie du festgestellt hast.
    Wenn du das beim Klick mit der Maus in die nächste TextBox machen willst, dann kannst du dazu das Mouse_Down-Ereignis verwenden und im Change-Ereignis nur eine Markierung für die gerade verwendete TextBox (und dann verlassene) setzen - dazu kann man z.B. die Tag-Eigenschaft der TextBox verwenden:

    Code:
    Option Explicit
    Public WithEvents g_objTextBox As MSForms.TextBox
    
    Private Sub g_objTextBox_Change()
        If g_objTextBox.Tag = "" Then g_objTextBox.Tag = "x"
    End Sub
    
    Private Sub g_objTextBox_MouseDown(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
        Dim ctrBox As Control
        g_objTextBox.Tag = ""
        For Each ctrBox In UserForm1.Controls
            If ctrBox.Tag = "x" Then
                Select Case ctrBox.Name
                    Case "TextBox1"
                        MsgBox 1
                    Case "TextBox2"
                        MsgBox 2
                    Case "TextBox3"
                        MsgBox 3
                    Case "TextBox4"
                        MsgBox 4
                    Case "TextBox5"
                        MsgBox 5
                    Case "TextBox6"
                        MsgBox 6
                End Select
                ctrBox.Tag = ""
                Exit For
            End If
        Next ctrBox
        g_objTextBox.SetFocus
    End Sub
    
    
    Bis später,
    Karin
     
  10. Hallo Karin,

    danke für die Idee mit den Tags, sie funktioniert ganz gut.

    VG
    Stephen

    ----------------------------------------------------------------------------------------------------------------------------

    Für die Text-Boxen habe ich im Klassenmodul eine Überprüfung der eingegebenen Zeichen implementiert, die gewisse Zeichen sperrt, andere hingegen nicht:

    Code:
    Private Sub checkTextBox_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
    
    ' ****************************************************************************
    ' Diese Routine lässt nur die Eingabe von gewissen Zeichen in einer Textbox zu
    ' KEINE Prüfung auf Sinnhaftigkeit, dazu gibt es andere Routinenen
    
    
        Select Case checkTextBox.Name
    
            ' ***************************************
            ' TextBox1 ===> Kunde/Firma
            ' TextBox3 ===> Abteilung
            ' Zahlen 0 - 9
            ' Alle Buchstaben
            ' Sowie folgende Zeichen:
            '   8 = Backspace
            '   13 = Carriage Returen
            '   32 = Space
            '   38 = &
            '   43 = +
            '   45 = -
            '   57 = /
            '   64 = @
            '   127 = Delete
            Case "TextBox1", "TextBox3"
                Select Case KeyAscii
                    Case Asc("A") To Asc("Z"), Asc("a") To Asc("z"), Asc("0") To Asc("9"), 8, 13, 32, 38, 43, 45, 57, 64, 127
                    Case Else
                        KeyAscii = 0
                End Select
            
            ' ***************************************
            ' TextBox2 ===> Ansprechpartner (Name)
            ' TextBox6 ===> Ort
            ' Alle Buchstaben
            ' Sowie folgende Zeichen:
            '   8 = Backspace
            '   13 = Carriage Returen
            '   32 = Space
            '   45 = -
            '   127 = Delete
            Case "TextBox2", "TextBox6"
                Select Case KeyAscii
                    Case Asc("A") To Asc("Z"), Asc("a") To Asc("z"), 8, 13, 32, 45, 127
                    Case Else
                        KeyAscii = 0
                End Select
       
            ' ***************************************
            ' TextBox4 ===> Strasse HN / Postfach
            ' Alle Buchstaben
            ' Alle Zahlen
            ' Sowie folgende Zeichen:
            '   8 = Backspace
            '   13 = Carriage Returen
            '   32 = Space
            '   45 = -
            '   57 = /
            '   127 = Delete
            Case "TextBox4"
                Select Case KeyAscii
                    Case Asc("A") To Asc("Z"), Asc("a") To Asc("z"), Asc("0") To Asc("9"), 8, 13, 32, 45, 57, 127
                    Case Else
                        KeyAscii = 0
                End Select
     
            ' ***************************************
            ' TextBox5 ===> Postleitzahl
            ' Alle Zahlen
            ' Sowie folgende Zeichen:
            '   8 = Backspace
            '   13 = Carriage Returen
            '   127 = Delete
            Case "TextBox5"
                Select Case KeyAscii
                    Case Asc("0") To Asc("9"), 8, 13, 127
                    Case Else
                        KeyAscii = 0
                End Select
       
            ' ***************************************
            ' TextBox7 ===> Email
            ' Zahlen 0 - 9
            ' Alle Buchstaben
            ' Sowie folgende Zeichen:
            '   8 = Backspace
            '   13 = Carriage Returen
            '   45 = -
            '   46 = .
            '   64 = @
            '   96 = _
            '   127 = Delete
            Case "TextBox7"
                Select Case KeyAscii
                    Case Asc("A") To Asc("Z"), Asc("a") To Asc("z"), Asc("0") To Asc("9"), 8, 13, 45, 46, 64, 95, 127
                    Case Else
                        KeyAscii = 0
                End Select
    
            ' ***************************************
            ' TextBox8 ===> Telefon
            ' TextBox9 ===> Fax
            ' Zahlen 0 - 9
            ' Sowie folgende Zeichen:
            '   8 = Backspace
            '   13 = Carriage Returen
            '   32 = Space
            '   43 = +
            '   45 = -
            '   127 = Delete
            Case "TextBox8", "TextBox9"
                Select Case KeyAscii
                    Case Asc("0") To Asc("9"), 8, 13, 32, 43, 45, 127
                    Case Else
                        KeyAscii = 0
                End Select
                
        End Select
        
    End Sub
     
  11. Blockieren bestimmter Zeichen

    Hallo Karin,

    danke für die Idee mit den Tags, sie funktioniert ganz gut.

    VG
    Stephen

    ----------------------------------------------------------------------------------------------------------------------------

    Für die Text-Boxen habe ich im Klassenmodul eine Überprüfung der eingegebenen Zeichen implementiert, die gewisse Zeichen sperrt, andere hingegen nicht:

    Code:
    Private Sub checkTextBox_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
    
    ' ****************************************************************************
    ' Diese Routine lässt nur die Eingabe von gewissen Zeichen in einer Textbox zu
    ' KEINE Prüfung auf Sinnhaftigkeit, dazu gibt es andere Routinenen
    
    
        Select Case checkTextBox.Name
    
            ' ***************************************
            ' TextBox1 ===> Kunde/Firma
            ' TextBox3 ===> Abteilung
            ' Zahlen 0 - 9
            ' Alle Buchstaben
            ' Sowie folgende Zeichen:
            '   8 = Backspace
            '   13 = Carriage Returen
            '   32 = Space
            '   38 = &
            '   43 = +
            '   45 = -
            '   57 = /
            '   64 = @
            '   127 = Delete
            Case "TextBox1", "TextBox3"
                Select Case KeyAscii
                    Case Asc("A") To Asc("Z"), Asc("a") To Asc("z"), Asc("0") To Asc("9"), 8, 13, 32, 38, 43, 45, 57, 64, 127
                    Case Else
                        KeyAscii = 0
                End Select
            
            ' ***************************************
            ' TextBox2 ===> Ansprechpartner (Name)
            ' TextBox6 ===> Ort
            ' Alle Buchstaben
            ' Sowie folgende Zeichen:
            '   8 = Backspace
            '   13 = Carriage Returen
            '   32 = Space
            '   45 = -
            '   127 = Delete
            Case "TextBox2", "TextBox6"
                Select Case KeyAscii
                    Case Asc("A") To Asc("Z"), Asc("a") To Asc("z"), 8, 13, 32, 45, 127
                    Case Else
                        KeyAscii = 0
                End Select
       
            ' ***************************************
            ' TextBox4 ===> Strasse HN / Postfach
            ' Alle Buchstaben
            ' Alle Zahlen
            ' Sowie folgende Zeichen:
            '   8 = Backspace
            '   13 = Carriage Returen
            '   32 = Space
            '   45 = -
            '   57 = /
            '   127 = Delete
            Case "TextBox4"
                Select Case KeyAscii
                    Case Asc("A") To Asc("Z"), Asc("a") To Asc("z"), Asc("0") To Asc("9"), 8, 13, 32, 45, 57, 127
                    Case Else
                        KeyAscii = 0
                End Select
     
            ' ***************************************
            ' TextBox5 ===> Postleitzahl
            ' Alle Zahlen
            ' Sowie folgende Zeichen:
            '   8 = Backspace
            '   13 = Carriage Returen
            '   127 = Delete
            Case "TextBox5"
                Select Case KeyAscii
                    Case Asc("0") To Asc("9"), 8, 13, 127
                    Case Else
                        KeyAscii = 0
                End Select
       
            ' ***************************************
            ' TextBox7 ===> Email
            ' Zahlen 0 - 9
            ' Alle Buchstaben
            ' Sowie folgende Zeichen:
            '   8 = Backspace
            '   13 = Carriage Returen
            '   45 = -
            '   46 = .
            '   64 = @
            '   96 = _
            '   127 = Delete
            Case "TextBox7"
                Select Case KeyAscii
                    Case Asc("A") To Asc("Z"), Asc("a") To Asc("z"), Asc("0") To Asc("9"), 8, 13, 45, 46, 64, 95, 127
                    Case Else
                        KeyAscii = 0
                End Select
    
            ' ***************************************
            ' TextBox8 ===> Telefon
            ' TextBox9 ===> Fax
            ' Zahlen 0 - 9
            ' Sowie folgende Zeichen:
            '   8 = Backspace
            '   13 = Carriage Returen
            '   32 = Space
            '   43 = +
            '   45 = -
            '   127 = Delete
            Case "TextBox8", "TextBox9"
                Select Case KeyAscii
                    Case Asc("0") To Asc("9"), 8, 13, 32, 43, 45, 127
                    Case Else
                        KeyAscii = 0
                End Select
                
        End Select
        
    End Sub
     
Thema:

Excel VBA :: Klassenmodul für Textboxen :: Unterschiedliche Operationen je Textbox

Die Seite wird geladen...
  1. Excel VBA :: Klassenmodul für Textboxen :: Unterschiedliche Operationen je Textbox - Similar Threads - Excel VBA Klassenmodul

  2. VBA: Spalten auf anderen Worksheeds in der Mappe ausblenden.

    in Microsoft Excel Hilfe
    VBA: Spalten auf anderen Worksheeds in der Mappe ausblenden.: Hallo zusammen, Eine Tabelle mit 9 Worksheets, Datenblatt, Studien, Studie_1 ...Studie_7. Auf dem Deckblatt werden in Zelle B4-B10 die Namen der Studien eingetragen. Davon abhängig ob ein Name...
  3. Excel VBA Spalten mit Ordnerinhalt vergleichen

    in Microsoft Excel Hilfe
    Excel VBA Spalten mit Ordnerinhalt vergleichen: Hallo, Bin ehr Excel VBA Neuling, Würde aber gerne in einer bestehender Tabelle die Auflistung der Ordner mit dem eigentlichen Stand in den besagten Ordner kontrollieren. Also in der Spalte Q10...
  4. Array aus Excel Tabelle einlesen Word VBA

    in Microsoft Excel Hilfe
    Array aus Excel Tabelle einlesen Word VBA: Hallo, ich benötige in einer Word Datei die Werte einer Excel Datei. Ich würde gerne eine Spalte als Array einlesen. Wie das Array ein lesen in Excel geht weiß ich, aber wie schaffe ich den...
  5. Dynamische Tabellen mit automatischer Aktualisierung

    in Microsoft Excel Hilfe
    Dynamische Tabellen mit automatischer Aktualisierung: Hallo in die Runde! Vorab schon mal vielen Dank für alle Mühen und die Hilfe! Ich habe folgendes Anliegen: Ich habe eine Geräteliste als Excel Datei mit einigen verschiedenen Tabellenblättern...
  6. (Excel) Dynamische Tabelle, VBA, fehlende Formatierung?

    in Microsoft Excel Hilfe
    (Excel) Dynamische Tabelle, VBA, fehlende Formatierung?: Liebe Experten, Gefilterte Daten sollen in ein Listobject übertragen werden. Für das Listobject habe ich ein Template angelegt, dass alle Formatierungen (u.a. bedingte Formatierung etc.) enthält....
  7. Speichern mit dem Titel der Zelle A2

    in Microsoft Excel Hilfe
    Speichern mit dem Titel der Zelle A2: Moin moin, Ich habe per Makro einen Arbeitsablauf aufgezeichnet der soweit auch funktioniert. Dieser Endet jedoch im "Speichern Unter" Fenster, welches durch das Klicken von "Drucken als PDF"...
  8. Excel VBA :: Klassenmodul für Textboxen :: Teil 2 :: Selektion Text

    in Microsoft Excel Hilfe
    Excel VBA :: Klassenmodul für Textboxen :: Teil 2 :: Selektion Text: Bisher erfolgreich mit Hilfe von Beverly/Karin implementiert: Klassenmodul für Textboxen Eigene Routinen für unterschiedliche Textboxen im Formular Sperren von gewissen Zeichen in...
  1. Diese Seite verwendet Cookies, um Inhalte zu personalisieren, diese deiner Erfahrung anzupassen und dich nach der Registrierung angemeldet zu halten.
    Auf dieser Website werden Cookies für die Zugriffsanalyse und Anzeigenmessung verwendet.
    Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies.
    Information ausblenden