MAKRA W EXCEL-u
Transkrypt
MAKRA W EXCEL-u
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: 1. Napisz dwie funkcje obliczające: Public Function obwodkola(R) a. pole trójkąta b. pole prostokąta Pi = 3.1415926535 i zastosuj je do obliczania objętości brył i pola powierzchni. 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: 2. Wstaw przyciski: Sub Proba() a. wykonujące funkcje z ćwiczenia 1 MsgBox "Sie ma!" b. zastosuj różnorodne właściwości dla przycisku End Sub 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() End Sub Pomiędzy dwie linie wpiszmy nazwę procedury Proba Private Sub CommandButton1_Click() Proba End Sub 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 Sub wpis() widzenia! a = InputBox("Policzymy", "Zabawa", "tu wpisz a") Range("b1:c10") = a MsgBox "Do widzenia!" End sub End If 'koniec "jeżeli" 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 End Sub 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 End Sub Sub UndoFormat() ActiveCell.NumberFormat = oldformat End Sub '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 End Sub 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 End Sub 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 End If 6. Ustaw podobne działanie dla wiersza oraz dla dwóch kolumn np. End Sub 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 End If zmiana = Not zmiana NextTick = Now + TimeValue("00:00:01") Application.OnTime NextTick, "UpdateClock" End Sub 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 End Sub 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 End If End With If c Is Nothing Then MsgBox "Ciąg >> " & ciag & " << nie występuje!" Application.ScreenUpdating = True End Sub 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 End Sub 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 End With 'dodaje pozycję rozwijaną do menu NoweMenu Set poz2 = NoweMenu.Controls.Add(Type:=msoControlPopup) With poz2 .Caption = "&Poz2" End With Set podpoz1 = poz2.Controls.Add With podpoz1 .Caption = "&Podpoz1" .Style = msoButtonIconAndCaption .OnAction = "mojemakro3" .FaceId = 1096 End With Set podpoz2 = poz2.Controls.Add With podpoz2 .Caption = "&Podpoz2" .Style = msoButtonIconAndCaption .OnAction = "mojemakro4" .FaceId = 126 End With 'rozpoczyna grupę dla Poz2 poz2.BeginGroup = True End Sub Kod usuwający nasze menu: Sub usun_NoweMenu() On Error GoTo koniec Set NoweMenu = CommandBars("Worksheet Menu Bar").Controls("&NoweMenu") NoweMenu.Delete koniec: End Sub