A néhány hete közzétett automatikus Excel-PowerPoint kapcsolatos poszthoz kapcsolódóan érkezett az egyik kedves Olvasótól egy kérdés, amellyel arra keresi a választ, hogy van-e mód arra, hogy Excelből ne az összes chartot vagy egy specifikusan megnevezett chartot másoljunk át egy PowerPoint diára, hanem a felhasználó kezébe adjuk a választási lehetőséget. Ez is egyértelműen megvalósítható feladat, a következő posztban be is mutatok egy lehetséges irányt.
Szóval adott a következő Excel néhány előre beszúrt példadiagrammal:
Szúrjunk be a Data ribbonfül Data Tools szekciójából egy Data Validationt:
Data Validation Listre lesz szükségünk, amelynek forrása legyen egy üres, később elrejtésre kerülő sheet egy jelenleg még üres tartománya:
Ezután pedig már csak össze kell dobnunk a minimális designt, tehát lesz egy kis magyarázat, a data validation lista plusz egy gomb, amelyhez a PowerPointba másoló kis makrónkat tudjuk majd hozzárendelni.
Na de itt álljunk is meg, mert mostani posztunk legfontosabb tennivalója következik, azaz megírni azt a kis VBA-kódot, ami majd automatikusan frissíti a Data Validation listánk forrástartományát, így lehetővé téve, hogy a felhasználó az adott Excel-fájlunk aktuális chartjai közül választhasson.
Alt+F11 lenyomásával menjünk át a VBA-editorba, majd essünk is neki a kis kódunk megírásának, méghozzá a változók deklarálásával:
Sub Chartlist()
Dim chartobjs As Long
Dim listobj As String
A chartobjs kreatív nevet viselő változó fogja tárolni Excel fájlunk összes chartját az adott sheeten, a listobj változó pedig az összeszedett chartokat fogja a ciklus során végig tárolni és innen populálódnak majd a tartományunk cellái.
Most jöjjön a ciklusunk, amellyel szépen kitöltjük a Sheet2 megfelelő celláit, azaz a Data Validation lista forrástartományát:
With ActiveWorkbook.Sheets(1)
For chartobjs = 1 To .ChartObjects.Count
Az aktív munkafüzetünk első sheetjén szereplő összes charton fog végigmenni a ciklus az elsőtől az utolsóig, és minden egyes chart esetében a következőt fogja végrehajtani:
listobj = .ChartObjects(chartobjs).Name
Sheet2.Cells(chartobjs, 1) = listobj
Tehát a listobj változót teszi egyenlővé az adott cikluskörnek megfelelő számú chart nevével, majd a nevet beírja a chart sorszámának megfelelő számú cellába az első oszlopban a kettes sheeten.
Aztán megyünk a következő chartra a ciklusban és így tovább:
Next chartobjs
End With
End Sub
Ha megvagyunk a kóddal, akkor a lefuttatás után ezt fogjuk látni a második sheeten:
És ha ezt látjuk a második sheeten, akkor az is egyértelmű, hogy mit látunk az első sheeten:
Innentől kezdve pedig már csak arra van szükségünk, hogy beolvassuk a kiválasztott chartunk nevét, majd erre a chartra lefuttassuk a másoló makrót és máris a felhasználóra bíztuk az input meghatározását. Fontos megemlíteni a poszt végén, hogy ez egy nagyon alap kód, tehát bőven lehet finomítani még azzal, hogy mondjuk az összes sheeten vizsgálja a chartokat (még egy For ciklus), plusz minden indításnál fusson le a makró, hogy a legördülő menü friss legyen mindig és így tovább.