A mindennapok során elég gyakran felmerül olyan igény, hogy Excelben elkészített táblázatainkat, diagramjainkat PowerPoint prezentációban mutassuk be, adjuk elő egy kis extra körítés kíséretében - és szintén nem ritkaság, hogy hetente ugyanarról a témáról, ugyanabban a struktúrában kell prezentálnunk, egyedül csak az adatok változnak. Ilyenkor jól jöhet egy olyan automatizmus, amelynek keretében az Excelből egy gombnyomásra tudunk PowerPoint diára helyezni dolgokat - a következőben egy ilyen, egyszerű kis VBA kódot fogunk megnézni.
Adott tehát a következő diagram, amelyet Excelben készítünk el minden héten a bevételek heti alakulása alapján:
Nyissuk meg ALT+F11 lenyomásával a VBA-editort, majd mielőtt elkezdenénk a kódot bevinni, végezzünk el egy beállítást. A Tools menü References menüpontjára kattintás után rendeljük hozzá projektünkhöz a Microsoft PowerPoint Object Libraryt:

Aztán már mehetünk is az editorba, hogy elkezdjük a tényleges munkát. Első lépésként mint mindig, most is deklaráljuk a változóinkat:
Sub ChartcopytoPPT()
Dim PowerPointApp As Object
Dim Presentation As Object
Dim PPTSlide As Object
Ahogy elég egyértelmű már az elnevezésből is, az első maga a PowerPoint applikáció, a második azon belül egy prezentáció, a harmadik pedig értelemszerűen egy dia - és elég egyértelmű, hogy ezekre miért is van szükségünk.
Hasonló kódok esetében ilyenkor általában mindig célszerű olyan vizsgálatot végezni, hogy fut-e már a Powerpoint vagy még nem, jelen kódban én most megengedem magamnak azt a luxust az egyszerűség jegyében, hogy ezt az ellenőrzést kihagyom. Így a változók után már indíthatunk is egy PowerPointot a PowerPointApp változó feltöltésével:
Set PowerPointApp = CreateObject(class:="PowerPoint.Application")
Ez az egyszerű kódocska nem fog túl nagy problémát okozni, de azért, hogy jól belénk ívódjon, célszerű belőni egy
Application.ScreenUpdating = False
utasítást is, ami nagyobb kódok esetén egyértelműen gyorsítja a futást, hiszen a képernyő nem frissül folyamatosan a kód futása közben.
Ha ez megvan, akkor jön a következő két változó feltöltése, elsőként a Presentation változó kezdő értékét állítjuk be egy új prezentáció létrehozásával:
Set Presentation = PowerPointApp.Presentations.Add
Majd folytatjuk azzal, hogy hozzáadunk egy diát ehhez a prezihez:
Set PPTSlide = Presentation.Slides.Add(1, 11)
Az első része ennek a feltöltésnek valószínűleg egyértelmű, az Add két paramétere közül az első pedig a slide számát jelenti, a második pedig az adott slide kinézetét, layoutját - jelen esetben ez egy szöveges headert tartalmazó dia lesz, a teljes lista megnézhető a Microsoft hivatalos oldalán.
Ezután már csak annyi van hátra, hogy megfogjuk az Excelben lévő diagramunkat és nyomunk rá egy másolást:
ActiveSheet.ChartObjects("Chart 1").Activate
ActiveChart.ChartArea.Copy
Ez önmagában elég favágó kis kód, hiszen nevesítjük a pontos chartot, de értelemszerűen akinek több ilyen van, az nyugodtan bedobhat egy For ciklust, amellyel az összes chart objektumon végigmehet és mindegyiket átdobálhatja a PowerPointba.
A másolás után már csak a beillesztés van hátra:
PPTSlide.Shapes.PasteSpecial DataType:=2
Az adattípus paraméter sorszámát nem kell fejből tudnunk az összes változatra, a Microsoft hivatalos oldalán ott van az egész PasteSpecial metódus leírása pontos paraméterlistával - például jelen esetben a kettes egy default beillesztés, a kinézet és formátum megtartásával.
Ezután már csak annyi van hátra, hogy aktiváljuk és előhozzuk az eddig háttérben lévő PowerPointot, majd kipucoljuk a vágólapot:
PowerPointApp.Visible = True
PowerPointApp.Activate
Application.CutCopyMode = False
Ezután már csak hozzá kell rendelnünk a makrónkat egy gombhoz és egy kattintás múlva már elő is állt a prezentációnk:


Ahogy látszik, ez egy roppantul lebutított, egyszerű kis kód simán tehetünk bele mindenféle módosításokat a chartunk elhelyezkedését, méretét illetően, de elég könnyen ráhúzhatjuk több chart másolására is. Remélhetőleg ugródeszkának a fenti megfelelő lesz.
Kódunk szövegként:
Sub ChartcopytoPPT()
Dim PowerPointApp As Object
Dim Presentation As Object
Dim PPTSlide As Object
Set PowerPointApp = CreateObject(class:="PowerPoint.Application")
Application.ScreenUpdating = False
Set Presentation = PowerPointApp.Presentations.Add
Set PPTSlide = Presentation.Slides.Add(1, 11)
ActiveSheet.ChartObjects("Chart 1").Activate
ActiveChart.ChartArea.Copy
PPTSlide.Shapes.PasteSpecial DataType:=2
PowerPointApp.Visible = True
PowerPointApp.Activate
Application.CutCopyMode = False
End Sub
A keresési szöveghez a mező egy Text Box, a gomb pedig szimplán egy Command Button, mindkettőt a Developer ribbonfül Controls szekciójának Insert menüjével szúrtam be.
A kódhoz Alt+F11 lenyomásával átmegyünk a VBA-editorba, majd definiálunk két változót, az egyiket chromedir néven a Google Chrome elérési útvonalára, illetve kereses néven egy másikat, a Text Boxunk értékének kinyeréséhez.
És mehet is szépen a keresés (persze értelemszerűen itt még nem az Excel fogja megjeleníteni az eredményt, hanem megnyitja a böngészőt):
Internet Explorer esetén kicsit egyszerűbb a dolgunk, ott értelemszerűen az InternetExplorer.application objektumot kell létrehoznunk (hasonlóan mondjuk az Outlookos levélküldés objektumos kezeléséhez), majd ennek paramétereivel/metódusaival tudunk játszadozni. Ez egy egyszerű példa:
Értelemszerűen ahogy látjuk, ez nem csinál mást, mint bekéri tőlünk a nevünket, megvizsgálja, hogy adtunk-e meg legalább egy karaktert, majd szépen üdvözöl minket. Semmi komplikált történet.
Itt a jobb oldalon, fent lévő Customize the Ribbon Main Tabs menüpont választása után először adjunk egy új fület (New Tab), majd egy új szekciót (New Group):
Ez valahogy így fog utána kinézni:
Utána a bal oldalon fent a Choose commands from legördülő menüből válasszuk a Macros menüpontot:
Majd szimplán az itt található kódunkat az Add lenyomásával mozgassuk át a saját kis fülünk és szekciónk alá:
Ezzel kész is vagyunk, a Sajatmakrok fül alatt:
Már látjuk a saját kis kódunkat, szép formás ikonnal:
Ezzel alapvetően rendben is lennénk, viszont ha folyamatosan bármilyen Excelből szeretnénk használni, akkor készíthetünk belőle 




Az alapvetően tisztán látható, hogy a második utasításban az adott pillanatban lévő dátumot (Now) Format segítségével úgy alakítjuk át, hogy kizárólag a hónap jelenjen meg belőle.
Valószínűleg mindannyian tudjuk mi történik akkor, ha szimplán kijelöljük a leszűrt adatokat, majd azokat megpróbáljuk simán beilleszteni a céloszlopba:
Egyértelműen látszik, hogy a beillesztésünknél az öt várost az E15-ös cellától kezdődően kezdte el berakni az Excel, azaz például Vicuña elbűvölő kis települése az E26 helyett az E16-ba került, így nem is látjuk, hiszen szűrésünkben az a cella nincsen benne. Ha valaki ezt nem veszi észre, akkor súlyos adatvesztések állnak elő, ami aztán később már nehezen lesz javítható és visszakövethető - vegyük figyelembe, hogy ez a példa ráadásul teljes mértékben bináris, ennél csak komplexebb táblák léteznek.
Ez persze a legegyszerűbb táblák esetén működik csak, ahol a sorbarendezésnek van értelme, ellenkező esetben hasonló manuális ügyködés az, amikor egy segédoszlopban valamilyen formában jelezzük, hogy mely cellákra szűrtünk, majd a filter eltávolítása után eszerint a segédoszlop szerint rendezzük sorba az adatainkat:
Utána pedig már simán mehet a Copy+Paste, hiszen az adataink egymást követő sorokban helyezkednek el.
Amennyiben egyenlővé tesszük az első célcellát az első másolandó település cellájával, majd ezt a formulát automatikus kitöltéssel "lehúzzuk", gyorsan elérjük a megfelelő eredményt:
És bármennyire hihetetlen, ez működik is szépen:
Ennek létezik a még hatékonyabb verziója, amikor a leszűrt adatállományon a célcellákat egyben kijelöljük, beírjuk a formula sorba az első cellára vonatkozó egyenlőséget, majd CTRL+ENTER billentyűkombinációval az egész tartományt kitöltjük automatikusan.
Aztán már csak egy CTRL+R billentyűkombinációt kell lenyomnunk és kész is vagyunk! Se szűrés, se segédoszlop, se adatvesztés.
Na és most ezeket akarjuk láthatóvá tenni. Az alapmegoldás minden esetben a jobb gombbal való kattintás után megjelenő menüből az Unhide opció kiválasztása:
Majd az első sheet kiválasztása és okéra kattintás után szépen ismételjük a mozdulatsort, egészen addig, amíg el nem érjük a kívánt eredményt.
Ennek van a gyorsabb verziója, az ALT+O+H+U és ENTER billentyűkombináció igen gyors nyomogatása.
Ugyebár Excelből ALT+F11 lenyomása után belépünk a VBA-editorba, ott CTRL+G lenyomásával meghívjuk az Immediate ablakot, majd begépeljük az egyetlen soros parancsunkat. Jelen esetben is látható, hogy két : alkalmazásával tesszük lehetővé az Immediate ablak használatát, hiszen itt csak egyetlen sort tudunk lefuttatni, tehát kettőspontok nélkül nem működne ez a megoldás.
Aztán van ennek a megfelelő szubrutinban történő kidolgozása, amikor nagyjából ugyanazt csináljuk, mint az Immediate ablakban, csak a megfelelő formai elemeket is megadjuk a kódsornak:
Ugyanaz, mint az előbb, azaz az aktív munkafüzetünk összes munkalapján végigmegyünk és a Visible paramétert xlSheetVisible státuszra állítjuk.
A felugró Custom Views ablakban kattintsunk az Add gombra:
Adjunk nevet a nézetünknek:
Ha ez megvan, akkor nagyjából kész vagyunk, hiszen most készítettünk egy olyan custom nézetet, amelyben az általunk meghatározott munkalapok láthatóak, ergó bármikor elrejtjük őket, a Custom Views menüpontból előhívhatjuk a korábban meghatározott, minden meghatározott sheetet láthatóként mutató nézetet:
Ezek a leginkább elterjedt megoldási lehetőségek és ötletek, esetleg valamelyik kedves Olvasónak van egy másik (akár gyorsabb, akár nem) a tarsolyában?
És megéri küzdeni és próbálkozni, hiszen még van két hét a határidőig, a nyeremények pedig egy ilyen kihíváshoz mérten rendkívül jók:
Értelemszerűen a legördülő menüből a települések nevei közül tudunk választani, ahogy azt a Source mezőben szépen be is hivatkozzuk:
Eddig ez szerintem bármelyik Excel-felhasználónak ujjgyakorlat, ezért is tekintettem el ezen lépések részletes bemutatásától. Na de hogy érjük azt el, hogy a listában szereplő településeket csak egyetlen egyszer választhassuk ki, azaz ha az első mezőben kiválasztottuk Pilinyt, utána a lehetőségek között ez a nógrádi község már ne szerepeljen?
Látható is, ha kiválasztjuk a legördülő menüt tartalmazó táblában az első sorban Litkét, akkor a segédtábla második segédoszlopában, tehát a Litke melletti cellában nincs érték, a többinél a sorszám szerepel.
Ezután még egy segédoszlopra lesz szükségünk, ahol a fentiekben létrehozott segédoszlopot és az eredeti adatokat is fel fogjuk használni. Ennek az új segédoszlopnak az első cellájába a következő függvényt kell beszúrnunk:
Ez most szörnyen hangzott, de egy gyors példán levezetve ez azt jelenti, hogy például Pilinyen végrehajtott vizsgálatunk eredménye az első lépésnél valahogy így néz ki:
Így pedig már annyit kell csak csinálnunk, hogy a Data Validation listünkben a Source-ot át kell állítanunk erre a második segédoszlopra az eredeti helyett:
Így ha kiválasztunk mondjuk két települést a listáról, ezek a későbbi választási lehetőségek között már nem lesznek ott:
Azt azért mindenképpen meg kell jegyeznem itt a poszt végén, hogy az ötlet nem saját találmány, valamikor pár évvel ezelőtt egy Excel MVP könyvében láttam eredetileg.
Az a cél, hogy a kétszer megjelenő megyéket kékkel, a háromszor megjelenőket zölddel jelölje meg a feltételes formázási eszköz. Ezt fel is véstem a munkalap jobb oldalára, hogy dinamikus hivatkozási lehetőséget adjak magamnak:
A megoldást egyébként Conditional Formatting esetén is a COUNTIF függvény rejti, amely az első paramétereként megadott tartományban megszámolja, hogy a második paramétereként szereplő érték hányszor fordul elő:
Ahogy látjuk, meg is van szépen az eredmény, amely szerint Baranyát, Hevest és Vast kellene majd a feltételes formázásnak is kijelölnie:
Jelöljük ki a táblában értelemszerűen azt a tartományt, ahol többszörös előfordulást keresünk (ez lehet akár a bevétel is), majd a Home ribbonfülön a Styles szekcióban nyomjunk a Conditional Formatting funkcióra és válasszuk a New rule menüpontot:
Itt pedig a Use a formula to determine...szabálytípust kell kiválasztanunk, majd a formula sorba a következőt kell megadnunk:
Ugyanezt toljuk rá a hármas előfordulásra is:
És kész is vagyunk!
Innen pedig szúrjunk be szépen két Opciógombot egymás alá.
Ha ezzel megvolnánk, szúrjunk be ugyaninnen egy Command Buttont is (akciógomb):
Mi a cél? Alig egy tucat kódsor segítségével azt fogjuk elérni, hogy az első opciógomb bekapcsolásával az akciógombunk ki fog szürkülni és nem kattinthatóvá válik, míg a második gomb benyomásával ismét kattintható lesz, ráadásul a színe is megváltozik.
Azaz ha a gombra kattintunk, akkor a G14-es cella értéke 20-ra fog változni.
Most szépen visszaballaghatunk az Excel munkalapra, ahol egy rövid teszt meg is mutatja, hogy tökéletesen működik, amit szerettünk volna:
Innentől kezdve már csak a formázgatás, tuningolgatás van hátra, meg hát persze értelemszerűen a megfelelő integrálás egy már meglévő makrónkba, azzal az elég gyakran ismételgetett észrevétellel, hogy opciógombokat leginkább userformon célszerű használni - nem mintha persze ezzel így most gond lenne.