tanszek:oktatas:muszaki_informatika:vba_tutorial

This is an old revision of the document!


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.

  • Példa: Egyszerű változó deklaráció

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:

  • Integer: Egész számok
  • Long: Nagyobb egész számok
  • Single: Lebegőpontos számok (egyszeres pontossággal)
  • Double: Lebegőpontos számok (kétszeres pontossággal)
  • String: Szöveges típus
  • Boolean: Logikai típus (Igaz vagy Hamis)

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…Then…Else

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

  • For Next Ciklus

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!

  • Do While Loop

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:

tanszek/oktatas/muszaki_informatika/vba_tutorial.1744139408.txt.gz · Last modified: 2025/04/08 19:10 by knehez