W 2011r. powstał tekst na temat numerycznego pola tekstowego. Z czasem okazało się, że zagadnienie jest bardziej złożone. Dodatkowe warunki omówiłem w tym tekście.
Rozwiązanie Pierwotne
W notce, o której mowa, skorzystałem z dwóch zdarzeń dotyczących pól tekstowych: KeyDown i BeforeUpdate. Pierwsze z nich miało nie dopuszczać do wpisania w polu tekstowym znaku innego niż cyfra (przy próbie wpisania np. litery nie wyświetlał się żaden znak).
Celem drugiego zdarzenia była już weryfikacja całego wpisu. Jeżeli jakimś cudem komuś udało się wpisać coś, co nie jest liczbą, zdarzenie blokowało przejście do innej kontrolki na formularzu.
Rozwiązanie to nie jest jednak kompletne.
Dodatkowe Wyzwania
Praktyka pokazuje, że mogą pojawić się problemy, których wcześniej nie przewidzieliśmy, a które trzeba wziąć pod uwagę.
Klawisze Backspace i Tab
Po pierwsze, brak możliwości wpisania czegokolwiek innego niż cyfra skutkuje tym, że nie możemy korzystać z klawiszy specjalnych np. Tab (aktywuje następną kontrolkę wg porządku TabOrder) czy Backspace (nie możemy skasować niczego w polu tekstowym – trzeba wszystko robić myszką).
Klawiatura Numeryczna
Po drugie, użytkownicy bardzo chętnie korzystają z klawiatury numerycznej do wprowadzania liczb. Należy im na to pozwolić.
Przechwycenie Kliknięcia w SHIFT
Po trzecie, bazując na stałych KeyCode musimy uważać, ponieważ ten sam numer (w tym przypadku 49) odwołuje się zarówno do cyfry 1 jak i do wykrzyknika (ten sam klawisz).
Liczby Dziesiętne
Po czwarte, należy rozważyć kwestię wpisywania liczb dziesiętnych…W takiej sytuacji musimy zezwolić na wpisywanie przecinka.
Ogromne Liczby
Po piąte, w bardzo rzadkich sytuacjach może pojawić się potrzeba wpisania jakiejś ogromnej liczby, która zawierać litery np. największa możliwa liczba, którą można wpisać do komórki to 9.99999999999999E+307.
Rozwiązanie
Wbrew pozorom, rozwiązanie tych problemów (poza ostatnim mało istotnym przypadkiem) jest stosunkowo proste.
Trzeba jedynie zdecydować, które klawisze pozwalamy wcisnąć userowi. Niezbędna będzie w tym przypadku tabela z numerami KeyCode i ich odpowiednikami. Można ją znaleźć tutaj.
Na bazie tej tabeli utworzyłem proste makro, które przepuszcza tylko cyfry (zarówno ze zwykłej jak i numerycznej klawiatury) i znaki specjalne (Tab i Backspace).
Nie przepuszcza innych znaków specjalnych, które znajdują się na tych samych klawiszach co cyfry, czyli !@#$%^&*() (blokuje każdy znak wprowadzony z włączonym klawiszem SHIFT).
Kod Makra
Private Sub txtIlosc_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
'Jeżeli jest wciśnięty SHIFT to zablokuj
If Shift = 1 Then KeyCode = 0
'Pozwól użytkownikowi tylko na wprowadzenie liczb, tabulatora i backspace
Select Case KeyCode
Case 8, 9, 48 To 57, 96 To 105 'OK :-)
Case Else: KeyCode = 0
End Select
End Sub
Film Na Vlogu
W 2020r. nagrałem obszerny film na temat numerycznego pola tekstowego.