User Tools

Site Tools


tanszek:oktatas:muszaki_informatika:vba_feladatok

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revisionPrevious revision
Next revision
Previous revision
tanszek:oktatas:muszaki_informatika:vba_feladatok [2024/02/22 14:37] – [Hogyan Működik?] kneheztanszek:oktatas:muszaki_informatika:vba_feladatok [2024/04/24 11:12] (current) – [Hogyan Működik?] knehez
Line 1: Line 1:
 ====== 1. Munkalapok neveinek listázása ====== ====== 1. Munkalapok neveinek listázása ======
  
-Ez a feladat egy olyan makró létrehozását kérte, amely listázza az összes munkalap nevét egy adott munkafüzetben. Az alábbi makró bemutatja, hogyan lehet végrehajtani ezt a feladatot.+Ez a feladat egy olyan makró létrehozását kéri, amely listázza az összes munkalap nevét egy adott munkafüzetben. Az alábbi makró bemutatja, hogyan lehet végrehajtani ezt a feladatot.
  
 <sxh vb> <sxh vb>
Line 58: Line 58:
  
   * A makró először meghatározza a felhasználó által kijelölt tartományt a ''Set tartomány = Selection'' utasítással.   * A makró először meghatározza a felhasználó által kijelölt tartományt a ''Set tartomány = Selection'' utasítással.
-  * Egy ''Scripting.Dictionary'' objektumot hoz létre, amelyben csak különböző értékek tárolhatók.+  * Egy ''Scripting.Dictionary'' objektumot hoz létre, amelyben csak különböző értékek tárolhatók. Itt található a részletes használata: https://learn.microsoft.com/en-us/office/vba/Language/Reference/User-Interface-Help/dictionary-object
   * Végigiterál a tartomány összes celláján.   * Végigiterál a tartomány összes celláján.
   * Ellenőrzi, hogy a cella értéke üres-e. Ha nem, megvizsgálja, hogy az érték szerepel-e már a Dictionary-ben.   * Ellenőrzi, hogy a cella értéke üres-e. Ha nem, megvizsgálja, hogy az érték szerepel-e már a Dictionary-ben.
Line 64: Line 64:
     * Ha az érték még nem szerepel, hozzáadja a Dictionary-hoz.     * Ha az érték még nem szerepel, hozzáadja a Dictionary-hoz.
  
 +====== 3. Dinamikus Tartományok Kezelése ======
  
 +Ez a feladat egy makró létrehozását valósítja meg, amely képes dinamikusan kezelni és frissíteni egy tartomány méretét az aktív munkalapon.
  
 +<sxh vb>
 +Sub DinamikusTartomanyFrissites()
 +    Dim tartomany As Range
 +    Dim utolsoSor As Long, utolsoOszlop As Long
 +    Dim munkalap As Worksheet
 +    
 +    Set munkalap = ActiveSheet
 +    
 +    With munkalap
 +        utolsoSor = .Cells(.Rows.Count, "A").End(xlUp).Row
 +        utolsoOszlop = .Cells(1, .Columns.Count).End(xlToLeft).Column
 +        
 +        Set tartomany = .Range(.Cells(1, 1), .Cells(utolsoSor, utolsoOszlop))
 +    End With
 +    
 +    tartomany.Select
 +    MsgBox "A dinamikus tartomány kijelölve: " & tartomany.Address, vbInformation, "Tartomány Frissítve"
 +End Sub
 +</sxh>
 +
 +==== Hogyan Működik? ====
 +
 +  - A makró először beállítja a munkalapot az aktív munkalapra (`ActiveSheet`).
 +  - Az ''utolsoSor'' és ''utolsoOszlop'' változókat használva megkeresi az utolsó nem üres cellát a "A" oszlopban és az 1. sorban, hogy meghatározza a tartomány határait.
 +  - Az `.End(xlUp).Row` és `.End(xlToLeft).Column` metódusok segítségével határozza meg az utolsó sor és oszlop számát.
 +  - Ezután létrehoz egy `Range` objektumot, amely az első cellától (A1) az utolsó nem üres celláig tart.
 +  - Végül kijelöli ezt a tartományt és megjelenít egy üzenetablakot, amely tájékoztatja a felhasználót a frissített tartomány címéről.
 +
 +====== 4. Munkalapok közötti adatátvitel ======
 +
 +Ez a feladat egy makrót hoz létre, amely adatokat másol egyik munkalapról a másikra. A példa egyszerűsített, amely egy előre meghatározott tartomány adatait másolja át.
 +
 +Ellenőrizzük, hogy van-e Munka1 és Munka2 elnevezésű munkalapunk. ha nincs hozzuk létre őket.
 +
 +<sxh vb>
 +Sub AdatatvitelMunkalapokKozott()
 +    Dim forrasMunkalap As Worksheet
 +    Dim celMunkalap As Worksheet
 +    Dim masolandoTartomany As Range
 +    Dim celTartomany As Range
 +    
 +    ' Munkalapok és tartományok beállítása
 +    Set forrasMunkalap = ThisWorkbook.Sheets("Munka1")
 +    Set celMunkalap = ThisWorkbook.Sheets("Munka2")
 +    
 +    ' Másolandó tartomány beállítása a Forrás munkalapon
 +    Set masolandoTartomany = forrasMunkalap.Range("A1:A10")
 +    
 +    ' A cél tartomány beállítása a Cél munkalapon
 +    ' Itt feltételezzük, hogy a cél tartomány azonos méretű és helyen van, mint a forrás
 +    Set celTartomany = celMunkalap.Range("A1:A10")
 +    
 +    ' Adatok másolása
 +    masolandoTartomany.Copy Destination:=celTartomany
 +    
 +    MsgBox "Adatok átmásolva a '" & forrasMunkalap.Name & "' munkalapról a '" & celMunkalap.Name & "' munkalapra.", vbInformation, "Adatátvitel Kész"
 +End Sub
 +</sxh>
 +
 +==== Hogyan Működik? ====
 +
 +  - Először is, beállítjuk a forrás és cél munkalapokat, ahol a forrás és cél munkalapok neveit közvetlenül a kódban adjuk meg.
 +  - A másolandó tartományt beállítjuk a forrás munkalapon, itt az "A1:A10" tartományt használjuk példaként.
 +  - Hasonlóképpen, megadjuk a cél tartományt a cél munkalapon, ami ebben az esetben azonos méretű és azonos helyen van, mint a forrás tartomány.
 +  - A `.Copy` metódust használva másoljuk a forrás tartomány adatait a cél tartományba.
 +  - Egy üzenetablak tájékoztatja a felhasználót az adatátvitel sikerességéről.
 +
 +A VBA-ban a zárójelek használata opcionális, amikor szubrutinokat (Sub) hívunk meg, és nincsenek visszatérési értékek. Ha a szubrutin vagy függvény paramétereit közvetlenül adjuk meg anélkül, hogy változókat vagy kifejezéseket használnánk, akkor a zárójelek elhagyhatók. Például:
 +
 +<sxh vb>
 +Sub ExampleSub(parameter As String)
 +    MsgBox parameter
 +End Sub
 +
 +' Hívás zárójel nélkül
 +ExampleSub "Hello World"
 +
 +' Hívás zárójellel - általában akkor szükséges, ha az eredményt változóba kell menteni vagy kifejezés részeként használjuk
 +Call ExampleSub("Hello World")
 +</sxh>
 +
 +**A := Jelölés a VBA-ban**
 +
 +A := jelölés a VBA-ban nevesített argumentumok (paraméterek) használatát teszi lehetővé függvények és eljárások hívásakor. Ez a szintaxis megengedi, hogy explicit módon megadjuk a paraméterek nevét és azokhoz tartozó értékeket, ami növeli a kód olvashatóságát és egyértelműségét, különösen akkor, ha a függvény vagy eljárás több paramétert is fogad. 
 +
 +Például:
 +<sxh vb>
 +Sub ExampleSubWithParams(firstParam As Integer, secondParam As String)
 +    MsgBox "Érték: " & firstParam & ", Szöveg: " & secondParam
 +End Sub
 +
 +' Nevesített argumentumok használata
 +Call ExampleSubWithParams(firstParam:=10, secondParam:="Szöveg")
 +
 +' vagy
 +ExampleSubWithParams firstParam:=10, secondParam:="Szöveg"
 +</sxh>
 +
 +====== 5. Hibaellenőrzés és hibakezelés makrókban ======
 +
 +Ebben a feladatban egy makró létrehozására mutatunk példát, amely megfelelő hibakezelést implementál a futásidő hibák láthatóvá tétele miatt. 
 +
 +<sxh vb>
 +Sub HibakezelesMakroban()
 +    On Error GoTo Hibakezelo
 +    
 +    ' Itt történik a kód, ami hibát generálhat
 +    Dim osztando As Double
 +    Dim oszto As Double
 +    osztando = 10
 +    oszto = 0 ' Ezzel a sorral osztásnál hibát generálunk
 +    
 +    Dim eredmeny As Double
 +    eredmeny = osztando / oszto ' Ez hibát okoz, ha az oszto 0
 +    
 +    MsgBox "Az eredmény: " & eredmeny
 +    Exit Sub
 +
 +Hibakezelo:
 +    MsgBox "Hiba történt: " & Err.Description, vbCritical, "Hiba"
 +    ' Itt történhetnek további hibakezelési lépések, pl. naplózás
 +End Sub
 +</sxh>
 +==== Hogyan Működik? ====
 +
 +  * A makró a ''On Error GoTo Hibakezelo'' utasítással kezdődik, ami azt jelenti, hogy ha a makró futtatása során hiba történik, a vezérlés átugrik a ''Hibakezelo'' címkéhez.
 +  * A példában szándékosan generálunk egy hibát az osztásnál, ahol az osztó értéke 0.
 +  * Ha ez a hiba megtörténik, a makró a ''Hibakezelo'' részre ugrik, ahol egy üzenetablakban megjelenik a hiba leírása.
 +  * Az ''Exit Sub'' utasítás biztosítja, hogy ha hiba nélkül eljutottunk a makró végére, ne ugorjunk a hibakezelő részre.
 +  * A hibakezelő részben lehetőség van további tevékenységekre, mint például a hiba naplózása vagy speciális hibakezelési rutinok végrehajtása.
 +
 +Ez a makró alapvető hibakezelési technikát mutat be, amely elengedhetetlen bármilyen robosztus VBA alkalmazás vagy makró fejlesztésekor, hogy a végfelhasználók számára kezelhető hibaüzeneteket biztosíthassunk.
 +
 +====== 6. Dinamikus Diagramok Készítése ======
 +
 +A makró lehetőséget ad arra, hogy a felhasználók automatikusan frissülő diagramokat hozzanak létre, amelyek megváltoznak, amint az adatok frissülnek.
 +
 +<sxh vb>
 +Sub CreateDynamicChart()
 +    Dim ws As Worksheet
 +    Dim chartObj As ChartObject
 +    Dim lastRow As Long
 +    Dim dataRange As Range
 +
 +    ' Munkalap beállítása
 +    Set ws = ThisWorkbook.Sheets("Munka1")
 +
 +    ' Az utolsó adatsor megkeresése
 +    lastRow = ws.Cells(ws.Rows.Count, "A").End(xlUp).Row
 +
 +    ' Dinamikus adattartomány létrehozása
 +    Set dataRange = ws.Range("A1:B" & lastRow)
 +    ws.Names.Add Name:="DynamicData", RefersTo:=dataRange
 +
 +    ' Diagram létrehozása a munkalapon
 +    Set chartObj = ws.ChartObjects.Add(Left:=200, Width:=375, Top:=50, Height:=225)
 +    With chartObj.Chart
 +        ' Diagram adatforrás beállítása a dinamikus tartományra
 +        .SetSourceData Source:=ws.Range("DynamicData")
 +        .ChartType = xlLine ' Vonal diagram beállítása
 +        .HasTitle = True
 +        .ChartTitle.Text = "Dinamikus Adatok Ábrázolása"
 +    End With
 +End Sub
 +</sxh>
 +
 +==== Hogyan Működik? ====
 +  * A makró meghatározza a dinamikus adattartományt az **"A"** oszlopból a munkalap utolsó soráig.
 +  * Egy új diagramobjektumot hoz létre, és beállítja a diagram adatforrását a korábban meghatározott dinamikus tartományra.
 +  * A diagram típusát vonaldiagramra állítja, és címet ad hozzá.
 +
 +Ez a makró jó alapja lehet bonyolultabb dinamikus diagramok létrehozásának is, ahol további formázási és adatkezelési lehetőségek is használhatók.
 +
 +====== 7. Automatikus tartalomjegyzék készítése ======
 +
 +Írjuk egy makrót, ami egy tartalomjegyzéket készít a munkafüzet összes munkalapjáról az első munkalap helyén, hozzáadva egy új munkalapot, amit **Tartalomjegyzék**-nek nevez el, és beilleszti a munkalapok hivatkozásait.
 +
 +<sxh vb>
 +Sub Tartalomjegyzek()
 +    Dim i As Long
 +    
 +    On Error Resume Next
 +    
 +    Application.DisplayAlerts = False
 +    Worksheets("Tartalomjegyzék").Delete
 +    Application.DisplayAlerts = True
 +    
 +    ThisWorkbook.Sheets.Add Before:=ThisWorkbook.Worksheets(1)
 +    
 +    ActiveSheet.Name = "Tartalomjegyzék"
 +    
 +    For i = 1 To Sheets.Count
 +        With ActiveSheet
 +            .Hyperlinks.Add _
 +            Anchor:=ActiveSheet.Cells(i, 1), _
 +            Address:="", _
 +            SubAddress:="'" & Sheets(i).Name & "'!A1", _
 +            ScreenTip:=Sheets(i).Name, _
 +            TextToDisplay:=Sheets(i).Name
 +        End With
 +    Next i
 +End Sub
 +</sxh>
 +==== Hogyan Működik? ====
 +  * Hiba Kezelés: //On Error Resume Next// parancs utasítja a VBA-t, hogy folytassa a futást, ha hiba történik a makró futtatása során.
 +  * Figyelmeztetések Kikapcsolása: //Application.DisplayAlerts = False// utasítással kikapcsolja az Excel automatikus figyelmeztetéseit (felugró ablakait), például amikor egy munkalapot törölni szeretnénk.
 +
 +====== 8. A kiválasztott cellák képéként másolása ======
 +Válasszunk ki egy tarományt amiben vannak értékek, majd futtassuk  a következő makrót:
 +<sxh vb>
 +Sub PasteAsPicture()
 +    Application.CutCopyMode = False
 +    Selection.Copy
 +    ActiveSheet.Pictures.Paste.Select
 +End Sub
 +</sxh>
 +
 +====== 9. Célkeresés ======
 +
 +Nagyon hasznos funkció, ha egy összetett képletek szerint változó cella értékét visszafelé akarjuk próbálgatni, hogy egy adott eredményhez jussunk.
 +
 +Például: adott egy számítás ami egy rendelés árát számolja ki, figyelembe véve az adót, a szállítási költséget.
 +
 +{{:tanszek:oktatas:muszaki_informatika:pasted:20240423-195630.png}}
 +
 +A példában 4000-ot kell fizetni az áruért. De mit tudunk csinálni ha csak **3500Ft** van kéznél? Valahogy visszafelé kellene számolni, hogy megtudjuk ekkor mekkora alap árat engedhetünk meg magunknak.
 +
 +<sxh vb>
 +Sub GoalSeek()
 +    Dim Target As Long
 +    
 +    On Error GoTo Errorhandler
 +    
 +    Target = InputBox("Enter the required value", "Enter Value")
 +    Worksheets("Tartalomjegyzék").Activate
 +    Rem ChangingCell = az alapár .... keressük az összesen = 'B5'-es cellát
 +    Rem
 +    With ActiveSheet.Range("B5")
 +        .GoalSeek _
 +        Goal:=Target, _
 +        ChangingCell:=Range("B1")
 +    End With
 +    
 +    Exit Sub
 +Errorhandler:     MsgBox ("Sorry, value is not valid.")
 +End Sub
 +</sxh>
 +
 +{{:tanszek:oktatas:muszaki_informatika:pasted:20240423-195725.png}}
 +
 +A példában a B5 helyére az //'Összesen'// melletti cella, a //ChangingCell// pedig az alapár (B1). 
 +
 +A szkript megadja hogy a 3500Ft-os bruttó ár, **787.40Ft**-os alapárhoz tartozik.
tanszek/oktatas/muszaki_informatika/vba_feladatok.1708612644.txt.gz · Last modified: 2024/02/22 14:37 by knehez