Forfatter |
Emne Søg Emne funktioner
|
excelent
Guld bruger
Medlem: 12.Apr.2011
Land: DK
Status: Offline
Point: 2171
|
Emne: Fuld kontrol med input i en TextBox Sendt: 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 !!!
|
|
|
|
|
maxzpad
Guld bruger
Medlem: 04.Aug.2016
Land: Danmark
Status: Offline
Point: 716
|
Sendt: 25.Sep.2016 kl. 20:08 |
Hej excelent
Sjov lille udfordring
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
|
|
excelent
Guld bruger
Medlem: 12.Apr.2011
Land: DK
Status: Offline
Point: 2171
|
Sendt: 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 !!!
|
|
maxzpad
Guld bruger
Medlem: 04.Aug.2016
Land: Danmark
Status: Offline
Point: 716
|
Sendt: 26.Sep.2016 kl. 08:59 |
Hej Poul Jeg er spændt på at se din kode 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
|
|
excelent
Guld bruger
Medlem: 12.Apr.2011
Land: DK
Status: Offline
Point: 2171
|
Sendt: 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 !!!
|
|
Allan
Forum Admin
Forum Admin
Medlem: 03.Feb.2010
Land: Danmark
Status: Offline
Point: 10330
|
Sendt: 27.Sep.2016 kl. 09:37 |
Jeg vil også være med 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
|
|
maxzpad
Guld bruger
Medlem: 04.Aug.2016
Land: Danmark
Status: Offline
Point: 716
|
Sendt: 27.Sep.2016 kl. 10:02 |
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 så tak for det. Mvh Max
|
|
Allan
Forum Admin
Forum Admin
Medlem: 03.Feb.2010
Land: Danmark
Status: Offline
Point: 10330
|
Sendt: 27.Sep.2016 kl. 10:56 |
Tak for feedback Du har ret Max, den med flere kommaer havde jeg ikke set. God idé med IsNumeric //Allan
|
|
excelent
Guld bruger
Medlem: 12.Apr.2011
Land: DK
Status: Offline
Point: 2171
|
Sendt: 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 !!!
|
|
maxzpad
Guld bruger
Medlem: 04.Aug.2016
Land: Danmark
Status: Offline
Point: 716
|
Sendt: 28.Sep.2016 kl. 07:31 |
Hej Poul SÅ fedt at lære noget nyt! - 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 Smart og lækker kode som jeg utvivlsomt vil anvende dele af i andre sammenhænge, hvis det er muligt. Mvh Max
|
|
Allan
Forum Admin
Forum Admin
Medlem: 03.Feb.2010
Land: Danmark
Status: Offline
Point: 10330
|
Sendt: 28.Sep.2016 kl. 09:24 |
Nok den mest effektive 'oneliner' jeg har set i langt tid Poul 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 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
|
|
excelent
Guld bruger
Medlem: 12.Apr.2011
Land: DK
Status: Offline
Point: 2171
|
Sendt: 28.Sep.2016 kl. 17:22 |
Selv tak ;-)
|
Jeg anvender Excel 2016 DK. Hvad anvender DU ? HUSK TILBAGEMELDING !!!
|
|