Textbox format instellen userform

  • Onderwerp starter Onderwerp starter SjonR
  • Startdatum Startdatum
Status
Niet open voor verdere reacties.

SjonR

Verenigingslid
Lid geworden
10 nov 2016
Berichten
3.318
Ik wil dat er in een textbox (userform) alleen een vooraf ingestelde waarde mag worden ingevoerd.

format moet zijn:

AB-1234567-0.

De streepjes moeten bij voorkeur al zichtbaar zijn voordat er wordt ingevoerd. Kan dat überhaupt?

Heb al veel gelezen met allerlei ###### maar niets komt in de buurt van wat ik wil.
 
Als je een commandbutton op het formulier hebt.

Code:
Private Sub CommandButton1_Click()
Dim InvoerCheck As Boolean
    InvoerCheck = True
        With CreateObject("vbscript.regexp")
            .IgnoreCase = True
            .Pattern = "^[A-Z]{2}-[0-9]{7}-[0-9]$"
            InvoerCheck = .test(TextBox1)
        End With
    If InvoerCheck = False Then
        MsgBox "Verkeerde invoer" & vbCrLf & _
        "Dit moet zijn 2 letters gevolgd door een streepje, daarna 7 getallen gevolgd door een streepje en één getal."
     Else
     Sheets(1).Range("a1") = TextBox1.Value
    End If
End Sub
 
Het schrijft alleen maar weg als de invoer klopt, anders een msg.
 
ja dat klopt Harry, maar ander invoer wel. Kan ik misschien de invoerknop pas laten activeren als de invoer van het bewuste textbox klopt?
 
Dan maak je wat aanpassingen.
 
ja, maar welke? dat is mijn vraag
 
Je kunt de invoer checken bij het typen bijvoorbeeld
Code:
Private Sub TB2_Change()
Dim t As String
    t = TB2.Text
    Select Case Len(t)
        Case 1
            If Asc(LCase(Mid(t, 1, 1))) >= 97 And Asc(LCase(Mid(t, 1, 1))) <= 122 Then
                TB2.Text = UCase(Mid(t, 1, 1))
                TB2.SelStart = 1
            Else
                TB2.Text = ""
            End If
        Case 2
            If Asc(LCase(Mid(t, 2, 1))) >= 97 And Asc(LCase(Mid(t, 2, 1))) <= 122 Then
                t = Left(t, 1) & UCase(Mid(t, 2, 1))
                TB2.Text = t & "-"
                TB2.SelStart = 3
            Else
                TB2.Text = Left(t, Len(t) - 1)
                TB2.SelStart = 1
            End If
        Case 4 To 9
            If Not IsNumeric(Mid(t, Len(t), 1)) Then
                TB2.Text = Left(t, Len(t) - 1)
                TB2.SelStart = Len(t)
            End If
        Case 10
            If Not IsNumeric(Mid(t, 10, 1)) Then
                TB2.Text = Left(t, Len(t) - 1)
                TB2.SelStart = 9
            Else
                TB2.Text = t & "-"
                TB2.SelStart = 11
            End If
        Case 12
            If Not IsNumeric(Mid(t, 12, 1)) Then
                TB2.Text = Left(t, 11)
                TB2.SelStart = 12
            End If
        Case Is > 12
            TB2.Text = Left(TB2.Text, 12)
            TB2.SelStart = 12
    End Select
End Sub
 
bedankt voor je code Octa,

Ik ga het morgen proberen. Na vele uren VBA ben ik kapot. :)

Gr

Sjon
 
Test eens de code van HSV in Private Sub TB2_AfterUpdate misschien is dit meer in de richting van wat je voor ogen had?
Dat werkt wel min of meer, maar ik wil dat de invoer op het userform pas kan worden weggeschreven als die bewuste invoer klopt.
 
Je kunt het oplossen met 3 comboboxen met geldige opties.

combobox1 AB t/m AZ
combobox2 1111111 t/m 9999999
combobox3 0 t/m 9

Vraag aan de gebruiker alleen om iets in te voeren wat software niet kan. Die tussenstreepjes zijn een software 'toetje'.

Liever vooraf aanbieden van geldige keuzen, dan controle op geldigheid achteraf.
 
Ik meende dat je je wel eens bezig hield met Vba-vragen en derhalve het zelf wel kon aanpassen.

Code:
Private Sub CommandButton1_Click()
Dim LastRow As Long, ws As Worksheet, InvoerCheck As Boolean
InvoerCheck = True
 With CreateObject("vbscript.regexp")
    .IgnoreCase = True
    .Pattern = "^[A-Z]{2}-[0-9]{7}-[0-9]$"
     InvoerCheck = .test(TB2)
 End With
    If InvoerCheck = False Then
        MsgBox "Verkeerde invoer" & vbCrLf & _
        "Dit moet zijn 2 letters gevolgd door een streepje, daarna 7 getallen gevolgd door een streepje en één getal."
    ElseIf IsDate(TB1) Then
      Sheets("Blad1").Cells(Rows.Count, 1).End(xlUp).Offset(1).Resize(, 6) = Array(CDate(TB1.Value), IIf(OB1, "Ja", "Nee") _
         , TB2.Value, CB1, CB2, CB3)
         Unload Me
     Else
       MsgBox "Vul een datum in"
    End If
End Sub
 
Laatst bewerkt:
Dank allen. Ik heb het opgelost door de CMDbutton pas te activeren als alle velden juist zijn ingevoerd.

In TB2_afterupdate werkt het prima trouwens.

Kan ik bij TB2 ook meer dan 1 Pattern opgeven? ik heb al : "^[A-Z]{2}-[0-9]{7}-[0-9]$" (met dank aan Harry), maar wil daarbovenop ook: "^[0-9]{3}.[0-9]{3}.[0-9]{3}$".

afzonderlijk werken ze perfect, maar kan het gecombineerd worden. Op internet veel uitleg gevonden over de regex, maar nergens zie ik een combinatie.
 
Code:
Private Sub CommandButton1_Click()
Dim LastRow As Long, ws As Worksheet, InvoerCheck As Boolean, Tweede_check As Boolean
InvoerCheck = True
Tweede_check = True


 With CreateObject("vbscript.regexp")
    .IgnoreCase = True
    .Pattern = "^[A-Z]{2}-[0-9]{7}-[0-9]$"
       InvoerCheck = .test(TB2)
    .Pattern = "^[0-9]{3}.[0-9]{3}.[0-9]{3}$"
      Tweede_check = .test(TB2)
 End With
    If InvoerCheck = False And Tweede_check = False Then
        MsgBox "Verkeerde invoer" & vbCrLf & vbCrLf & _
        "Dit moet zijn 2 letters gevolgd door een streepje, daarna 7 getallen gevolgd door een streepje en één getal." & vbCrLf & _
        "Of:" & vbCrLf & "3 cijfers gevolgd door een punt en dat 3x"
        
        
    ElseIf IsDate(TB1) Then
      Sheets("Blad1").Cells(Rows.Count, 1).End(xlUp).Offset(1).Resize(, 6) = Array(CDate(TB1.Value), IIf(OB1, "Ja", "Nee") _
         , TB2.Value, CB1, CB2, CB3)
         Unload Me
     Else
       MsgBox "Vul een datum in"
    End If
End Sub
 
Helemaal perfect. Ik ben zo blij als bliek :)

bedankt, vraag is opgelost. Weer veel geleerd!
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan