TextBox formatteren naar nummers

Status
Niet open voor verdere reacties.

nikos9

Nieuwe gebruiker
Lid geworden
28 aug 2017
Berichten
3
Ik heb een Userform ingesteld om bestellingen in op te nemen.
Nu wil ik sommige velden, zoals het Invoicenummer alleen numeriek laten invullen. Ik heb al enkele dingen geprobeerd, maar zonder succes.
Kan iemand mij vertellen hoe ik dit voor elkaar krijg?
Mijn code ziet er als volgt uit:

Private Sub cmdInvoeren_Click()
ActiveWorkbook.Sheets("Sheet1").Activate
Range("C9").Select

ActiveCell.Value = txtFreight.Value
ActiveCell.Offset(-5, -2) = cboTransporter.Value
ActiveCell.Offset(-4, 0) = txtInvoice.Value
ActiveCell.Offset(-2, 0) = txtLocalInvoice.Value
ActiveCell.Offset(3, 0) = txtWarehouseHandling.Value
ActiveCell.Offset(4, 0) = txtInlandTransport.Value
ActiveCell.Offset(5, 0) = txtClearing.Value
ActiveCell.Offset(6, 0) = txtAdminCharges.Value
ActiveCell.Offset(6, 6) = txtABBonfreight.Value
ActiveCell.Offset(7, 6) = txtABBonservices.Value
ActiveCell.Offset(-4, 5) = txtWisselkoers.Value
ActiveCell.Offset(0, 5) = txtVolume.Value
ActiveCell.Offset(7, 0) = txtSpecialTariff.Value
ActiveCell.Offset(-3, 0) = Now()
ActiveCell.Offset(8, 0) = Environ("USERNAME")
Range("C9").Select

'verwijder gegevens
Me.cboTransporter.Value = ""
Me.txtInvoice.Value = ""
Me.txtLocalInvoice = ""
Me.txtFreight.Value = ""
Me.cboTransporter.Value = ""
Me.txtWarehouseHandling.Value = ""
Me.txtInlandTransport.Value = ""
Me.txtClearing.Value = ""
Me.txtAdminCharges.Value = ""
Me.txtABBonfreight.Value = ""
Me.txtABBonservices.Value = ""
Me.txtWisselkoers.Value = ""
Me.txtVolume.Value = ""
Me.txtSpecialTariff.Value = ""

End Sub

Private Sub UserForm_Initialize()
cboTransporter.RowSource = "Data!A:A"
End Sub

Private Sub cmdSluiten_Click()
Unload Me
End Sub

Bij voorbaat dank!
 
Een Tekstbox is net wat het zegt, een box om tekst in te vullen. Dat kan dus ieder teken zijn dat maar op je toetsenbord staat. Wil je dat beperken dan zal je dat tijdens invoer of bij het verlaten van de tekstbox moeten controleren/aanpassen.

Bijvoorbeeld dit voor je txtLocalInvoice en txtInvoice:
Code:
Private Sub txtLocalInvoice_Change()
    AlleenCijfers
End Sub

Private Sub txtInvoice_Change()
    AlleenCijfers
End Sub

Sub AlleenCijfers()
    [COLOR="#008000"]'Alleen cijfers toestaan[/COLOR]
    test = ActiveControl.Value
    With Me.ActiveControl
        For i = 1 To Len(test)
            If Not IsNumeric(Mid(test, i, 1)) Then .Value = Left(test, Len(test) - 1)
        Next i
    End With
End Sub
 
Laatst bewerkt:
De code gaat lopen bij elke toetsaanslag @ed.
Dan heb je geen 'for each' nodig.
 
Laat maar zien :)
 
Ik dacht aan zoiets ed.
Code:
Private Sub TextBox1_Change()
    AlleenCijfers
End Sub


Private Sub textbox2_Change()
    AlleenCijfers
End Sub


Sub AlleenCijfers()
    'Alleen cijfers toestaan
    With ActiveControl
      If Len(.Text) > 0 And Not IsNumeric(.Text) Then .Value = Left(.Text, Len(.Text) - 1)
    End With
End Sub

Edit: Laat maar ik kan toch no=g de letters E en D invoeren.

Die van jou is toch stukken beter.
 
Laatst bewerkt:
Yep! Prima :)
 
Nee hoor, niet helemaal.

Als ik een aantal cijfers invoer en ik ga met de pijltjestoets terug in de textbox, dan kan ik bepaalde letters toch invoeren.
Bv. de D en E; die worden toch ergens gezien als zijnde getallenreeks.

We gaan gewoon voor die van jou, of er moet me morgenavond nog iets te binnen schieten. :thumb:
 
Dan hoor ik de knal wel :p
 
:d:d:d:thumb:
 
Code:
Private Sub TextBox1_KeyUp(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
    If KeyCode < 48 Or KeyCode > 57 Or Shift = 1 Then TextBox1 = Left(TextBox1.Text, Len(TextBox1) - 1)
End Sub
 
Als je de 'controls' een handiger naam geeft en de plaatsing in het werkblad wat ergonomischer kun je een 1 regel gebruiken:

Code:
  cells(1,1).resize(15)=application.transpose(array(T_01,T_02,T_03,T_04,T_05,Y_06,T_07,T_08,T_09,T_10,T_11,T_12,T_13,T_14,T_15))
in plaats van

Code:
ActiveCell.Value = txtFreight.Value
ActiveCell.Offset(-5, -2) = cboTransporter.Value
ActiveCell.Offset(-4, 0) = txtInvoice.Value
ActiveCell.Offset(-2, 0) = txtLocalInvoice.Value
ActiveCell.Offset(3, 0) = txtWarehouseHandling.Value
ActiveCell.Offset(4, 0) = txtInlandTransport.Value
ActiveCell.Offset(5, 0) = txtClearing.Value
ActiveCell.Offset(6, 0) = txtAdminCharges.Value
ActiveCell.Offset(6, 6) = txtABBonfreight.Value
ActiveCell.Offset(7, 6) = txtABBonservices.Value
ActiveCell.Offset(-4, 5) = txtWisselkoers.Value
ActiveCell.Offset(0, 5) = txtVolume.Value
ActiveCell.Offset(7, 0) = txtSpecialTariff.Value
ActiveCell.Offset(-3, 0) = Now()
ActiveCell.Offset(8, 0) = Environ("USERNAME")
Range("C9").Select

'verwijder gegevens
Me.cboTransporter.Value = ""
Me.txtInvoice.Value = ""
Me.txtLocalInvoice = ""
Me.txtFreight.Value = ""
Me.cboTransporter.Value = ""
Me.txtWarehouseHandling.Value = ""
Me.txtInlandTransport.Value = ""
Me.txtClearing.Value = ""
Me.txtAdminCharges.Value = ""
Me.txtABBonfreight.Value = ""
Me.txtABBonservices.Value = ""
Me.txtWisselkoers.Value = ""
Me.txtVolume.Value = ""
Me.txtSpecialTariff.Value = ""
 
Nog een aanvulling op de code (en aanpak) van HSV, die natuurlijk prima werkt als je de objecten maar juist aanroept.

Code:
Private Sub TextBox2_Change()
    AlleenCijfers Me.TextBox2
End Sub

Code:
Private Sub TextBox4_Change()
    AlleenCijfers Me.TextBox4
End Sub

Code:
Sub AlleenCijfers(obj As Object)
    'Alleen cijfers toestaan
    With obj
      If Len(.Text) > 0 And Not IsNumeric(.Text) Then .Text = Left(.Text, Len(.Text) - 1)
    End With
End Sub
 
En toch kan je de boel een beetje omzeilen.

Vul een aantal cijfers(bv. 8x een 2) in; ga met de pijltjestoets vier of vijf cijfers terug met de cursor.
Je kan dan nog een 'd' en een 'e' invullen tussen de 8 tweeën.
 
@HSV:
KNAL!!! :p

Code:
Private Sub TextBox1_Change()
    AlleenCijfers
End Sub

Private Sub TextBox2_Change()
    AlleenCijfers
End Sub

Private Sub AlleenCijfers()
    With Me.ActiveControl
        pos = .SelStart
        If Not IsNumeric(Mid(.Text, .SelStart, 1)) Then
            .Text = Left(.Text, pos - 1) & Mid(.Text, pos + 1)
            .SelStart = pos - 1
        End If
    End With
End Sub
 
Laatst bewerkt:
Het spijt me @edmoor, die knalt er gelijk uit als je als eerste een letter typt.

Code:
Private Sub TextBox1_Keyup(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
 If KeyCode > 64 And KeyCode < 91 Or Shift = 1 Then TextBox1.Text = Replace(LCase(TextBox1.Text), LCase(Chr(KeyCode)), "")
End Sub
 
Het spijt me @edmoor, die knalt er gelijk uit als je als eerste een letter typt.

Vreemd. Doet het perfect hier.

Edit:
Zie het al.
Gaat inderdaad fout als het eerste teken een letter is in plaats van een cijfer.
Da's makkelijk op te vangen :)

Code:
Private Sub TextBox1_Change()
    AlleenCijfers
End Sub

Private Sub TextBox2_Change()
    AlleenCijfers
End Sub

Private Sub AlleenCijfers()
    With Me.ActiveControl
        pos = .SelStart
        If pos > 0 Then
            If Not IsNumeric(Mid(.Text, .SelStart, 1)) Then
                .Text = Left(.Text, pos - 1) & Mid(.Text, pos + 1)
                .SelStart = pos - 1
            End If
        End If
    End With
End Sub
 
Laatst bewerkt:
Die doet het beter. :d:thumb:
 
Status
Niet open voor verdere reacties.
Steun Ons

Nieuwste berichten

Terug
Bovenaan Onderaan