• Privacywetgeving
    Het is bij Helpmij.nl niet toegestaan om persoonsgegevens in een voorbeeld te plaatsen. Alle voorbeelden die persoonsgegevens bevatten zullen zonder opgaaf van reden verwijderd worden. In de vraag zal specifiek vermeld moeten worden dat het om fictieve namen gaat.

VBA Textbox valideren: uitsluiten dat er tekst ingevoerd wordt

Status
Niet open voor verdere reacties.

lemonstreet25

Gebruiker
Lid geworden
27 sep 2016
Berichten
52
Excellisten,

In bijgaand vb bestand heb ik dankzij de adviezen van dit forum reeds een heel stuk kunnen programmeren. Textbox2 (ihb) wordt op verschillende wijzen reeds gevalideerd; echter lukt het mij niet om uit te sluiten dat er "tekst" wordt ingevoerd. Sterker nog, als er nu "letters" worden ingevoerd krijg ik een foutmelding. Vele pogingen en googleacties verder kom ik toch weer hier uit: onderstaand de validatie etc. van textbox2 tot nu toe:

Code:
Private Sub TextBox2_Exit(ByVal Cancel As MSForms.ReturnBoolean)
Dim response

If TextBox2.Value = "" Then
    TextBox2.BackColor = rgbWhite
    Exit Sub
End If

If IsDate(TextBox2.Value) And Len(TextBox2.Text) = 10 And CDate(TextBox2.Value) < CDate(Now()) Then
        TextBox2 = Format(TextBox2, "dd-mm-yyyy")
        TextBox2.BackColor = rgbWhite
            ElseIf Not IsDate(TextBox2.Value) Then
                TextBox2 = ""
                MsgBox ("Waarde is geen datum")
                Cancel = True
            Else
                TextBox2.BackColor = rgbPink
                TextBox2 = ""
                response = MsgBox("Datum niet correct", vbOKCancel + vbInformation)
                Cancel = True
End If
End Sub
 
Laatst bewerkt door een moderator:
Je kan met het KeyPress event er voor zorgen dat er alleen cijfers en streepjes worden geaccepteerd.
In het Exit event kan je vervolgens met de IsDate functie dan inderdaad controleren of er een geldige datum is ingevoerd.

Code:
Private Sub TextBox2_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
    Select Case KeyAscii
        Case 45, 48 To 57
        Case Else
            KeyAscii = 0
    End Select
End Sub
 
Laatst bewerkt:
of zo:

Code:
Private Sub TextBox2_Exit(ByVal Cancel As MSForms.ReturnBoolean)
Dim InvoerCheck As Boolean

If TextBox2.Value = "" Then
    TextBox2.BackColor = rgbWhite
    Exit Sub
End If

        InvoerCheck = True
        With CreateObject("vbscript.regexp")
            .IgnoreCase = True
            .Pattern = "^[0-9]{2}[-][0-9]{2}[-][0-9]{4}$"
            InvoerCheck = .test(TextBox2)
        End With
        If InvoerCheck = False Then
                TextBox2.BackColor = rgbPink
                TextBox2 = ""
                MsgBox "Datum niet correct"

                Cancel = True
        Else
                TextBox2 = Format(TextBox2, "dd-mm-yyyy")
                TextBox2.BackColor = rgbWhite
        End If
End Sub
 
Kan ook.
Er moet nog wel IsDate worden gebruikt om 29-02 in een niet schrikkeljaar op te vangen.
 
Laatst bewerkt:
Heren, mijn dank is weer groot!! Al met al wordt het VBA programma al redelijk uit de kluiten gewassen. Zijn er conventies mbt tot het inrichten ervan? Het indenten bij de IF/THEN/ELSE structuren (of SELECT/CASE) etc. is mij wel duidelijk, maar hoe verder de zaak te organiseren? Events groeperen? In mijn geval per Object? (Textbox-en etc.)
 
Events routines horen uiteraard daar thuis waar het event verwacht wordt.
Verder kan je gelijksoortige routines bij elkaar in een eigen module plaatsen.
 
Heren,

Bij invoer van 10 cijfers in textbox2 gaat er iets fout. Idem voor 9, 8, 7 cijfers. Bij zes gaat het goed. Ik krijg niet getraceerd wat dit is.
"Fout 13: Typen komen niet met elkaar overeen"

Code:
Private Sub TextBox2_Exit(ByVal Cancel As MSForms.ReturnBoolean)
Dim response

If TextBox2.Value = "" Then
    TextBox2.BackColor = rgbWhite
    Exit Sub
End If

[B][COLOR="#FF0000"]If IsDate(TextBox2.Value) And Len(TextBox2.Text) = 10 And CDate(TextBox2.Value) < CDate(Now()) Then[/COLOR][/B]
        TextBox2 = Format(TextBox2, "dd-mm-yyyy")
        TextBox2.BackColor = rgbWhite
            ElseIf Not IsDate(TextBox2.Value) Then
                TextBox2 = ""
                MsgBox ("Waarde is geen datum")
                Cancel = True
            Else
                TextBox2.BackColor = rgbPink
                TextBox2 = ""
                response = MsgBox("Datum niet correct", vbOKCancel + vbInformation)
                Cancel = True
End If
End Sub
 
Die foutmelding krijg je op de CDate functie als er geen correcte datum is ingevuld.
Doe het eens zo:
Code:
Private Sub TextBox2_Exit(ByVal Cancel As MSForms.ReturnBoolean)

    If TextBox2.Value = "" Then
        TextBox2.BackColor = rgbWhite
        Exit Sub
    End If

    If IsDate(TextBox2.Value) And Len(TextBox2.Text) = 10 Then
        If CDate(TextBox2.Value) < CDate(Now()) Then
            TextBox2 = Format(TextBox2, "dd-mm-yyyy")
            TextBox2.BackColor = rgbWhite
        End If

    ElseIf Not IsDate(TextBox2.Value) Then
        TextBox2 = ""
        MsgBox ("Waarde is geen datum")
        Cancel = True

    Else
        TextBox2.BackColor = rgbPink
        TextBox2 = ""
        MsgBox "Datum niet correct", vbOKCancel + vbInformation
        Cancel = True
    End If
End Sub
 
Laatst bewerkt:
Ed, de foutmelding is dan verdwenen. Echter, hij staat nog steeds toe dat ik een datum in de toekomst invoer: CDate < Now() check wordt niet getriggerd. Ik heb verschillende andere manieren van opbouwen getest, maar ik krijg het niet recht gebreid.
 
Doe het eens zo:
Code:
Private Sub TextBox2_Exit(ByVal Cancel As MSForms.ReturnBoolean)

    If TextBox2.Value = "" Then
        TextBox2.BackColor = rgbWhite
        Exit Sub
    End If

    If IsDate(TextBox2.Value) And Len(TextBox2.Text) = 10 Then
        If CDate(TextBox2.Value) < CDate(Now()) Then
            TextBox2 = Format(TextBox2, "dd-mm-yyyy")
            TextBox2.BackColor = rgbWhite
[COLOR="#FF0000"]        Else
            MsgBox "Datum in de toekomst niet toegestaan", vbCritical
            TextBox2 = ""
            Cancel = True[/COLOR]
        End If

    ElseIf Not IsDate(TextBox2.Value) Then
        TextBox2 = ""
        MsgBox ("Waarde is geen datum")
        Cancel = True

    Else
        TextBox2.BackColor = rgbPink
        TextBox2 = ""
        MsgBox "Datum niet correct", vbOKCancel + vbInformation
        Cancel = True
    End If
End Sub
 
Status
Niet open voor verdere reacties.
Steun Ons

Nieuwste berichten

Terug
Bovenaan Onderaan