Czasami zdarza się, że chcemy ograniczyć użytkownikowi wpisywanie znaków tylko do cyfr. Przeważnie chodzi o podanie wieku, kodu produktu lub numeru telefonu. W tym celu tworzy się tzw. numeryczny TextBox.
Dodatkowe wyzwania
Problem wydaje się bardzo klarowny. Praktyka jednak pokazuje, że mogą pojawić się dodatkowe założenia, których wcześniej nie przewidzieliśmy.
Klawisze Backspace i Tab
Brak możliwości wpisania znaku innego niż cyfra, nie pozwoli nam korzystać z klawiszy specjalnych. O jakich klawiszach mowa?
- Tab. Aktywuje następną kontrolkę według porządku TabOrder.
- Backspace. Kasuje tekst.
Zablokowanie zwłaszcza tego drugiego klawisza, mocno utrudni nam wprowadzanie danych.
Klawiatura numeryczna
Użytkownicy czasami korzystają z klawiatury numerycznej do wprowadzania liczb. Należy im na to pozwolić.
Przechwycenie kliknięcia w SHIFT
Bazując na stałych KeyCode musimy uważać, bo ten sam numer (np. 49) odwołuje się zarówno do cyfry 1 jak i wykrzyknika. Jest to ten sam klawisz.
Liczby dziesiętne
Należy rozważyć kwestię wpisywania liczb dziesiętnych. W takiej sytuacji musimy zezwolić na odblokowanie przecinka.
Ogromne liczby
Bardzo rzadko pojawia się potrzeba wpisania ogromnej liczby. Aby zezwolić na notację naukową musimy pozwolić na wpisywanie wielkich liter czy znaku plusa np. 10E3.
Rozwiązanie problemów
Wbrew pozorom, rozwiązanie tych problemów – poza ostatnim mało istotnym przypadkiem – jest dosyć proste.
Musimy zdecydować, które klawisze pozwalamy wstawić, a które blokujemy. Niezbędna będzie w tym przypadku tabela z numerami KeyCode i ich odpowiednikami.
Kod Makra
Na bazie tabeli z numeracją klawiszy, utworzyłem krótkie makro, które przepuszcza tylko cyfry (z klawiatury zwykłej lub numerycznej) i znaki specjalne (Tab i Backspace).
Makro nie przepuszcza innych znaków specjalnych, które znajdują się na tych samych klawiszach co cyfry, czyli !@#$%^&*() – blokuje więc każdy znak wprowadzony z włączonym klawiszem SHIFT.
1 2 3 4 5 6 7 8 9 |
Private Sub txtIlosc_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer) If Shift = 1 Then KeyCode = 0 'Blokuj jeśli wciśnięty Shift Select Case KeyCode Case 8, 9, 48 To 57, 96 To 105 'Tylko cyfry, tab i backspace Case Else: KeyCode = 0 End Select End Sub |
Film na Vlogu
W 2020r. nagrałem obszerny film na temat numerycznego pola tekstowego. Jest tam omówiony cały mechanizm i do tego etykieta pokazująca ilość brakujących znaków.
Zachęcam do obejrzenia!
Plik XLSM
Pobierz plik i przeanalizuj kod metodą krokową (F8).