Gondoltam a mai egy könnyedebb bejegyzés lesz: egy olyan kód ami beállítja a kívánt cellát (“odagörget”) a bal felső sarokba minden munkalapon, pl. a C5-ös cellához:
Miközben a makrót tisztáztam rájöttem, nem is annyira evidens az eredeti megoldásom. Tegyük fel hogy azt akarjuk, a C5-ös cellánál kezdődjön minden Munkalap a kódot tartalmazó munkafüzetben. Igen ám, de mi lesz a Diagram lapokkal (Chart sheets)? Vagy ha egyes munkalapok rejtettek (hidden) vagy nagyon rejtettek (very hidden)? Mi van akkor, ha a munkafüzet egyes lapja(i) panel rögzítést (pl. ablaktábla rögzítést= freeze panes) tartalmaz(nak)? És ha a felhasználó véletlenül nem egy cellát jelöl ki kezdésnek hanem több cellából álló tartományt? Vagy elindítja a makrót majd a “Mégse” gombra kattint?
Ezeket a felmerülő problémákat sikerült áthidalni. A VBA kód működésének szemléltetése:
Rövid magyarázat a fenti animált gif-hez:
- a kiindulópont az, hogy minden munkalap az A1-es tartománynál kezdődik, a “Munka1” elnevezésű munkalapon ablaktábla rögzítés lett hozzáadva
- célunk, hogy minden Munkalapon (kivéve “Diagram1”-et mivel az Diagram lap) a C5-ös cellához történjen meg a görgetés és ez legyen az első (bal felső) cella a látható tartományban
- A makró futtatásakor:
- a cella kijelölése helyett a manuális bevitel is megengedett, vagyis bírhatjuk a “C5”-öt (idézőjelek nélkül) majd az “OK” gombra kattintunk vagy Enter-t nyomunk
- a panelek rögzítésének feloldását választjuk
- a makró lefutása után pedig épp a kívánt eredmény látható: a C5-ös cellánál kezdődnek a Munkalapok
Az adott munkafüzetbe szúrjunk be egy modult a Visual Basic szerkesztőjében és az alábbi kódokat adjuk hozzá:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 |
Sub Gorgetes_BalFelsoCella() Dim Lap As Worksheet, BalFelso As Range, AktivLap As Worksheet 'Készítette: XLMotyo (https://xlmotyo.hu) 'a felhasználó cellakijelölését minden munkalapon a bal felsõ cellának állítja be ("odagörget"), a látható munkalapokon 'a kód nem vizsgálja a rejtett és látható Diagram lapokat (Chart sheets) valamint a rejtett Munkalapokat (Worksheets) 'vizsgálja viszont, hogy a munkafüzet egyes lapja(i) tartalmaznak-e panel (pl.: ablaktábla) rögzítést (freeze pane) '------------------------------- 'ez a fõ kód, ezt kell futtatni '------------------------------- If TypeName(ActiveSheet) = "Chart" Then 'ha az aktív lap Diagram lap: hiba MsgBox "Úg tûnik, az aktív lap egy Diagram lap (Chart sheet). Válassz egy Munkalapot (Worksheet)!", vbExclamation, "" Exit Sub Else 'ha az aktív lap Munkalap Set AktivLap = ActiveSheet 'aktív munkalap megjegyzése Call PanelRogzitesMeglete(AktivLap) 'makró meghívása Ujra: On Error GoTo Vege Set BalFelso = Application.InputBox("Válaszd ki a bal felsõ cellát a görgetési pozícióhoz!", , "B2", , , , , 8) On Error GoTo 0 Application.ScreenUpdating = False If BalFelso.Count <> 1 Then MsgBox "Csak egy cellát válassz!", vbExclamation, "" GoTo Ujra End If 'végigmegy a munkafüzet látható (visible) munkalapjain: For Each Lap In Worksheets If Lap.Visible = xlSheetVisible Then Lap.Select 'bal felsõ görgetési pozíció beállítása: With ActiveWindow .ScrollRow = BalFelso.Row .ScrollColumn = BalFelso.Column If ActiveWindow.FreezePanes = True Then Lap.Range(BalFelso.Address).Select Else .ActivePane.VisibleRange.Cells(1).Select End If End With End If Next Lap End If AktivLap.Select 'aktív munkalap visszaállítása (kiválasztása) Application.ScreenUpdating = True Vege: End Sub '_____________________________________________________________ Sub PanelRogzitesMeglete(AthozottAktivLap As Worksheet) Dim Lap As Worksheet, Sz As Boolean Application.ScreenUpdating = False Sz = False 'tartalmaz-e valamelyik munkalap panel (pl.: ablaktábla) rögzítést For Each Lap In ThisWorkbook.Worksheets Lap.Select If ActiveWindow.FreezePanes = True Then Sz = True Next Lap If Sz Then 'ha tartalmaz: If MsgBox("A munkafüzet egyes lapja(i) panel rögzítést (pl. ablaktábla rögzítést= freeze panes) tartalmaz(nak)." _ & vbNewLine & vbNewLine & _ "Ezért elõfordulhat, hogy a munkalap bal felsõ cellája nem a megadott cella lesz." _ & vbNewLine & vbNewLine & _ "Feloldjuk a panelek rögzítését?", vbYesNo + vbQuestion, "") = vbYes Then For Each Lap In ThisWorkbook.Worksheets Lap.Activate If ActiveWindow.FreezePanes = True Then ActiveWindow.FreezePanes = False 'panel feloldása Next Lap End If End If AthozottAktivLap.Select 'aktív munkalap visszaállítása (kiválasztása) Application.ScreenUpdating = True End Sub |
Maga az eredmény nem nagy kunszt viszont sokkal gyorsabb makróval “görgetni”, mint kézzel minden egyes munkalapon. Igényességet és átláthatóságot tükröz, ha a munkafüzetben levő tucatnyi munkalap azonos pozícióban kezdődik.
Remélem hasznos volt a poszt.
Kérdésed, észrevételed van? Szólj hozzá lent vagy dobj egy emailt: xlmotyo@gmail.com