VBA Wroclaw 2012-09

From Training Material
Jump to navigation Jump to search

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