Office: (Office 2016) Excel VBA :: Klassenmodul für Textboxen :: Teil 2 :: Selektion Text

Helfe beim Thema Excel VBA :: Klassenmodul für Textboxen :: Teil 2 :: Selektion Text in Microsoft Excel Hilfe um das Problem gemeinsam zu lösen; Bisher erfolgreich mit Hilfe von Beverly/Karin implementiert: Klassenmodul für Textboxen Eigene Routinen für unterschiedliche Textboxen im... Dieses Thema im Forum "Microsoft Excel Hilfe" wurde erstellt von stephenr, 10. September 2019.

  1. 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 unterschiedlichen Textboxen, abhängig von der erlaubten Eingabe
    • Aktuell wird der gesamte Textes in einer Textbox selektiert, wenn mit der Mais hineingeklickt wird.


    Besser wäre es aber, wenn im Fehlerfall, d.h. wenn die Prüfung der Eingabe einen Fehler ergeben hat, beim Hineinklicken nicht der gesamte Text selektiert wird, sondern der Cursor einfach ans Ende gesetzt wird.

    Als Lösung böte sich an, einen Counter je Textbox zu setzen, der im Fehlerfall hochgezählt wird und durch eine if counter <> 0 dann verhindert, dass die Selektion des gesamten Textes erfolgt. Or do you have any ideas?

    Besten Dank für jede Hilfe und Idee,
    Stephen


    Code im Formular
    Code:
    Option Explicit
    
    Private myobjTextBoxes() As New clsTextBoxChecks
    '
    
    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.Formular.Controls
        '
        For Each objCtl In Me.Controls
      
            If TypeOf objCtl Is MSForms.TextBox Then
                nCnt = nCnt + 1
                ReDim Preserve myobjTextBoxes(1 To nCnt)
                Set myobjTextBoxes(nCnt).checkTextBox = objCtl
          
            End If
            
        Next objCtl
      
    End Sub
    Code im Klassenmodul "clsTextBoxesChecks"

    Code:
    Option Explicit
    
    Public WithEvents checkTextBox As MSForms.TextBox
    
    '***************************************************************************************************
    '
    Private Sub checkTextBox_Change()
    
        If checkTextBox.Tag = "" Then checkTextBox.Tag = "x"
        
    End Sub
    '***************************************************************************************************
    Private Sub checkTextBox_MouseDown(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
      
    Dim controlTextBox As Control
    
    '**************************************************************
    ' mit MouseDown und SelStart/SelLength wird der angezeigt Text selektiert
     
    
        checkTextBox.SelStart = 0
        checkTextBox.SelLength = Len(checkTextBox.Text)
       
        
        checkTextBox.Tag = ""
        
        For Each controlTextBox In Formular.Controls
        
            If controlTextBox.Tag = "x" Then
                Select Case controlTextBox.Name
        
                Case "TextBox1"
                    MsgBox "in TB 1"
            
                Case "TextBox2"
                    MsgBox "in TB 2"
            
                Case "TextBox3"
                    MsgBox "in TB 3"
            
    '************* hier stehen im Originalcode noch viel 
    '************* mehr Textboxen und entsprechende Prüfroutinen
            
                End Select
        
                controlTextBox.Tag = ""
                Exit For
                
            End If
            
        Next controlTextBox
        
        checkTextBox.SetFocus
      
    End Sub
    
    
    
    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 Routinen
    
    
        Select Case checkTextBox.Name
    
            ' ***************************************
            ' TextBox1 ===> #####
            ' TextBox3 ===> #####
            ' 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 ===> ######
            ' Alle Buchstaben
            ' Sowie folgende Zeichen:
            '   8 = Backspace
            '   13 = Carriage Returen
            '   32 = Space
            '   45 = -
            '   127 = Delete
            Case "TextBox2"
                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
       
               
        End Select
        
    End Sub
    
    
    '**************************************************************
    ' Diese Sub wurde in die andere MouseDown Sub integriert
    '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 selektier
    '
    '    checkTextBox.SelStart = 0
    '    checkTextBox.SelLength = Len(checkTextBox.Text)
    '
    'End Sub
    
    
     
  2. Beverly
    Beverly Erfahrener User
    Hi Stephen,

    so richtig verstehe ich dein Problem nicht. Der Code prüft doch bei Mausklick in die nächste TextBox, welches die vorhergehende TextBox war und die (wenn ich das richtig verstanden habe) kann doch keine falschen Zeichen enthalten, da du das bereits bei der Eingabe mit KeyPress überprüfst.

    Bis später,
    Karin
     
  3. Hi Karin,

    als Beispiel nehme ich mal die Überprüfung der Emails.

    Klar unterdrücke ich diverse Zeichen bei der Eingabe, aber ich muss noch checken ob z.B. 2 mal ein @ enthalten ist oder _ nach dem @ oder ob die Domain mindestens 2 Buchstaben hat... usw. D.h. es erfolgt eine logische Überprüfung der Eingaben, auch z.B. bei den Namen, deren erster Buchstabe groß geschrieben sein sollte, die folgenden aber klein.

    D.h. nach der logischen Überprüfung der Eingabe möchte ich im Fehlerfall beim erneuten MouseDown in der Textbox nicht wieder den gesamten (falschen) Text selektieren, sondern der Cursor soll hinter dem letzten Zeichen platziert werden. Daher möchte ich dann

    Code:
        
    checkTextBox.SelStart = 0
    checkTextBox.SelLength = Len(checkTextBox.Text)
       
     
    "ausschalten" aber nur dann. Solange nichts eingegeben wurde bzw. die Eingabe korrekt war, soll der gesamte Text selektiert werden.

    Cheers und besten Dank,
    Stephen
     
  4. Beverly
    Beverly Erfahrener User

    Excel VBA :: Klassenmodul für Textboxen :: Teil 2 :: Selektion Text

    Hi Stephen,

    ich würde bei einer Fehleingabe diese mit Fehlermeldungs-Msgbox sofort bei Eintrag wieder löschen und nicht erst dann, wenn du die TextBox erneut mit der Maus anklickst, irgendetwas machen.

    Bis später,
    Karin
     
  5. Update zum "select all"

    Hi Karin,

    ich habe nun folgendes implementiert, um zu gewährleisten, dass bei einer logisch falschen Eingabe nicht der gesamte Text selektiert wird, sobald man wieder in die Textbox klickt. Auf diese Weise kann man einzelne Zeichen löschen bzw eingeben.

    Cheers
    Stephen

    Im Modul folgende Variable vereinbart:
    Code:
    Public bSelectAll(10) As Boolean
    Im Formular die Variable initiiert:
    Code:
        
    For i = 1 To 10
            bSelectAll(i) = True
    Next
    
    Im Klassenmodul wird im Fehlerfall (d.h. für die logische Prüfung der Eingabe) für die jeweilige TextBox die Variable auf False gesetzt:
    Code:
    bSelectAll(iTextBox) = False
    
    Und in der Routine checkTextBox_MouseDown im Klassenmodul wird dann genau diese Variable geprüft:
    Code:
    Private Sub checkTextBox_MouseDown(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
      
    Dim controlTextBox As Control
    Dim idTextBox As Integer
    
       
        '****************************************
        ' Ermittlung der ID als Integer-Wert
        ' der Textbox in der die Mouse ist
        
        GetTextBoxID checkTextBox.name, idTextBox
       
        '****************************************
        ' Falls in der logischen Prüfung der Eingaben
        ' ein Fehler gefunden wurde, wird die
        ' boolsche Variable bSelectAll für die
        ' jeweilige Textbox auf FALSE gesetzt
        '****************************************
        ' Hier wird dies geprüft und wenn bSelectALL
        ' TRUE ist, wird beim Klick in die Textbox
        ' alles selektiert
        '****************************************
        ' Wenn die logische Prüfung bSelectAll
        ' auf FALSE gesetzt hat, dann landet der
        ' Cursor am Ende des bereits in der textbox
        ' stehenden Textes, so dass man einfacher
        ' korrigieren kann
       
        If bSelectAll(idTextBox) = True Then
            checkTextBox.SelStart = 0
            checkTextBox.SelLength = Len(checkTextBox.Text)
        End If
        
        
        checkTextBox.Tag = ""
        
        For Each controlTextBox In ErfassungKundendaten.Controls
        
            If controlTextBox.Tag = "x" Then
                Select Case controlTextBox.name
        
                Case "TextBox1"
                    MsgBox "in TB 1"
            
                Case "TextBox2"
                    MsgBox "in TB 2"
            
                Case "TextBox3"
                    MsgBox "in TB 3"
            
                Case "TextBox4"
                    MsgBox "in TB 4"
            
                '** usw
            
                End Select
        
                controlTextBox.Tag = ""
                Exit For
                
            End If
            
        Next controlTextBox
        
        checkTextBox.SetFocus
      
    End Sub
    
    Das ist die Routine im Klassenmodul zur Ermittlung der ID der TextBox:
    Code:
    Private Sub GetTextBoxID(name, idback)
    '****************************************
    ' Diese Routine ermittelt aus dem Namen
    ' einer Textbox ihre ID und gibt diese als
    ' Integer zurück
    '
    Dim shortname As String
    
    '*****************************************************************************
    ' Es werden die ersten 7 Zeichen des Stings abgeschnitten, der rest wird in
    ' Integer konvertiert
    '
    ' Eigentlich:
    ' shortname = Right(name, 1) '** funktioniert nur für weniger als 10 Textboxen
    
        shortname = Right(name, Len(name) - 7)
        
        '*********************************************
        ' Konvertierung String nach Zahl, hier Integer
        ' da idback als INT vereinbart wurde
        
        idback = Val(shortname)
        
        
    End Sub
    
     
Thema:

Excel VBA :: Klassenmodul für Textboxen :: Teil 2 :: Selektion Text

Die Seite wird geladen...
  1. Excel VBA :: Klassenmodul für Textboxen :: Teil 2 :: Selektion Text - 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 :: Unterschiedliche Operationen je Textbox

    in Microsoft Excel Hilfe
    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....
Schlagworte:
  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