Utworzenie interfejsu graficznego za pomocą formularza użytkownika w VBA Po co? Potrzebne jest nam makro, które będzie wykonywać pewne czynności w osobnym oknie w Excelu. Do tego celu wykorzystamy element UserForm (formularz użytkownika) w VBA Zadanie 1. Utwórz formularzy użytkownika moment, który będzie obliczać moment bezwładności I przekroju prostokątnego, na podstawie danych jego wymiarów b i h, opisany wzorem: Rozwiązanie Zadania 1. 3 bh I = 12 Nasz cel: utworzenie przycisku w arkuszu oraz programu działającego po naciśnięciu przycisku. Wtedy pojawia się okno z formularzem, gdzie uzupełniamy dane i uzyskujemy odpowiedź (wartość momentu bezwładności). Najpierw dodajemy przycisk w arkuszu korzystając z Narzędzia: Deweloper -> Wstaw > Formanty formularza > Przycisk. Możemy też zmienić jego opis na Moment bezwładności. Efekt
Przechodzimy do edytora VBA (Deweloper Wyświetl kod lub Alt+F11) i dodajemy jeden moduł (Insert > Module) i jeden formularz użytkownika (Insert > UserForm) Zmieniamy w formularzu (UserForm) jego nazwę (Name) na moment oraz opis (Caption) na Moment bezwładności (patrz czerwone podkreślenia)
W module (Module) dodajemy makro, które będzie wyświetlać formularz użytkownika po naciśnięciu przycisku w arkuszu. W moim przypadku przycisk nazywa się Przycisk1_Kliknięcie i taka jest też nazwa makra, które się do niego odnosi. Nazwę przycisku można sprawdzić po najechaniu na przycisk w arkuszu i wybraniu spod prawego klawisza myszy opcji Przypisz makro. To jest jedyne polecenie, które umieszczamy w module (Modules > Module 1), pozostałe umieszczamy w formularzu (Forms -> moment). Następnie korzystając z Toolbox a dodajemy do formularza poniższe elementy: 3 x etykiety (Label) 3 x okienka (TextBox) 3 x przyciski (CommandButtton) aby w efekcie otrzymać: teraz modyfikujemy cechy wstawionych elementów (Properties): Element: Nazwa (Name) Opis (Caption) Label1 Wymiar b Label2 Wymiar h Label3 Moment bezwładności przekroju prostokątnego TextBox1 b1 TextBox2 h1 TextBox3 moment1 CommandButton1 Licz_moment1 Oblicz CommandButton2 Czysc_moment1 Wyczyść CommandButton3 Opusc_moment1 Wyjście
Efekt Teraz musimy powiązać ze sobą elementy formularza (okienka b1, h1, moment1 i przyciski Licz_moment1, Czysc_moment1, Opusc_moment1). Najpierw przygotowujemy makro czyszczące formularz. Podwójnie klikamy na obszarze formularza moment (powyżej, tam gdzie czerwona strzałka > na kropeczkach) i wpisujemy: Private Sub UserForm_Initialize() b1.value = "" h1.value = "" moment1.value = "" Opcja Initialize powoduje, że nasze makro jest uruchamiane razem z otwarciem formularza (UserForm) za pomocą przycisku w arkuszu.
Pozostało nam skonfigurowanie co będą robić przyciski Oblicz, Wyczyść i Wyjście. Podwójnie klikając kolejno na przyciski wpisujemy poniższe polecenia. Pod przyciskiem Oblicz znajdują się obliczenia momentu bezwładności pod warunkiem, że pola b1 i h1 nie są puste, wtedy wyświetla się informacja w polu moment1 o treści "Wstaw liczby w pola wymiarów b i h". Private Sub Licz_moment1_Click() If b1.value = "" And h1.value = "" Then moment1 = "Wstaw liczby w pola b i h" moment1 = (b1 * h1 ^ 3) / 12 Pod przyciskiem Wyczyść znajduje się odwołanie do procedury UserForm_Initialize, która czyści zawartość okienek b1, h1 i moment1. Private Sub Czysc_moment1_Click() Call UserForm_Initialize Pod przyciskiem Wyjście znajduje się komenda zamykająca cały formularz. Private Sub Opusc_moment1_Click() Unload Me
Przetestujmy program (wpisywanie danych, działanie przycisków): Ewentualnie możemy dodać pod przyciskiem Oblicz funkcję zaokrąglającą Round (liczba, ilość miejsc po przecinku), aby wynik nie miał tylu cyfr. W tym przykładzie zaokrąglamy do 4 miejsc po przecinku. Private Sub Licz_moment1_Click() If b1.value = "" And h1.value = "" Then moment1 = "Wstaw liczby w pola b i h" moment1 = Round((b1 * h1 ^ 3) / 12, 4) Efekt
Można też zabezpieczyć przed wartościami nieliczbowymi oraz liczbami mniejszymi lub równymi 0 (w końcu b i h to wymiary) jak na przykładzie poniżej. Jeśli tekst informacji o błędzie się nie mieści to można poszerzyć okienka TextBox w formularzu. Private Sub Licz_moment1_Click() If b1.value = "" And h1.value = "" Then moment1 = "Wstaw liczby w pola b i h" If IsNumeric(b1.Value) And IsNumeric(h1.Value) Then If b1.value > 0 And h1.value > 0 Then moment1 = Round((b1 * h1 ^ 3) / 12, 4) moment1 = "Wymiary muszą być większe od 0" moment1 = "Wymiary muszą być liczbami" Efekt