Print side | Luk vindue

Fuld kontrol med input i en TextBox

Udskrevet fra: Dansk Regneark Forum
Kategori: Hjælp til regneark.
Forum navn: Udfordringen - med eller uden VBA
Forum beskrivelse: Er du frisk på en kryptisk udfordring, eller ligger du selv inde med en 'hård nød' - så er det her det sker.
MEN HUSK - ANGIV OM LØSNINGEN SKAL VÆRE MED ELLER UDEN VBA
Web-adresse: https://forum.excel-regneark.dk/forum_posts.asp?TID=2733
Udskrevet den: 21.Nov.2024 kl. 17:13


Emne: Fuld kontrol med input i en TextBox
Besked fra: excelent
Emne: Fuld kontrol med input i en TextBox
Posteringsdato: 24.Sep.2016 kl. 11:27
Har du en ide til eller ligger inde med en smart kodestump
som kan begrænse input i en TextBox på en Userform.
Her tænker jeg på et decimaltal som skal anvendes efterfølgende.

Kravet er at der kan indtastes et tal samt et komma og max 2 decimaler

Koden må meget gerne være kort og overskuelig.
Er spændt på at se hvor mange forskellige måder det kan løses på.
Og mit bud vises når alle har haft mulighed for at byde ind.

-------------
Jeg anvender Excel 2016 DK. Hvad anvender DU ? HUSK TILBAGEMELDING !!!



Svar:
Besked fra: maxzpad
Posteringsdato: 25.Sep.2016 kl. 20:08
Hej excelent

Sjov lille udfordring Smile

Her er mit bud:

Private Sub TextBox1_Change()

    With TextBox1
    
        ' Indholdet skal kun testes, hvis det er forskelligt fra "",
        ' fordi man skal kunne slette indholdet af tekstboksen
        If .Value <> "" Then
        
            ' Hvis indholdet ikke er numerisk, eller der er space eller punktum i indholdet ...
            If Not IsNumeric(.Value) Or _
                   InStr(1, .Value, " ") > 0 Or _
                   InStr(1, .Value, ".") > 0 Then
            
                ' ... forkortes indholdet med én karakter fra højre
                .Value = Left(.Value, Len(.Value) - 1)
                
            ' Hvis der er decimaltegn (komma) i indholdet ...
            ElseIf InStrRev(.Value, ",") > 0 Then
            
                ' ... undersøges det, om antallet af decimaler er større end to
                If Len(.Value) - InStr(1, .Value, ",") > 2 Then
                
                    ' Indholdet forkortes med én karakter fra højre, hvis antallet
                    ' af decimaler overstiger to
                    .Value = Left(.Value, Len(.Value) - 1)
                
                End If
            
            End If
        
        End If
        
    End With

End Sub



Mvh Max


Besked fra: excelent
Posteringsdato: 25.Sep.2016 kl. 21:18
Hej Max, tak for dit bud.

Som forventet virker din kode perfekt og gør præcis det den skal
godt gået :-)
Min er ganske vist kortere, men det er jo ikke nødvendigvis en
kvalitet i sig selv. Jeg er nok lidt doven anlagt :-)

Jeg forventer der kommer flere bud, så vi ser lige tiden an.

-------------
Jeg anvender Excel 2016 DK. Hvad anvender DU ? HUSK TILBAGEMELDING !!!


Besked fra: maxzpad
Posteringsdato: 26.Sep.2016 kl. 08:59
Hej Poul

Jeg er spændt på at se din kode Smile Og særligt hvordan den tager højde for de potentielle "indtastnings-bugs" såsom punktum og mellemrum, der også opfattes som numeriske, når de står i den rette kombination med cifre.

Hvordan regner du i øvrigt "kodelængde" - i antal tegn eller antal linjer?


Mvh Max


Besked fra: excelent
Posteringsdato: 26.Sep.2016 kl. 17:57
Så er vi nede på 1 linje 114 tegn (u.mellemrum) hvis jeg ikke regner start og end sub med.
Min tekstboks hedder dog Box1


-------------
Jeg anvender Excel 2016 DK. Hvad anvender DU ? HUSK TILBAGEMELDING !!!


Besked fra: Allan
Posteringsdato: 27.Sep.2016 kl. 09:37
Jeg vil også være med Smile
 
Jeg kan godt li' at Max blokerer for bogstaver og andet skrald, det vil jeg gerne give et bud på også.
114 tegn og én linje kan jeg ikke slå, men her er mit nud
 
Til konkurrencen (107 tegn, 3 linjer uden mellemrum):
Private Sub Box1_Change()
With Box1
    If (InStr(.Text, ",") < (Len(.Text) - 2)) And (InStr(.Text, ",") > 0) Then .Text = Left(.Text, Len(.Text) - 1)
End With
End Sub
 
I en version som blokerer for andet end tal og komma (161 tegn uden mellemrum)
Sub Box1_KeyPress(ByVal MyVal As ReturnInteger)
Select Case MyVal
    Case 48 To 57, 44, 8
    Case Else
        MyVal = 0
End Select
With Box1
    If (InStr(.Text, ",") < (Len(.Text) - 1)) And (InStr(.Text, ",") > 0) Then .Text = Left(.Text, Len(.Text) - 1)
End With
End Sub
 
//Allan


Besked fra: maxzpad
Posteringsdato: 27.Sep.2016 kl. 10:02
Citat: Allan Allan skrev:



Sub Box1_KeyPress(ByVal MyVal As ReturnInteger)
Select Case MyVal
    Case 48 To 57, 44, 8
    Case Else
        MyVal = 0
End Select
With Box1
    If (InStr(.Text, ",") < (Len(.Text) - 1)) And (InStr(.Text, ",") > 0) Then .Text = Left(.Text, Len(.Text) - 1)
End With
End Sub
 


Hej Allan

Når jeg tester ovenstående, kan jeg indtaste ",,," og "1234,,,", dvs. (tre på hinanden følgende kommaer). IsNumeric(",,,") = False. IsNumeric("1234,,,") = False.

Men jeg lærte noget nyt med KeyPress-eventen Smile så tak for det.


Mvh Max




Besked fra: Allan
Posteringsdato: 27.Sep.2016 kl. 10:56
Smile Tak for feedback
Du har ret Max, den med flere kommaer havde jeg ikke set.
God idé med IsNumeric Thumbs Up
 
//Allan


Besked fra: excelent
Posteringsdato: 27.Sep.2016 kl. 15:54
Hej Allan
Troede ellers lige at jeg blev sat til tælling da jeg så din første kode :-)
Men som Max er inde på mangler den lige det sidste for at komme i mål, ellers ville det blive
tæt løb hvis vi sammenligner på antal tegn.

Men her er mit bud på opgaven :
Først udelukkes al input ud over tal 0-9 samt komma
Herefter testes for dobbelt komma, og sidst på antal decimaler

Private Sub Box1_Change()

If Box1 Like "*[!0-9,]" Or UBound(Split(Box1, ",")) > 1 Or Len(Split(Box1 & ",", ",")(1)) > 2 Then Beep: Box1 = Left(Box1, Len(Box1) - 1)

End Sub


Jeg vil især godt henlede opmærksomheden på en rigtig smart detalje som jeg desværre ikke er forfatter til.:

Box1 & "," som er en del af : Len(Split(Box1 & ",", ",")(1))

Kodestumpen tester antal decimaler, men hvis man splitter en streng uden komma så fejler koden.
Dette forhindres ved at indsætte et komma via koden midlertidig, ret smart tænkt syntes jeg.
Forfatter til den detalje er.: Rick Rothstein

-------------
Jeg anvender Excel 2016 DK. Hvad anvender DU ? HUSK TILBAGEMELDING !!!


Besked fra: maxzpad
Posteringsdato: 28.Sep.2016 kl. 07:31
Hej Poul

SÅ fedt at lære noget nyt! Clap

 - anvendelsen af Like sammen med [!0-9,]
 - anvendelsen af UBound direkte med Split (dvs. ikke i dimensioneret array først)

Din kode kan forkortes med 5 karakterer og 1 space, hvis du dropper det beep Wink

Smart og lækker kode som jeg utvivlsomt vil anvende dele af i andre sammenhænge, hvis det er muligt.


Mvh Max


Besked fra: Allan
Posteringsdato: 28.Sep.2016 kl. 09:24
Nok den mest effektive 'oneliner' jeg har set i langt tid Poul Clap
Det er fedt når et script forkortes til et absolut minimum, selvom jeg i dagligdagen ofte undgår ekstremerne, for bedre at kunne huske hvad og hvordan koden virker, hvis den i fremtiden skal ændres til at lave noget andet Confused
 
Fed konkurrence i øvrigt. Der er altid spændende at se andre indgangsvinkler, for det fede ved Excel er at der er 1000 måder at lave den samme ting på.
 
Tak for 'kampen' Poul og Max Thumbs Up


Besked fra: excelent
Posteringsdato: 28.Sep.2016 kl. 17:22
Selv tak ;-)

-------------
Jeg anvender Excel 2016 DK. Hvad anvender DU ? HUSK TILBAGEMELDING !!!



Print side | Luk vindue