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