Table of Contents

Excel VBA alapjai

Az Excel VBA (Visual Basic for Applications) egy eseményvezérelt programozási nyelv, amely lehetővé teszi az Excel alkalmazások automatizálását és testreszabását. Ebben a részben az Excel VBA alapvető nyelvi elemeit mutatjuk be, beleértve a változók deklarálását, az alapvető típusokat és a vezérlési elemeket.

Makrók engedélyezése

A Fájl/Beállítások/Adatvédelmi központ-nál állítsuk be a makrók engedélyezését és utána zárjuk be a munkafüzetet és indítsuk újra.

Fejlesztőeszközök (Developer) bekapcsolása:

Fájl → Beállítások → Menüszalag testreszabása → Pipáljuk be a Fejlesztőeszközök-et.

Válasszuk ki a “Fejlesztőeszközök” fület, majd a “Makrók” gomb megnyomása utána felugró ablakban a jobb egérgombbal megjelenő menüben illesszünk be egy új modult:

Definiáljunk egy teszt függvényt ami visszaad egy konstans értéket.

Function teszt()
   teszt = 1
End Function

használata: írjuk be egy cellába =teszt()

Változók Deklarálása

A VBA-ban a változók deklarálása a Dim kulcsszóval történik. A változó típusát is megadhatjuk a deklaráció során, ami segít a kód olvashatóságában és a típushibák elkerülésében.

Dim szam As Integer
Dim szoveg As String

Alapvető Típusok

A VBA számos alapvető adattípust támogat, többek között:

Kör területének számítása

Sub Test()
   Dim r As Double
   Dim area As Double
   
   r = InputBox("Kérem a kör sugarát")
   
   area = r * r * Application.WorksheetFunction.Pi
   
   MsgBox area
End Sub

Vezérlési Elemek

A VBA vezérlési szerkezetei lehetővé teszik a program ágának irányítását a különböző feltételek alapján.

If szam > 10 Then
    MsgBox "A szám nagyobb, mint 10."
Else
    MsgBox "A szám 10 vagy annál kisebb."
End If

For i = 1 To 5
    MsgBox "Szám: " & i
Next i

Itt fontos megjegyezni hogy a szövegeket & jellel adjuk össze, nem a plusz operátorral!

i = 1
Do While i <= 5
    MsgBox "Szám: " & i
    i = i + 1
Loop


Sztringek kezelése

A VBA-ban a stringek kezelésének alapjai közé tartozik a változók deklarálása, értékadás, és az összehasonlítás.

  // Deklarálás
  Dim exampleString As String
  
  // Értékadás
  exampleString = "Hello World"

Műveletek Sztringekkel

Összefűzés:

A & operátort használva fűzhetünk össze sztringeket.

  Dim firstName As String
  Dim lastName As String
  Dim fullName As String
  
  firstName = "John"
  lastName = "Doe"
  
  fullName = firstName & " " & lastName // "John Doe"

A Len függvény visszaadja a string hosszát.

  Dim textLength As Integer
  textLength = Len("Hello World") // 11

Részsztring Kinyerése

A Mid függvényt használva kinyerhetünk egy részsztringet egy adott pozíciótól kezdődően, adott hosszúságban.

  Dim subString As String
  subString = Mid("Hello World", 7, 5) // "World"

Keresés a Sztringben

A InStr függvény visszaadja egy substring első előfordulásának pozícióját egy másik stringben.

  Dim position As Integer
  position = InStr("Hello World", "World") // 7

Sztring Nagy- és Kisbetűssé Alakítás

A UCase és LCase függvényeket használva nagybetűssé, illetve kisbetűssé alakíthatunk egy sztringet.

  Dim upperCaseString As String
  Dim lowerCaseString As String
  
  upperCaseString = UCase("Hello World") // "HELLO WORLD"
  lowerCaseString = LCase("Hello World") // "hello world"

Sztring Összehasonlítás

A StrComp függvényt használva összehasonlíthatunk két stringet, figyelembe véve a nagy- és kisbetűk különbségét is.

  Dim result As Integer
  
  // 0, ha a stringek egyenlőek
  result = StrComp("Hello", "hello", vbTextCompare) // egyenlő, hiába H != h
  result = StrComp("Hello", "Hello", vbBinaryCompare) // Egyenlő


Vektorok, tömbök kezelése

  Dim szamok(0 To 4) As Integer

Ez egy 5 elemű tömb (indexei: 0, 1, 2, 3, 4), amely egész számokat tárol.

Sub FixMeretuTomb()
    Dim szamok(0 To 2) As Integer
    szamok(0) = 10
    szamok(1) = 20
    szamok(2) = 30

    MsgBox szamok(1)  ' Kiírja: 20
End Sub

Változó méretű tömb:

Sub DinamikusTomb()
    Dim tomb() As String
    ReDim tomb(1 To 3)

    tomb(1) = "alma"
    tomb(2) = "banán"
    tomb(3) = "citrom"

    MsgBox tomb(2)  ' banán
End Sub

Tömb különböző típusú elemekkel:

Sub FixMeretuTomb()
   Dim arr(5)
   arr(0) = "1"           'Number as String
   arr(1) = "VBScript"    'String
   arr(2) = 100           'Number
   arr(3) = 2.45          'Decimal Number
   arr(4) = #10/7/2033#   'Date
   arr(5) = #12:45:00 PM# 'Time
  
   MsgBox ("Value stored in Array index 0 : " & arr(0))
   MsgBox ("Value stored in Array index 1 : " & arr(1))
   MsgBox ("Value stored in Array index 2 : " & arr(2))
   MsgBox ("Value stored in Array index 3 : " & arr(3))
   MsgBox ("Value stored in Array index 4 : " & arr(4))
   MsgBox ("Value stored in Array index 5 : " & arr(5))
End Sub

Tömb bejárása ciklussal:

Sub TombBejarasa()
    Dim i As Integer
    Dim szamok(1 To 5) As Integer

    For i = 1 To 5
        szamok(i) = i * 10
    Next i

    For i = 1 To 5
        Debug.Print szamok(i)
    Next i
End Sub

megjegyzés: ilyenkor az immediate ablakban jelenik meg a kimenet a szerkesztőben.

A tömb határainak lekérdezése:

Dim tomb(3 To 7) As Integer
MsgBox LBound(tomb)  ' alsó határ (3)
MsgBox UBound(tomb)  ' felső határ (7)

Ez alapján a TombBejarasa() szubrutint dinamikusabbá tehetjük:

Sub TombBejarasa()
    Dim i As Integer
    Dim szamok(1 To 5) As Integer

    For i = LBound(szamok) To UBound(szamok)
        szamok(i) = i * 10
    Next i

    For i = LBound(szamok) To UBound(szamok)
        Debug.Print szamok(i)
    Next i
End Sub


Gyakorló feladatok

Adjunk össze két számot.

Function Osszeadas(szam1 As Double, szam2 As Double) As Double
    Osszeadas = szam1 + szam2
End Function

használata: =Osszeadas(A1;B1)


Írjunk egy függvényt, amely egy sztringet vesz bemenetként, és visszaadja annak fordított változatát.

Function SzovegForditas(szoveg As String) As String
    Dim i As Integer
    For i = Len(szoveg) To 1 Step -1
        SzovegForditas = SzovegForditas & Mid(szoveg, i, 1)
    Next i
End Function


Ez a függvény egy tartomány elemeinek átlagát számítja ki.

Function TartomanyAtlag(tartomany As Range) As Double
    Dim osszeg As Double
    Dim db As Long
    
    osszeg = 0
    db = 0
    
    For Each cella In tartomany
        osszeg = osszeg + cella.Value
        db = db + 1
    Next cella
    
    TartomanyAtlag = osszeg / db
End Function

Töltsük fel tetszőleges értékekkel a A1 és B2 téglalapba eső cellákat:

Egy másik cellába írjukbe: =TartomanyAtlag(A1:B2)

Viszont, ha az értékek között van olyan ami nem szám, akkor nem működik, ezért alakítsuk át, hogy kezelje a kivételeket is.

Function TartomanyAtlag(tartomany As Range) As Double
    Dim cella As Range
    Dim osszeg As Double
    Dim db As Long
    
    osszeg = 0
    db = 0
    
    For Each cella In tartomany
        If IsNumeric(cella.Value) And Not IsEmpty(cella.Value) Then
            osszeg = osszeg + cella.Value
            db = db + 1
        End If
    Next cella
    
    If db > 0 Then
        TartomanyAtlag = osszeg / db
    Else
        TartomanyAtlag = 0
    End If
End Function

Töltsük fel tetszőleges értékekkel a A1 és B2 téglalapba eső cellákat, de az egyiket akarattal elrontjuk:

Egy másik cellába írjukbe: =TartomanyAtlag(A1:B2)


Szorozzunk össze egy mátrix-ot egy vektorral:

Function MatrixVektorSzorzas(matrix As Range, vektor As Range) As Variant
    Dim sorok As Long, oszlopok As Long, i As Long, j As Long
    Dim eredmeny() As Double
     
    sorok = matrix.Rows.Count
    oszlopok = matrix.Columns.Count
     
    ' Ellenőrizzük, hogy a vektor mérete megfelel-e a mátrix oszlopainak számával
    If vektor.Rows.Count <> oszlopok Or vektor.Columns.Count > 1 Then
        MatrixVektorSzorzas = CVErr(xlErrValue)
        Exit Function
    End If
     
    ' oszlopvektor legyen az eredmény
    ReDim eredmeny(1 To sorok, 1 To 1) As Double
     
    For i = 1 To sorok
        For j = 1 To oszlopok
            eredmeny(i, 1) = eredmeny(i, 1) + matrix.Cells(i, j).Value * vektor.Cells(j, 1).Value
        Next j
    Next i
     
    MatrixVektorSzorzas = eredmeny
End Function

Használata például ez lehet: