VBA Wroclaw 2012-09
Podstawy
Lewostronne przypisanie
lewa=wyrazenie
Wywołanie polecenia
lewa.polecenie
Deklarowanie zmiennych
Dim nazwa_zmiennej Dim nazwa_zmiennej As typ
Dim a as integer
Procedury
Sub nazwa() 'zawartość procedury End Sub
przykład
Sub Wypisz25() Range("A1")=25 End Sub
Funkcje
Składnia
Function nazwa(argument) nazwa= wynik End Function
Function PoleKola(r) PoleKola = 3.1415 * r ^ 2 End Function
Pełna składnia:
Function PoleTrapezu(a As Double, b As Double, h As Double) As Double Dim wynik As Double wynik = 1 / 2 * (a + b) * h PoleTrapezu = wynik End Function
Opcje modułu
Option Explicit
wymusza jawne deklarowanie zmiennych
Instrukcja warunkowa
Pierwsza postać
Składnia
If warunek Then dzialanie
Nie może być znaku <Enter>!
Przykład
If liczba < 0 Then Range("B1").Font.Color = vbRed
Druga postać
Składnia
If warunek Then dzialanie End if
Przykład
If liczba < 0 Then Range("B1").Font.Color = vbRed End if
<Enter> po Then, konieczny End if
Pętle
Pętla FOR
Pętla for z założenia powinna wykonać się określoną liczbę razy, np. 10, 100, 1000
Licznikiem pętli powinna być liczba całkowita
Składnia
Dim zmienna as Integer 'licznik pętli For zmienna = wartosc_poczatkowa To wartosc_koncowa 'dzialanie Next a
Przykład
Dim a As Integer For a = 1 To 10 Cells(a, 1) = a Next a
Pętla FOR EACH
Pętla for each to odmiana pętli for, która wykonuje się dla każdego elementu kolekcji. Nie musimy wiedzieć, ile jest elementów w kolekcji - zadziała dobrze dla kolekcji 1-elementowej jak i wieloelementowej.
Licznikiem petli może być zmienna typu Variant (tak jest najwygodniej)
Składnia
Dim zmienna As Variant 'licznik pętli For Each zmienna In kolekcja 'dzialanie Next zmienna
Przykład
Dim arkusz As Variant For Each arkusz In Sheets arkusz.Visible = True Next arkusz
Pętle DO
Pętle Do wykorzystuje się w sytuacji, kiedy nie wiadomo ile razy dany fragment kodu ma zostać powtórzony.
Przykład
Dim haslo As String Do haslo = InputBox("Podaj hasło") Loop While haslo <> "tajne"
Nie wiadomo, za którym razem użytkownik poda hasło "tajne".
Warunek można sprawdzać na pocżatku (po DO) lub na końcu (po LOOP) pętli
Warunek sprawdzany na początku:
Do While haslo <> "tajne" haslo = InputBox("Podaj hasło") Loop
Pętla DO, która sprawdza warunek na końcu (po LOOP) wykona się zawsze PRZYNAJMNIEJ RAZ
Przykład pętli nieskończonej z warunkiem przerwania
Sub PierwszaPustaNieskonczonaPetla() Range("A1").Select Do If ActiveCell.Value = "" Then Exit Do 'Sub ActiveCell.Offset(1, 0).Select Loop While True MsgBox ActiveCell.Address End Sub
Funkcje tekstowe
Najczęściej używane funkcje tekstowe - pełniejszy opis na stronie http://training-course-material.com/training/Visual_Basic_for_Applications_(VBA)_w_Excel_-_wstep_do_programowania
Dim napis As String napis = " dUżo biAŁych zNAków " Debug.Print "P" & napis & "K" Debug.Print "P" & Trim(napis) & "K" 'usuwa zbędne odstępy przed pierwszą literą i po oststniej, a w środku nie Debug.Print "P" & WorksheetFunction.Trim(napis) & "K" 'USUŃ.ZBĘDNE.ODSTĘPY Debug.Print "P" & LCase(napis) & "K" 'LITERY.MAŁE Debug.Print "P" & UCase(napis) & "K" 'LITERY.WIELKIE Debug.Print "P" & WorksheetFunction.Proper(napis) & "K" napis = "Janek Kowalski" Debug.Print Left(napis, 3) 'LEWY Debug.Print Right(napis, 8) 'PRAWY Debug.Print Mid(napis, 5, 3) 'FRAGMENT.TEKSTU Debug.Print InStr(1, napis, "a") Debug.Print Len(napis) 'DŁ 'zadanie - z tekstu "imię nazwisko" wypisz nazwisko Debug.Print Mid(napis, InStr(1, napis, " ") + 1) Debug.Print Right(napis, Len(napis) - InStr(1, napis, " ")) napis = "$A$1300" 'zadanie - wypisz numer wiersza z adresu bezwzględnego komórki Debug.Print Mid(napis, InStr(2, napis, "$") + 1) Debug.Print Mid(napis, InStrRev(napis, "$") + 1)
Obsługa błędów czasu działania/wykonania
Do obsługi błędów runtime error można użyć konstrukcji On Error ...
Przykład
Sub TestBledow2() On Error GoTo obsluga Dim a As Integer a = 10 a = InputBox("Podaj liczbę") MsgBox a Exit Sub obsluga: MsgBox Err.Description, vbCritical, "Numer błędu: " & Err.Number Resume 'Next End Sub