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 SubObjaś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..