Formularze VBA Przykład1 INTERAKTYWNY FORMULARZ Program tworzący interaktywny formularz. Objaśnienie: w dowolnym momencie można wprowadzić wartość w polu tekstowym ID, Excel VBA wczytuje odpowiedni rekord. Gdy klikniesz przycisk Edit/Add, Excel VBA edytuje zapis na karcie lub dodaje rekord, gdy identyfikator jeszcze nie istnieje. Przycisk Clear czyści wszystkie pola tekstowe. Przycisk Close zamyka formularz UserForm. Aby utworzyć formularz, należy wykonać następujące kroki. 1. Otwórz Visual Basic Editor. Jeżeli Project Explorer nie jest widoczny, kliknij View ->Project Explorer. 2. Kliknij Insert->Userform. Jeżeli Toolbox nie pojawi się automatycznie, kliknij View -> Toolbox. Otrzymany widok powinien być jak poniżej.
3. Dodaj etykiety (kontrolka Label), pola tekstowe (kontrolka TextBox) (pierwszy na górze, drugi poniżej pierwszej, i tak dalej) i przyciski poleceń (kontrolka CommandButton). Gdy to zostało zakończone, wynik powinien być zgodny z obrazem UserForm przedstawionym wcześniej. Na przykład, należy utworzyć pole tekstowe ID klikając na TextBox z przybornika Controls. Następnie można przeciągnąć pole tekstowe na UserForm. 4. Możesz zmienić właściwości name i caption na obiektach. Właściwość name jest używana do identyfikacji obiektu. Właściwość caption jest tylko wyświetlana na ekranie. Dobrą praktyką jest, aby zmienić nazwy formantów, ale to nie jest konieczne tutaj, ponieważ mamy tylko kilka kontrolek. Aby zmienić podpisy etykiety, pól tekstowych i przycisków poleceń, kliknij menu View- >Properties Window i kliknij na każdą kontrolkę, wówczas można zmienić ich właściwości np. caption jako tekst wyświetlany. 5. Aby zobaczyć formularz, dodaj przycisk poleceń w arkuszu (zakładka deweloper -> Wstaw ->przycisk) oraz go kliknij, a następnie dodaj następującą linijkę kodu: Private Sub Przycisk1_Kliknięcie () UserForm1.Show Tworzymy procedurę UserForm_Initialize. Kiedy ją wywołujemy pojawia się automatycznie formularz UserForm1. 6. Otwórz Visual Basic Editor. 7. W Project Explorer, kliknij prawym przyciskiem na UserForm1 (z Forms) oraz wybierz opcję View Code. 8. Wybierz Userform z wybieranej listy po lewej stronie. Wybierz Initialize z wybieranej listy po prawej stronie. 9. Dodaj następujący kod programu:
Private Sub UserForm_Initialize() TextBox1.SetFocus Objaśnienie: Ten wiersz kodu ustawia kursor na pierwszym polu tekstowym, gdy uruchomimy formularz. 10. W Project Explorer, kliknij prawym przyciskiem na UserForm1 oraz wybierz opcję View Code. 11. Wybierz TextBox1 z wybieranej listy po lewej stronie. Wybierz Change z wybieranej listy po prawej stronie. 12. Dodaj następujący kod programu: Private Sub TextBox1_Change() GetData 13. W Project Explorer, podwójnie kliknij na UserForm1. 14. Podwójnie kliknij na przycisku Edit / Add. 15. Dodaj następujący kod programu: Private Sub CommandButton1_Click() EditAdd 16. Podwójnie kliknij na przycisku Clear. 17. Dodaj następujący kod programu: Private Sub CommandButton2_Click() ClearForm Objaśnienie: te procedury wywołują inne procedury, które zostaną napisane później. 18. Podwójnie kliknij na przycisku Close. 19. Dodaj następujący kod programu: Private Sub CommandButton3_Click() Unload Me
Objaśnienie: zamknięcie formularza. Czas napisać procedury. Umieść następujące procedury w module kodu (Visual Basic Editor-> Insert->Module). 20. W pierwszej kolejności, deklarujemy trzy zmienne typu Integer i jedną Boolean. Deklaracja zmiennych stanowi globalną deklaracje dla całego modułu (na górze modułu). W ten sposób deklarujemy zmienne tylko raz i używamy ich w wielu procedurach. Dim id As Integer, i As Integer, j As Integer, flag As Boolean 21. Dodaj procedurę GetData. Sub GetData() If IsNumeric(UserForm1.TextBox1.Value) Then flag = False i = 0 id = UserForm1.TextBox1.Value Do While Cells(i + 1, 1).Value <> "" Loop If Cells(i + 1, 1).Value = id Then flag = True For j = 2 To 3 UserForm1.Controls("TextBox" & j).value = Cells(i + 1, j).value i = i + 1 If flag = False Then For j = 2 To 3 UserForm1.Controls("TextBox" & j).value = "" Else ClearForm Objaśnienie: Jeśli pole tekstowe ID zawiera wartość numeryczną, Excel VBA wyszukuje ID i ładuje odpowiedni rekord. Używamy kolekcji Controls, aby przypisać wartości do kolejnych pól tekstowych. Jeśli program Excel VBA nie można znaleźć identyfikatora (flaga jest wciąż fałszywa), pola tekstowe Name i City są czyszczone. Jeśli pole tekstowe ID nie zawiera wartości numerycznej, Excel VBA wywołuje procedurę ClearForm. 22. Dodaj procedurę ClearForm. Sub ClearForm() For j = 1 To 3 UserForm1.Controls("TextBox" & j).value = ""
Objaśnienie: Excel VBA czyści wszystkie pola tekstowe. 23. Dodaj procedurę EditAdd. Sub EditAdd() Dim emptyrow As Long If UserForm1.TextBox1.Value <> "" Then flag = False i = 0 id = UserForm1.TextBox1.Value emptyrow = WorksheetFunction.CountA(Range("A:A")) + 1 Do While Cells(i + 1, 1).Value <> "" Loop If Cells(i + 1, 1).Value = id Then flag = True For j = 2 To 3 Cells(i + 1, j).value = UserForm1.Controls("TextBox" & j).value i = i + 1 If flag = False Then For j = 1 To 3 Cells(emptyRow, j).value = UserForm1.Controls("TextBox" & j).value Objaśnienie: Jeśli pole tekstowe ID nie jest puste, Excel VBA edytuje rekord na arkuszu (przeciwieństwo do ładowania rekordu jak widzieliśmy wcześniej). Jeśli program Excel VBA nie może znaleźć identyfikatora (flaga jest wciąż fałszywa), dodaje zapis do następnego pustego wiersza. Zmienna emptyrow zawiera numer pierwszego pustego wiersza i jest zwiększana za każdym razem gdy rekord zostanie dodany. 24. Testujemy. Opuść Visual Basic Editor, wstaw opisy danych w arkuszu jak poniżej za pomocą formularza Userform.
PODPOWIEDŹ: - Jeżeli nie rozumiesz kodu programu lub szukasz błędu, możesz wstawić znaczniki przerywające wykonywanie programu w dowolnej linijce kodu (Debug -> Toggle Breakpoint). Kolejno można wykonywać program linijka po linijce (Debug->Step into (F8)) - Jeżeli nie wiesz jaką wartość ma dana zmienna możesz tą wartość wypisać za pomocą funkcji Debug.Print
Przykład2 NIEZALEŻNE COMBO BOXY Poniżej zamieszczono program w Excel VBA, który tworzy formularz z niezależnymi polami kombi. Użytkownik wybiera typ zainteresowania z pierwszej listy rozwijanej, a następnie może wybrać szczegóły zainteresowania z kolejnej listy rozwijanej (w zależności od wartości wybranej na pierwszej liście). Aby utworzyć formularz, należy wykonać następujące kroki. 1. Otwórz Visual Basic Editor. Jeżeli Project Explorer nie jest widoczny, kliknij View ->Project Explorer. 2. Kliknij Insert->Userform. Jeżeli Toolbox nie pojawi się automatycznie, kliknij View -> Toolbox. Otrzymany widok powinien być jak poniżej. 3. Dodaj pola kombi (pierwszy z lewej, drugi po prawej) i przycisk polecenia. Gdy to zostało zakończone, wynik powinien być zgodny z obrazem UserForm przedstawionym wcześniej. Na przykład można utworzyć formant pola kombi klikając na ComboBox z przybornika Controls. Następnie można przeciągnąć pole kombi na UserForm. 4. Istnieje możliwość zmiany właściwości name i caption. W tym krótkim przykładzie można zmienić tylko wyświetlane napisy (właściwość caption). 5. Aby zobaczyć formularz, dodaj przycisk poleceń w arkuszu (zakładka deweloper -> Wstaw ->przycisk) oraz go kliknij, a następnie dodaj następującą linijkę kodu:
Private Sub CommandButton1_Click () UserForm1.Show Tworzymy procedurę UserForm_Initialize. Kiedy ją wywołujemy pojawia się automatycznie formularz UserForm1. 6. Otwórz Visual Basic Editor. 7. W Project Explorer, kliknij prawym przyciskiem na UserForm1 (z Forms) oraz wybierz opcję View Code. 8. Wybierz Userform z wybieranej listy po lewej stronie. Wybierz Initialize z wybieranej listy po prawej stronie. 9. Dodaj następujący kod programu: Private Sub UserForm_Initialize() With ComboBox1.AddItem "Animals".AddItem "Sports".AddItem "Food" End With Objaśnienie: Ten kod programu wypełnia listę pola kombi. Poniżej należy stworzyć kod programu, który powoduje wypełnienie drugiego pola kombi danymi, w zależności od zaznaczonej opcji na pierwszym polu kombi. 10. W Project Explorer, podwójnie kliknij na UserForm1. 11. Podwójnie kliknij na pierwsze pole kombi. 12. Dodaj następując kod programu: Private Sub ComboBox1_Change() Dim index As Integer index = ComboBox1.ListIndex numer zaznaczonej opcji ComboBox2.Clear Select Case index Case Is = 0 With ComboBox2.AddItem "Dog".AddItem "Cat"
.AddItem "Horse" End With Case Is = 1 With ComboBox2.AddItem "Tennis".AddItem "Swimming".AddItem "Basketball" End With Case Is = 2 With ComboBox2.AddItem "Pancakes".AddItem "Pizza".AddItem "Chinese" End With End Select 13. Podwójnie kliknij na przycisk Import. 14. Dodaj następujący kod programu: Private Sub CommandButton1_Click() Range("A1").Value = ComboBox2.Value 15. Przetestuj utworzony program.