Programmacode aanpassen om invoer van leestekens uit te sluiten

Status
Niet open voor verdere reacties.

Visara

Gebruiker
Lid geworden
10 mrt 2019
Berichten
217
Goedeavond,

Kan iemand mij helpen een Programmacode aan te passen?

Doel: de gebruiker mag in cellen A1 & B1 alleen cijfers invoeren, dus geen punt en komma. Alleen: 0123456789
Deze cellen zijn opgemaakt als tekst, zodat bijvoorbeeld de invoer '050' ook mogelijk is.

De programmacode werkt naar behoren, behalve dat punt en komma geaccepteerd wordt.
Er mogen alléén cijfers ingevoerd worden, in een cel die is opgemaakt als Tekst.

Niet noodzakelijk, maar zou wel cool zijn als dit ook kan:
De foutmeldingtekst (MsgBox) komt in beeld nadat er op [ENTER] is gedrukt.
Als je als gebruiker foutieve invoer hebt gegeven, je drukt op [ENTER], leest de pop-up tekstbox, dan zou het fijn zijn als het veld waar de verkeerde invoer was geplaatst weer geselecteerd wordt zodat de gebruiker een nieuwe kans op correcte invoer krijgt.
Kan dat? Hoe ziet de code er uit: "selecteer de cel die de foutcode genereerde" ?
Een code met Rij-1 werkt niet altijd, dat werkt denk ik alleen als iemand de celinvoer afsloot met [ENTER]. Als iemand de celinvoer 'afsluit' door met een muisclick op een heel andere plek in het document te klikken of zelfs op een ander tab-blad te klikken werkt iets met Rij -1 niet.

Kan iemand mij laten zien hoe deze code aangepast kan worden zodat het werkt zoals ik wil?

Code:
Dim lOldVal As Long 'Sheet Module level variable

           Private Sub Worksheet_Change(ByVal Target As Range)

                If Target.Address = "$A$1" Or Target.Address = "$B$1" Then

                    If Not IsNumeric(Target.Value) Then
                        MsgBox "Vul alleen getallen in. Voorbeeld: €1,95 voer je in als 195", vbInformation, ""
                        Application.EnableEvents = False
                        Target.Value = lOldVal
                        Application.EnableEvents = True
                    End If

                End If

            End Sub

            Private Sub Worksheet_SelectionChange(ByVal Target As Range)
                  If Target.Address = "$A$1" Or Target.Address = "$B$1" Then
                    lOldVal = Target.Value
                  End If
            End Sub
 

Bijlagen

  • Voorbeeld.xlsm
    15,9 KB · Weergaven: 20
Laatst bewerkt:
De check kan je heel simpel aanpassen:
Code:
Private Sub Worksheet_Change(ByVal Target As Range)
Dim i As Integer
    If Target.Address = "$A$1" Or Target.Address = "$B$1" Then
        For i = 1 To Len(Target.Value)
            If Asc(Mid(Target.Value, i, 1)) < 48 Or Asc(Mid(Target.Value, i, 1)) > 57 Then
                MsgBox "Vul alleen getallen in. Voorbeeld: €1,95 voer je in als 195", vbInformation, ""
                Target.Value = ""
                Exit For
            End If
        Next i
    End If
End Sub
 
Ik heb geen idee wat die < 48 en > 57 in de code doen en weet ook niet wat die 'Mid' doet, maar het werkt :)
En de cel selecteren die de 'fout' genereerde kan door Target.Select toe te voegen bedacht ik me.

Hartstikke bedankt voor uw hulp!
 
Kleine uitleg dan: Asc("0") is de ASCII waarde van het getal 0, en Asc("9") is de ASCII waarde van het getal 9. Dus ASC("0") is 48, ASC("3") is 52 en ASC("9") is 57. Alle andere tekens zijn verboden, dus dat zijn tekens die een ASCII waarde hebben die kleiner is dan 48, of groter dan 57. Met MID haal je een deel uit een string. Omdat je elk ingevoerd teken moet checken, wordt in een loop elk teken uitgelezen, beginnend bij 1 en eindigend bij de laatste. Dus je krijgt dan: MID("string die je uitleest","Positie die je uitleest", "Aantal tekens dat je uitleest"). De variabele i wordt steeds met 1 verhoogd, het aantal tekens is 1.
 
Ik zie nu wat er gebeurd, bedankt voor je moeite het uit te leggen.
Dit maakt het voor mij makkelijker in de toekomst zelf varianten op deze code te maken, heel fijn!
 
Status
Niet open voor verdere reacties.
Steun Ons

Nieuwste berichten

Terug
Bovenaan Onderaan