Office Guru

Munkalap kiválasztó automatizmus legördülő menüben

2016. szeptember 05. - Office Guru

Sokszor igazán komplex kódok nélkül fel tudjuk úgy turbózni egyszerű kis Excel-tábláinkat, hogy lenyűgözhetjük felhasználóinkat vagy akár meg is könnyíthetjük az életüket. Ennek most egy példáját mutatom be azzal a VBA-kóddal, amely azt teszi lehetővé, hogy egy "Instructions" vagy "Használati utasítás" vagy bármilyen más névre hallgató első sheet legördülő menüjéből választhatjuk ki azon munkalapok nevét, amelyeket meg akarunk éppen jeleníteni. Így nem kell bogarászni a sok sheet között egyesével, szimplán csak választ egyet a user és csak az fog látszani - persze ezt még csoportokra is oszthatjuk és hasonló nyalánkságokkal csinosítgathatjuk, de az alaplogika akkor már nem változik.

Mindennek a kiindulási alapja egy Data Validation List lesz, úgyhogy még a VBA Editor előtt ezt kell elkészítenünk. Valahol a kiinduló munkalapunkon vagy bármely más technikai célokat szolgáló sheeten készítsünk el egy ehhez hasonló listát:

sheetlist1.jpgEnnek a tartománynak aztán persze célszerű nevet adni, hogy bővítése esetén automatikusan változzon a legördülő menünk is, de a lényeg, hogy a lista elkészülte után a Ribbonunk Data füle alatt található Data Tools szekció Data Validation funkcióját kell használnunk:

sheetlist2.jpgItt készítsünk egy List típusú adatvalidációt, amelyhez a lista legyen az előbb elkészített tartományunk, akár szimplán cellákként, akár nevesített tömbként meghivatkozva:

sheetlist3.jpgÉs íme, már a felület meg is van, ami mögé a kódot kell majd beillesztenünk:

sheetlist4.jpgSzépen mehetünk is át a VBA Editorba ALT+F11 alkalmazásával, ahol a kiinduló munkalapunkra a megszokott alapesettől eltérően a Worksheetünk Change eseményéhez fogunk beszúrni egy futtatandó kódot, azaz az ezen a munkalapon történő változások indítják el a program futását:

sheetlist5.jpgKét változóra lesz mindenképpen szükségünk, elsőként definiáljunk egy ws névre hallgató Worksheet típusú változót, amelyet majd a ciklusunkban fogunk felhasználni, másodsorban kell majd egy "kival" névre hallgató String típusú változó is, amelyben a kiválasztott lehetőség nevét tároljuk el. Értelemszerűen tehát a deklarálás után már be is adhatjuk "kival" változónk értékét, ami ugyebár annak a cellának az értéke lesz, ahol kiválasztjuk a sheetünk nevét (vagy a Minden opciót):

Private Sub Worksheet_Change(ByVal Target As Range)
Dim ws As Worksheet
Dim kival As String
kival = Worksheets("Kiinduló Sheet").Range("H7").Value

Amint azt tudjuk, a Target egy Range típusú hivatkozás, azaz itt megadhatjuk azon tartományt, amelynek változása esetén történjen az eseményünk, azaz ha a Target.Address = Range("H7").Address, akkor jöjjön a vizsgálatunk és a sheetek megjelenítése vagy éppen eltüntetése.

És itt most egy Select...Case utasítást fogunk bevetni, ami meghatározott utasítások közül fogja azt lefutni, ami megfelel egy bizonyos kifejezés értékének. Jelen esetben ez az érték a Target hivatkozásunk értéke, azaz Target.Value.

Itt tartunk tehát most:

Private Sub Worksheet_Change(ByVal Target As Range)
Dim ws As Worksheet
Dim kival As String
kival = Worksheets("Kiinduló Sheet").Range("H7").Value
If Target.Address = Range("H7").Address Then
Select Case Target.Value

És most már szépen csak végig kell mennünk a lehetőségeken. Nézzük a legegyszerűbbet, a "Minden" opció kiválasztását. Ebben az esetben a munkafüzetünk összes munkalapján menjen végig a program és minden munkalap Visible tulajdonságát állítsa láthatóra, amit egy For Each...Next ciklussal a korábbi posztok alapján már könnyen meg tudunk csinálni.

Private Sub Worksheet_Change(ByVal Target As Range)
Dim ws As Worksheet
Dim kival As String
kival = Worksheets("Kiinduló Sheet").Range("H7").Value
If Target.Address = Range("H7").Address Then
Select Case Target.Value
Case "Minden"
For Each ws In ActiveWorkbook.Sheets
ws.Visible = xlSheetVisible
Next ws


A másik esetünk pedig valamely munkalap nevének kiválasztása lesz (azaz jelen esetünkben Case Else, azaz bármilyen más esetben), amelyhez viszont nem lesz elég egy For Each...Next ciklus használata, abba még egy IF utasítást is bele kell csempésznünk.

De még mielőtt szépen leírjuk, hogy mi is történjen, ismerkedjünk meg az InStr funkcióval. Ez nem tesz mást, mint az első paramétereként megadott karakterszámtól kezdve a második paramétereként megadott szövegben megkeresi a harmadik paramétereként megadott szöveget. Ha megtalálja, akkor visszaadja azt a karakterszámot, ahol ez a szöveg kezdődik a másikban, ergó ha nullánál nagyobb a visszaadott érték, akkor van egyezésünk, tehát az adott munkalap neve megegyezik a kiválasztott értékkel.

InStr(1, ws.Name, kival): az első karaktertől kezdve megnézi, hogy az adott Worksheet nevében benne van-e a "kival" változó értéke.

Innentől kezdve pedig mehet a kód megírása a már megszokott "regényformátumban" is, azaz munkafüzetünk minden egyes munkalapja esetén nézze meg, hogy az adott munkalap nevében benne van-e a "kival" változó értéke - ha igen, akkor legyen látható az a cella, ellenkező esetében ne. Itt annyival még meg lehet dobni az If utasítást, hogy a "Kiinduló Sheet" névre hallgató, legördülő menüt tartalmazó munkalapunk mindig legyen látható.

Ez valahogy így néz ki:

Case Else
For Each ws In ActiveWorkbook.Sheets
If InStr(1, ws.Name, kival) > 0 Then
ws.Visible = xlSheetVisible
Else
If ws.Name <> "Kiinduló Sheet" Then
ws.Visible = xlSheetHidden
End If
End If
Next ws

Összességében tehát a For Each...Next és If már megtanult utasításai mellett a Worksheetek Visible tulajdonságát és az InStr utasítást kell ismernünk a kód összeállításához.

sheetlist6.jpgÉs ezzel már szépen meg is van a működő programunk, bármilyen sheet kiválasztása esetén csak az jelenik meg plusz a kiinduló munkalapunk:

sheetlist7.jpg

Szövegként a kód:

Private Sub Worksheet_Change(ByVal Target As Range)
Dim ws As Worksheet
Dim kival As String
kival = Worksheets("Kiinduló Sheet").Range("H7").Value
If Target.Address = Range("H7").Address Then
Select Case Target.Value
Case "Minden"
For Each ws In ActiveWorkbook.Sheets
ws.Visible = xlSheetVisible
Next ws
Case Else
For Each ws In ActiveWorkbook.Sheets
If InStr(1, ws.Name, kival) > 0 Then
ws.Visible = xlSheetVisible
Else
If ws.Name <> "Kiinduló Sheet" Then
ws.Visible = xlSheetHidden
End If
End If
Next ws
End Select
End If
End Sub

 

A bejegyzés trackback címe:

https://officeguru.blog.hu/api/trackback/id/tr4611680051

Kommentek:

A hozzászólások a vonatkozó jogszabályok  értelmében felhasználói tartalomnak minősülnek, értük a szolgáltatás technikai  üzemeltetője semmilyen felelősséget nem vállal, azokat nem ellenőrzi. Kifogás esetén forduljon a blog szerkesztőjéhez. Részletek a  Felhasználási feltételekben és az adatvédelmi tájékoztatóban.

Márton Czukorhegyi 2018.05.11. 16:24:34

Szia!
Megcsináltam a leírás alapján és remekül működik.
Nekem viszont egy olyan megoldásra lenne szükségem ami lényegében ugyanígy működik, csak egy kiválasztott munkalap (legyen a neve "üzemórák") viszont nem lenne rejtett, hanem állandóan látható lenne. Ennek megfelelően lehetne módosítani a kódot?
Előre is köszönöm!
süti beállítások módosítása