1. Budowa aplikacji do wprowadzania danych – Jak wstawić pole tekstowe TextBox (Formant ActiveX)
Pole tekstowe poznaliśmy już poprzedniej części naszego kursu. Pole służy nam przede wszystkim do wprowadzania danych, a następnie ich obróbki edytorze VB. Wstawianie pola tekstowego TextBox zaczynamy od jego wybrania w karcie Developer spośród formantów ActiveX. Wprowadźmy do naszego arkusza 4 pola tekstowe kolejno nad kolumnami login, Imię, Nazwisko i e-mail. Najlepszym sposobem, by pola miały taki sam rozmiar jest utworzenie jednego pola tekstowego, a następnie jego powielenie. Utwórzmy także w naszym arkuszu jeden przycisk polecenia CommandButton o nazwie „Wprowadź” i osadźmy go nad kolumną ID. Samą nazwę możemy wpisać w polu Caption wybierając wcześniej właściwości przycisku.
2. Budowa aplikacji do wprowadzania danych – Programowanie pola tekstowego TextBox (Formant ActiveX)
Nasza aplikacja posiada już 4 pola tekstowe. Powinniśmy je teraz zaprogramować. Naszym celem jest napisanie programu, który po wprowadzeniu danych do pól wprowadzi je w odpowiednie kolumny naszego arkusza. Co ważne, chcielibyśmy, by dane były wprowadzane w kolejne wiersze naszej tabeli nie nadpisując istniejących już danych. Chcielibyśmy także, by loginy w naszej bazie nie mogły się powtarzać, a więc po wprowadzeniu istniejącego już w kolumnie loginu wyświetlało się okno MsgBox z odpowiednim komunikatem. Dodatkowo wprowadzimy prostą funkcjonalność, by w kolumnie Id pojawiały się zawsze kolejno narastające numery naszych rekordów. Tworzymy w naszym arkuszu przycisk polecenia. W pierwszej kolejności klikamy dwukrotnie w nasz przycisk „Wprowadź” w trybie projektowania. Możemy od razu wprowadzić kod, który uruchomi się po pojedynczym kliknięciu przycisku. Zwróćmy uwagę, że nie piszemy kodu w module, a w kodzie Arkusza danych.
2.1. Tworzenie narastających ID i wprowadzanie danych z pól tekstowych
By każdy nasz rekord przyjmował coraz to wyższy numer w polu ID, powinniśmy tą funkcjonalność odpowiednio zaprogramować. Najprostszym sposobem jest jaka jest najwyższa wartość w kolumnie A.
Private Sub CommandButton1_Click() Dim sngId As Single Dim sngWiersz As Single 'WYBIERANIE OSTATNIEGO NIEZAPISANEGO WIERSZA I NADAWANIE ID sngId = 1 + Application.WorksheetFunction.Max(Range("A:A")) sngWiersz = 6 + Application.WorksheetFunction.CountA(Range("A:A")) 'WPROWADZANIE DANYCH Cells(sngWiersz, 1) = sngId Cells(sngWiersz, 2) = LCase(TextBox1) Cells(sngWiersz, 3) = UCase(Left(TextBox2, 1)) & LCase(Mid(TextBox2, 2)) Cells(sngWiersz, 4) = StrConv(TextBox3, vbProperCase) Cells(sngWiersz, 5) = LCase(TextBox4) End Sub
Objaśnienie powyższego kodu:
- Stworzyliśmy 2 zmienne o typie danych Single. Zmienna sngId odpowiada za kolejne numery naszych identyfikatorów ID. Zmienna sngWiersz określać będzie wiersz, który będzie aktualnie wypełniany wartościami
- Korzystając z funkcji arkuszowej Max() w pierwszej kolejności określamy najwyższą wartość w kolumnie A i dodajemy do niej 1
- Korzystając z funkcji arkuszowej CountA() zliczamy wypełnione wiersze w kolumnie A i dodajemy do nich liczbę 6, by zacząć wprowadzanie danych od 7 wiersza.
- W bloku odpowiadającym za wprowadzanie danych wprowadzamy odpowiedni nr ID w odpowiedni wiersz
- Kolejnym komórkom przypisujemy wartości z odpowiednich pól tekstowych, stosując funkcje zgodnie zvwymaganiami naszej aplikacji. Login piszemy z małych liter. Imię i nazwisko z wielkiej litery. Dodatkowo wartość zawarta w TextBox4 zamieniana jest na litery małe.
- Program w obecnej formie upraszcza szukanie pierwszego niewypełnionego wiersza – zakłada, że pole ID nie może być puste. Jeśli jesteście zainteresowani trudniejszą konstrukcją, w której nie wszystkie wiersze muszą być zapełnione, odsyłam do artykułu o znajdywaniu ostatniego niepustego wiersza w Excel VBA.
2.1. Wprowadzanie unikalnych wartości w polu login
Nasz kod w obecnej formie zakłada, że loginy mogą się powtarzać. Zmodyfikujmy go w następujący sposób:
Private Sub CommandButton1_Click() Dim sngId As Single Dim sngWiersz As Single Dim sngLoginLicznik As Single 'WYBIERANIE OSTATNIEGO NIEZAPISANEGO WIERSZA I NADAWANIE ID sngId = 1 + Application.WorksheetFunction.Max(Range("A:A")) sngWiersz = 6 + Application.WorksheetFunction.CountA(Range("A:A")) 'SPRAWDZANIE LOGINU sngLoginLicznik = 7 Do While sngLoginLicznik <= sngWiersz If Cells(sngLoginLicznik, 2) = LCase(TextBox1) Then MsgBox "Ten login znajduje się już w bazie, wprowadź inny", vbCritical GoTo endlabel End If sngLoginLicznik = sngLoginLicznik + 1 Loop 'WPROWADZANIE DANYCH Cells(sngWiersz, 1) = sngId Cells(sngWiersz, 2) = LCase(TextBox1) Cells(sngWiersz, 3) = UCase(Left(TextBox2, 1)) & LCase(Mid(TextBox2, 2)) Cells(sngWiersz, 4) = StrConv(TextBox3, vbProperCase) Cells(sngWiersz, 5) = LCase(TextBox4) endlabel: End Sub
Jak widzimy w powyższym przykładzie dodaliśmy kolejną zmienną reprezentującą licznik (intLoginLicznik). Kod sprawdzający, czy login jest w bazie na początku sprawdza, czy login był już wprowadzony. Przy użyciu pętli przeszukuje wszystkie dane w kolumnie B i porównuje je z wartością wpisaną w TextBox1 zaczynając od wiersza nr 7. Jeśli login jest w bazie, za pomocą instrukcji GoTo program odsyła nas na sam koniec kodu (etykieta endlabel). Komunikat o istnieniu loginu w naszej bazie wyświetla się z atrybutem vbCritical. Jeśli loginu nie ma w bazie to nasz rekord zostaje wprowadzony. By sprawdzić działanie aplikacji wprowadźmy do pól tekstowych kilka przykładów.
2 komentarze “Kontrolki ActiveX – Pole tekstowe TextBox w Excel VBA”
Formułę na nr wiersza można nieco uprościć i nie korzystać już z funkcji arkusza:
’WYBIERANIE OSTATNIEGO NIEZAPISANEGO WIERSZA I NADAWANIE ID
sngId = 1 + Application.WorksheetFunction.Max(Range(„A:A”))
sngWiersz = 6 + sngID
Sprawdzanie niepowtarzalności loginu u mnie nie działa, jeśli login składa się wyłącznie z cyfr (chyba dlatego, że lewa strona równania jest wówczas liczbą a prawa tekstem). Można np. dodać LCase i wówczas działa: If LCase(Cells(sngLoginLicznik, 2)) = LCase(TextBox1) Then..