MAKRA W EXCEL-u 1. Pierwsza funkcja użytkownika Wybieramy z menu: "NARZĘDZIA/MAKRA/EDYTOR VISULA BASIC", a następnie wstawmy moduł makr - menu: "INSERT/MODULE". Moduł to taki arkusz w którym są przechowywane makra. Wpiszmy tam następujący kod: Public Function obwodkola(r) Pi = 3.1415926535 obwodkola = 2 * Pi * R End Function W excel-u wpisz np. =obwodkola(a1), gdy w A1 jest wpisana wartość, funkcja jest dostępna w grupie funkcji użytkownika w oknie kreatora funkcji 2. Procedury wykorzystanie funkcji MsgBox Wpiszmy w module taki kod: Sub Proba() MsgBox "Sie ma!" Do arkusza dodamy przycisk wywołujący komunikat. Z paska "przybornik formantów" wybierz przycisk polecenia (CommandButton) i osadźmy go w arkuszu excela. Prawym klawiszem klikamy na przycisku i wybieramy "właściwości". Zmieniamy właściwości np. "caption" z "CommandButton1" na dowolny tekst, np. "Pozdrowienia". Zamknijmy okno właściwości. Ponownie klikamy prawym klawiszem na przycisk i wybieramy "kod". Otworzy się nam okno edytora VBA z początkiem i końcem procedury: Private Sub CommandButton1_Click() Pomiędzy dwie linie wpiszmy nazwę procedury Proba Private Sub CommandButton1_Click() Proba Na pasku "przybornik formantów" wyłączmy jeszcze tryb projektowania (przycisk z ekierką). Teraz kliknij utworzony przycisk polecenia. Zobacz efekt. 3. Procedury rozbudowanie funkcji MsgBox Korzystając z pomocy Office rozbuduj funkcję MsgBox, np. Sub Proba() komunikat = MsgBox("Hello World!", vbinformation + vbokcancel) If komunikat = 1 Then 'jeżeli zostanie wybrany przycisk OK to wyświetl komunikat Dzień Dobry! MsgBox "Dzień Dobry!" Else 'w przeciwnym wypadku wyświetl Do widzenia! MsgBox "Do widzenia!" 'koniec "jeżeli" 1. Napisz dwie funkcje obliczające: a. pole trójkąta b. pole prostokąta i zastosuj je do obliczania objętości brył i pola powierzchni. 2. Wstaw przyciski: a. wykonujące funkcje z ćwiczenia 1 b. zastosuj różnorodne właściwości dla przycisku Sub wpis() a = InputBox("Policzymy", "Zabawa", "tu wpisz a") Range("b1:c10") = a End sub 3. Zastosuj różne okna dialogowe: Msgbox (Komunikat [, Przyciski] [, Tytuł] [, PlikHelp, HelpContext]) InputBox(Pytanie [, Tytuł] [, DomyślnyTekst] [, XPos] [, YPos] [,PlikHelp, HelpContext])
4. Uruchomienie makra formułą Nie jest możliwe bezpośrednie uruchomienie makra za pomocą formuły, czyli np. =JEŻELI(B1="xyz";MAKRO1;MAKRO2) Można natomiast to zrobić pośrednio: krok 1) np. napisać w komórce A1: =JEŻELI(B1="xyz";1;0) krok 2) W kodzie arkusza należy wpisać: Private Sub Worksheet_Calculate() 4. Wykorzystaj procedury poprzednie sprawdz = Range("A1").Value Select Case sprawdz Case 1 Call Makro1 nazwa makra1 dla wartości Prawda Case 0 Call Makro2 'nazwa makra2 dla wartości Fałsz End Select Każde zmiana wartości w komórce A1 (gdzie jest formuła)) spowoduje uruchomienie kodu - sprawdzenie wartości w komórce A1 i uruchomienie odpowiedniego makra! 5. Cofanie makra Wykonanie makra nie umożliwia jego cofnięcia. Odpowiednie napisanie kodu może umożliwić cofanie makra. Poniższy kod jest tylko przykładem. Cofamy tutaj makro zmieniające format liczbowy aktywnej komórki. /w Module/ 5. Zabawy np. Range("A1:A6").Interior.Color = RGB(200, 160, 35) Private oldformat As String Range("c6:e10").NumberFormat = oldformat Sub Format() oldformat = ActiveCell.NumberFormat 'zapamiętuje jaki był poprzedni format liczbowy ActiveCell.NumberFormat = "#,##0.00" 'zamienia format liczbowy Application.OnUndo "Cofnij formatowanie", "UndoFormat" 'przysuje metodzie undo makro przywracające stary format Sub UndoFormat() ActiveCell.NumberFormat = oldformat 'wstawia stary format liczbowy 6. Funkcja zwracająca kolor wypełnienia komórki Funkcja zwracająca kolor wypełnienia komórki w postaci indexu (numeru) koloru. Nie przelicza w momencie zmiany formatu komórki /w Module/ Function kolorkomorki(adres As Range) kolorkomorki = adres.interior.colorindex End Function 6. Zadania a. Wypełnij kolorem kilka komórek b. sprawdź ich kod c. utwórz też funkcję określającą kolor czcionki Sub kolor_tła() For a = 1 To 56 Cells(a + 1, 1).Interior.ColorIndex = a Cells(a + 1, 1).Value = a Next Sub kolor_czcionki() For a = 1 To 56 ' najwyżej 56 Cells(a + 1, 3).Font.ColorIndex = a Cells(a + 1, 3).Value = a Next
7. Makro działające po wybraniu określonej komórki Makro działające tylko wtedy, gdy aktywowana będzie dowolna komórka w np. w kolumnie B Kod należy wpisać do odpowiedniego arkusza: Private Sub Worksheet_SelectionChange(ByVal Target As Range) nrkolumny = 2 'np. numer kolumny B=2 If Target.Column = nrkolumny Then MsgBox "Działa!" 'tutaj może być inne Makro 6. Ustaw podobne działanie dla wiersza oraz dla dwóch kolumn np. If Target.Column > 2 And Target.Column < 10 Then 8. Migająca komórka Kod zmienia w odstępach co jedną sekundę formatowanie komórki dając efekt migającej czcionki, albo zmieniającego się tła komórki: /w Module/ uruchom makro Private zmiana As Boolean Sub UpdateClock() Dim zakres As Range Set zakres = Range("A1:c10") If zmiana Then zakres.interior.colorindex = xlnone zakres.font.color = vbblack Else zakres.interior.color = vbred zakres.font.color = vbwhite zmiana = Not zmiana NextTick = Now + TimeValue("00:00:01") Application.OnTime NextTick, "UpdateClock" 8. Rozpocznij w NOWYM Arkuszu 9. Nazwa kolumny w postaci literowej Trochę to dziwne, ale chyba nie ma właściwości zwracającej nazwę kolumny w postaci literowej. Poniższy kod zwraca nazwy kolumn zaznaczonego zakresu w postaci literowej: Sub nazwa_kolumny() Dim mrange As Range Set mrange = Selection kolumny = "" For Each komorka In mrange nazwa = Application.Substitute(Cells(1, komorka.column).address(false, False), "1", "") kolumny = kolumny & " " & nazwa Next komorka MsgBox kolumny
10. Filtr w wierszu /szukanie ciągu znaków/ Czasami potrzebujemy filtrować /wyszukiwać/ w wierszu. Brak jest takiego wbudowanego mechanizmu w excelu. Oto makro rozwiązujące ten problem (kod należy wstawić w arkusz, w którym chcemy mieć tę funkcjonalność): Private Sub Worksheet_BeforeRightClick(ByVal Target As Range, Cancel As Boolean) 'Kliknij wiersz poszukiwań prawym klawiszem myszy If Selection.Rows.Count <> 1 Or Selection.Cells.Count = 1 Then End ' Cancel = True ciag = InputBox("Podaj szukany ciąg.") If ciag = "" Then End Application.ScreenUpdating = False With Selection Set c =.Find(ciag, LookIn:=xlValues) If Not c Is Nothing Then pierw_adr = c.address Columns.ColumnWidth = 0.05 Do Range(c.Address).EntireColumn.AutoFit Set c =.FindNext(c) Loop While Not c Is Nothing And c.address <> pierw_adr If c Is Nothing Then MsgBox "Ciąg >> " & ciag & " << nie występuje!" Application.ScreenUpdating = True Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Excel.Range, Cancel As Boolean) ' kliknij 2x lewym = pokaż wszystkie kolumny Columns("A:IV").ColumnWidth = 8.43 Selection.CurrentRegion.EntireColumn.AutoFit
Menu - VBA Aby dodać przy pomocy VBA nową pozycję menu: Sub dodaj_nowemenu() 'dodaje NoweMenu do paska menu Set NoweMenu = CommandBars("Worksheet Menu Bar").Controls.Add(Type:=msoControlPopup, before:=10) 'before:=10 - określa w którym miejscu wstawia NoweMenu NoweMenu.Caption = "&NoweMenu" 'dodaje pozycję do nowego menu Set poz1 = NoweMenu.Controls.Add With poz1.caption = "&Poz1".OnAction = "mojemakro5".faceid = 160 'dodaje pozycję rozwijaną do menu NoweMenu Set poz2 = NoweMenu.Controls.Add(Type:=msoControlPopup) With poz2.caption = "&Poz2" Set podpoz1 = poz2.controls.add With podpoz1.caption = "&Podpoz1".Style = msobuttoniconandcaption.onaction = "mojemakro3".faceid = 1096 Set podpoz2 = poz2.controls.add With podpoz2.caption = "&Podpoz2".Style = msobuttoniconandcaption.onaction = "mojemakro4".faceid = 126 'rozpoczyna grupę dla Poz2 poz2.begingroup = True Kod usuwający nasze menu: Sub usun_nowemenu() On Error GoTo koniec Set NoweMenu = CommandBars("Worksheet Menu Bar").Controls("&NoweMenu") NoweMenu.Delete koniec: