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.
Sub MunkalapokListazasa() Dim ws As Worksheet Dim lista As String lista = "Munkalapok listája:" & vbCrLf For Each ws In ThisWorkbook.Worksheets lista = lista & ws.Name & vbCrLf Next ws MsgBox lista, vbInformation, "Munkalapok" End Sub
Sub MunkalapokListazasa()
egy eljárás, amely nem vár visszatérési értéket.Dim ws As Worksheet
- Egy változót deklarálunk, amely a munkafüzet minden egyes munkalapjára hivatkozik a ciklus során.Dim lista As String
- Egy szöveges változót hozunk létre, amelyben összegyűjtjük a munkalapok neveit.For Each
ciklus végigmegy a jelenlegi munkafüzet összes munkalapján.lista
változóhoz hozzáadjuk a munkalap nevét, majd egy új sort, hogy elkülönítsük a neveket.MsgBox
függvény segítségével megjelenítjük az összegyűjtött munkalapneveket egy üzenetablakban.A feladat egy olyan makró létrehozása, amely megtalálja és kiemeli a duplikált értékeket egy adott tartományban az Excel munkalapon.
Sajnos függvénnyel nem lehet olyan cella paramétereit módosítani, ami más mint a függvény meghívásának cellája. Ezért a használat előtt ki kell jelölni azt a tartományt amit vizsgálni szeretnénk.
Sub DuplikaltakKiemelése() Dim tartomány As Range Set tartomány = Selection Dim cell As Range Dim ellenőrző As Object Set ellenőrző = CreateObject("Scripting.Dictionary") ' A tartomány celláinak bejárása For Each cell In tartomány If Not cell.Value = "" Then If ellenőrző.Exists(cell.Value) Then ' Duplikált érték kiemelése piros háttérszínnel cell.Interior.Color = RGB(255, 0, 0) Else ellenőrző.Add cell.Value, Nothing End If End If Next cell End Sub
Set tartomány = Selection
utasítással.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-objectEz 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.
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
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.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.
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
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:
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")
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:
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"
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.
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
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.Hibakezelo
részre ugrik, ahol egy üzenetablakban megjelenik a hiba leírása.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.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.
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.
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
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.
Í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.
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
Válasszunk ki egy tarományt amiben vannak értékek, majd futtassuk a következő makrót:
Sub PasteAsPicture() Application.CutCopyMode = False Selection.Copy ActiveSheet.Pictures.Paste.Select End Sub
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.
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.
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
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.