Zadanie 2. Utwórz formularz użytkownika Kalk_izolacji, który będzie obliczać współczynnik przenikania ciepła U dla ściany zewnętrznej przy zadanej warstwie konstrukcyjnej, materiale izolacyjnym i jego grubości d izol (podanej w cm) zgodnie ze wzorem: 1 U = R R T T d = 0,13 + λ konstr konstr d + λ izol izol + 0,04 W formularzu, dla użytkownika, dostępne mają być: materiały konstrukcyjne: o cegła pełna 25 cm, d cegla = 0,25 m, λ cegla = 0,770 W/mK, o beton komórkowy 24 cm, d betkom = 0,24 m, λ betkom = 0,110 W/mK, o bloczki betonowe 24cm, d beton = 0,24 m, λ beton = 1,700 W/mK, materiały izolacyjne: o styropian, d izol definiuje użytkownik, λ izol = λ styro = 0,036 W/mK, o wełna mineralna, d izol definiuje użytkownik, λ izol = λ welna = 0,042 W/mK, Użytkownik po podaniu rodzaju warstwy konstrukcyjnej (cegła pełna, beton komórkowy lub bloczki betonowe), rodzaju materiału izolacyjnego (styropian lub wełna mineralna) i jego grubości d dostaje informację o wartości współczynnika przenikania ciepła U takiej przegrody. Dodać też zabezpieczenia Przykładowy efekt końcowy
Rozwiązanie Zadania 2. Najpierw dodajemy przycisk w arkuszu korzystając z Narzędzia: Deweloper -> Wstaw > Formanty formularza > Przycisk. Możemy też zmienić jego opis na Kalkulator izolacji. 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 np. Kalk_U oraz opis (Caption) na Kalkulator U izolacyjność cieplna ściany. W module (u mnie w Module2) dodajemy makro, które będzie wyświetlać formularz użytkownika po naciśnięciu przycisku w arkuszu. W moim przypadku przycisk nazywa się Przycisk7_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 > Module2), pozostałe umieszczamy w formularzu (Forms -> Kalk_U). Private Sub Przycisk7_Kliknięcie() Kalk_U.Show Następnie korzystając z Toolbox a dodajemy do formularza poniższe elementy (idąc od góry wg wzory powyżej): 1 x Label 1 x ListBox 1 x Frame (2 x OptionButton, 1 x Label, 1 x TextBox) 1 x Label 1 x TextBox 3 x CommandButtton Teraz modyfikujemy cechy wstawionych elementów (Properties): Element: Nazwa (Name) Opis (Caption) Label Wybierz materiał konstrukcyjny ściany ListBox ScianaListBox Frame Wybierz rodzaj izolacji i podaj jej grubość OptionButton Izo_Styro Styropian OptionButton Izo_Welna Wełna mineralna Label Grubość izolacji [cm] TextBox d Label Współczynnik U [W/m2K] TextBox U CommandButtton Licz_U Oblicz CommandButtton Czysc_U Wyczyść CommandButtton Wyjdz_U Wyjdź
Efekt Teraz musimy powiązać ze sobą elementy formularza (wybór z listy w ScianaListBox, zaznaczenie izolacji za pomocą jednego z OptionButton, podanie grubości d, uzyskanie wyniku w U oraz przycisków Licz_U, Czysc_U i Wyjdz_U). Najpierw przygotowujemy makro czyszczące formularz. Podwójnie klikamy na obszarze formularza Kalk_U i wpisujemy: Private Sub UserForm_Initialize() ScianaListBox.Clear With ScianaListBox.AddItem "Cegła pełna 25 cm".additem "Beton komórkowy 24 cm".additem "Bloczki betonowe 24 cm" End With Izo_styro.Value = False Izo_welna.Value = False d.value = "" U.Value = "" ScianaListBox.Clear czyści nam listę w ListBox, inaczej za każdy razem, gdy naciśniemy Wyczyść kolejne trzy pozycje za pomocą polecenia With by się dodawały. Polecenie With uzupełnia nam listę w ListBox pozycjami (Cegła pełna 25 cm, Beton komórkowy 24 cm, Bloczki betonowe 24 cm), polecenie Izo_styro.Value = False oraz Izo_welna.Value = False odznaczają przyciski Optionbutton (trzeba je ponownie zaznaczyć, gdy naciśniemy Wyczyść). 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. Private Sub Czysc_U_Click() 'ponowne uruchomienie procedury czyszczenia (UserForm_Initialize) Call UserForm_Initialize
Private Sub Licz_U_Click() 'Definiujemy parametry warstw konstrukcyjnych d_cegla = 0.25 l_cegla = 0.77 d_betkom = 0.24 l_betkom = 0.11 d_beton = 0.24 l_beton = 1.7 'Definiujemy parametry izolacji cieplnych l_styro = 0.036 l_welna = 0.042 'A gdy użytkownik nie zaznaczy żadnego materiału warstwy konstrukcyjnej If ScianaListBox.ListIndex = -1 Then U = "Wybierz materiał konstrukcyjny" 'A gdy użytkownik nie zaznaczy żadnego rodzaju izolacji ElseIf Izo_styro.Value = False And Izo_welna.Value = False Then U = "Wybierz rodzaj izolacji" 'A gdy użytkownik nie poda grubości izolacji ElseIf d = "" Then U = "Podaj grubość izolacji" 'A gdy użytkownik poda grubość izolacji jako wartość nieliczbową ElseIf IsNumeric(d) = False Then U = "Grubość musi być liczbą" 'A gdy użytkownik poda grubość izolacji jako wartość ujemną (bo zerowa może być - czyli jej nie ma) ElseIf d < 0 Then U = "Grubość musi być dodatnia" 'A teraz to już nie można źle policzyć :), więc w zależności od zaznaczeń wzory na U są następujące Else If ScianaListBox = "Cegła pełna 25 cm" And Izo_styro.Value = True Then 'np. obliczenia oporu RT, gdy użytkownik wybrał ścianę z cegły i izolację ze styropianu są wg następującego wzoru zauważmy, że grubość podawana będzie w centymetrach - za właściwe przeliczenie jednostek jest odpowiedzialny człon (d/100) RT = 0.13 + (d_cegla / l_cegla) + ((d / 100) / l_styro) + 0.04 'to już znamy - zaokrąglenie U do 3 miejsc ElseIf ScianaListBox = "Cegła pełna 25 cm" And Izo_welna.Value = True Then RT = 0.13 + (d_cegla / l_cegla) + ((d / 100) / l_welna) + 0.04 ElseIf ScianaListBox = "Beton komórkowy 24 cm" And Izo_styro.Value = True Then RT = 0.13 + (d_betkom / l_betkom) + ((d / 100) / l_styro) + 0.04 ElseIf ScianaListBox = "Beton komórkowy 24 cm" And Izo_welna.Value = True Then RT = 0.13 + (d_betkom / l_betkom) + ((d / 100) / l_welna) + 0.04 ElseIf ScianaListBox = "Bloczki betonowe 24 cm" And Izo_styro.Value = True Then RT = 0.13 + (d_beton / l_beton) + ((d / 100) / l_styro) + 0.04 ElseIf ScianaListBox = "Bloczki betonowe 24 cm" And Izo_welna.Value = True Then RT = 0.13 + (d_beton / l_beton) + ((d / 100) / l_welna) + 0.04 End If End If
Private Sub UserForm_Initialize() 'czyszczenie listy przed ponownym zapełnieniem Listbox'a ScianaListBox.Clear 'zapełnianie na nowo ListBox'a With ScianaListBox.AddItem "Cegła pełna 25 cm".additem "Beton komórkowy 24 cm".additem "Bloczki betonowe 24 cm" End With 'odznaczenie przycisków z rodzajem izolacji Izo_styro.Value = False Izo_welna.Value = False 'czyszczenie komórek d i U d.value = "" U.Value = "" Private Sub Wyjdz_U_Click() 'wyjście z programu Unload Me
Przetestujmy program (wpisywanie danych, działanie przycisków):