Office Guru

Hasznos Excel-dashboard alkatrész: a hőmérős diagram

2017. április 07. - Office Guru

Ha az ember elég sok prezentációt, dashboardot készít a mindennapokban vagy készített elég sokat a múltban, akkor igyekezni kell mindig megújulni és újabb kreatívabb megjelenítési formákat bevetni, különben egy idő után már csak magunkat ismételjük. A következő posztban egy ilyen megjelenítési forma kerül bemutatásra, amely bár elég népszerű volt már a múltban is mindenféle minőségben és formában, eme poszt szerzője nem is túlságosan régen készítette el az első ilyet saját maga - remélhetőleg lesz olyan, akinek ez most szintén segítség lesz.

A célunk, hogy Excelben készítsünk egy hőmérős diagramot, amelynél értelemszerűen a legfontosabb első lépésünk az, hogy meghatározzuk, tényleg erre van-e szükségünk, hiszen egy ilyen hőmérő alapesetben elég korlátozott témakörben használható - főként jelenlegi állapot és célérték összehasonlítására.

Ha eldöntöttük, hogy tényleg ilyesmit akarunk, akkor kezdjünk is neki! Adott tehát az adathalmazunk.

thermo1.jpgÉrtelemszerűen figyeljünk oda arra, hogy aktuális érték és célérték is álljon rendelkezésre, különben nem lesz könnyű megvalósítani a hőmérőt és nincs is nagyon értelme. Jelöljük ki a két értéket (aktuális és cél), majd az Insert ribbonfül Charts szekciójából szúrjunk be egy kétdimenziós, Clustered Chartot:

thermo2.jpgAz ezután megjelenő Design ribbonfül Data szekciójában nyomjunk rá a Switch Row/Column funkcióra:

thermo3.jpgAz így megjelent diagramban, a célértéket megjelenítő oszlopra kattintsunk jobb gombbal, majd Format Data Series:

thermo4.jpgItt a Plot Series On menüpont alatt kattintsuk át a rádiógombot Secondary Axisra:

thermo5.jpgA bal- illetve jobb oldalon lévő tengelyfeliratokat a jobb gombbal történő kattintás után előhívható Axis Options menüből módosítanunk kell úgy, hogy a léptékek illetve a maximumérték ugyanannyi legyen:

thermo6.jpgEzután a most már egymást teljesen fedő oszlopokra kattintsunk, majd formázzuk meg a nagyobbikat (a célértéket), méghozzá úgy, hogy a Format ribbonfül alatt töröljük a kitöltést (Shape Fill - No Fill) illetve adjunk neki egy erősebb körvonalat:

thermo7.jpgEzzel még nem ér véget a formázgatás, most kell például törölnünk a jobb oldali tengelyfeliratokat, a címet, a gridline-okat illetve most kell átméreteznünk a diagramot is úgy, hogy nagyjából hőmérőre emlékeztető vastagságot és formát kapjunk:

thermo8.jpgA bal oldali axisra jobb gombbal kattintva előhívjuk megint az Axis Options-t, majd a Tick Marks alatt a hőmérőre hasonlítás érdekében még tegyünk be beosztást jelölő "vonalkákat" is:

thermo9.jpgHa felmerülne valakiben olvasás közben a kérdés, hogy mégis hogyan lehet átállítani a "folyadék" színét, akkor ez a kép remélhetőleg segítség lesz:

thermo10.jpgA Format ribbonfül Current Selection szekciójából kell kiválasztanunk a Series 2 objektumot, ha a "folyadékot" akarjuk babrálni. Visszatérve a diagramunkhoz, még egy lépés van hátra, méghozzá az, hogy a hőmérőnk alját is elkészítsük. Lehet elkeskenyedő hegyes vége, mint egy lázmérőnek, de lehet gömbölyű is, döntsük el, de például egy gömbölyű részhez az Insert ribbonfül Illustrations szekciójából kell beszúrnunk egy ovális formát:

thermo11.jpgFormázzuk meg majd illesszük hozzá az eddigiekhez és kész is vagyunk:

thermo12.jpg

Fókuszálás és elhomályosítás PowerPoint prezentációnk diáin

Egy jó, figyelemfelkeltő, ütős prezentáció összeállítása mindig időigényes és kreatív folyamat vagy legalábbis annak kell lennie, különben beleeshetünk jónéhány prezentációs csapdába, amelyek után az összhatás nem igazán az lesz, amit szeretnénk. Úgyhogy folytatva a korábbi hasonló Powerpointos posztok hagyományait, a mai írásban is egy aprócska technikát fogok bemutatni, azzal a célzattal, hogy ez és az ehhez hasonló technikák összegyúrásával mindenki tényleg össze tudjon hozni egy hatásos prezentációt, ha szüksége lesz rá.

A mai poszt célja egy olyan animációs módszer bemutatása roppant egyszerűen és röviden, amelynek során a diánkon lévő kép bizonyos részletére tudunk fókuszálni, úgy, hogy közben a háttér szépen elhalványul. A jobb megértés érdekében álljon itt egy kép:

prez1.jpgA térképen majd Nuku'alofát, Tonga fővárosát fogjuk élesen hagyni, míg a térkép többi része elhalványul, aztán majd a fővárosról dobálunk fel hasznos információkat az elhalványult térképrészleteken.

Először is az Insert ribbonfül Illustrations szekciójából a Shapes menüből szúrjunk be egy téglalapot és pontosan helyezzük a térképünkre:

prez2.jpg

prez3.jpgAhogy látható is, defaultban piros a kitöltés, tehát nem is látjuk most a térképet. Ezután ezt a pirossal kitöltött formát mozgassuk kissé le a térképről, pont annyira, hogy azért lássuk már a fővárost a térképen. Ezután ismét a Shapes menüből szúrjunk be ezúttal egy ovális formát:

prez4.jpgMajd a formát a következő képen látottaknak megfelelően helyezzük a fővárosra, értelemszerűen ezúttal kitöltés nélkül (No Fill).

prez5.jpgHa visszahúzzuk az eredeti téglalap-formát a térképünkre, akkor valami ilyesmit fogunk látni:

prez6.jpgTehát már látjuk a kört, nagyjából Nuku'alofa magasságában. Ezután két dolgot kell megtennünk: egyrészt CTRL lenyomásával kattintsunk a körünkre és a téglalapunkra is egyszerre, majd a Format Ribbonfül alatt található Insert Shapes szekcióból a Merge Shapes gombra kattintva egyesítsük ezt a két formát (Combine opció).

prez7.jpgMajd erre az egyesített formára jobb gombbal kattintva válasszuk az Outline menüt, majd távolítsuk el a keretet:

prez8.jpgUgyanitt a Fill menüből színezzük fehérre a formát. Ezt kapjuk:

prez9.jpgEzután ha jobb gombbal ismételten az egyesített formánkra kattintunk, akkor a legördülő menüből válasszuk a Format Shape menüpontot, majd az oldalt felbukkanó opcióablakban a Transparency értékét állítsuk mondjuk 20% körülire:

prez10.jpgEzután már csak arra van szükségünk, hogy ugyanezen egyesített formát kijelölve, az Animations ribbonfül alatt szúrjunk be erre a formára egy Fade stílusú animációt:

prez11.jpgMajd az esetlegesen az elhomályosítás, kiélesítés után megjelenő extra szövegdobozunkra is tegyünk rá egy Fade típusú animációt:

prez12.jpgÉs ha most elindítjuk az animációt, már láthatjuk is, hogy az alapból megjelenő sima térkép előbb elhomályosul, élesen hagyva a Nuku'alofa körüli kört, majd ezután megjelenik a szövegdobozunk is a hasznosnak vélt információkkal:

prez13_1.jpg

Persze itt még nyugodtan változtathatunk rengeteg dolgon, például az animációt elindító eseményen (kattintás stb.), az animáció sebességén és így tovább, de remélhetőleg ez az egyszerű kis leírás segítségül fog szolgálni egyik-másik Olvasónak.

Variációk egy témára: dinamikus tartományok és automatikusan bővülő formulák

Az egyik kedves Olvasó vetett fel egy kérdést nemrégiben egy, valószínűleg mindennapos Exceles formula problémával kapcsolatban, úgyhogy a következő posztban ezen kérdéskör körül fogok ötletelni.

A példa a következő kis táblán egyszerűen bemutatható:

sumext1.jpg

sumext2.jpgHogy érjük el azt, hogy a H4-es cellában lévő összegzés mindig magától frissüljön, ha a C-D oszlopokban található táblázatunkhoz új sorokat adunk hozzá?

A legegyszerűbb és legkönnyebben megadható válasz az Excel automatikus "hivatkozás-bővítés" funkciója, azaz ha bárhova beszúrunk egy üres sort a táblába az első és az utolsó érték közé, akkor a függvény automatikus frissülni fog és beleveszi a frissen beszúrt sorunk értékét is:

sumext3.jpgÉrtelemszerűen ez okozhat problémákat, ha rengeteg oszlopunk van vagy ha minden sorunk mellett van egy beképletezett másik cella is, de például ha az összegzésünk egy másik sheeten található és a táblánk is egyszerű, akkor ennél nincs jobb megoldás (mondjuk ez nem is megoldás, hanem maga a program nyújtotta automatizmus). Viszont ha mindig az utolsó sor után adunk hozzá egy újat (mondjuk napokat), akkor ez nem működő opció.

Erre lehetőségünk az, hogy a formulánkban nem a pontos tartományt, hanem akár az egész oszlopot meghivatkozzuk:

sumext4.jpgDe hivatkozhatunk egy elég nagy tartományt is, mondjuk D10:D100000, ha az lefedi jó előre a hozzáadandó celláinkat.

Kezelhetőség szempontjából biztosan nem a legegyszerűbb megoldás, de biztosan működő ötlet a táblafunkció használata, ha extra sor akár hozzáadásáról akár beszúrásáról van szó. A táblázatunk kijelölése után az Insert ribbonfül Tables szekciójának Table opcióját választva szúrjunk be egy táblát (figyelve arra, hogy van-e már fejlécünk vagy nincs):

sumext5.jpgInnentől kezdve pedig akár a sorok közé, akár a sorok után szúrunk be új adatot, a tábla automatikusan frissülni fog:

sumext6.jpgViszont legnagyobb valószínűség szerint a fentiekhez képest jóval kényelmesebb és stabilabb megoldást kínálnak a dinamikus tartományok, amely megoldásokban az a közös, hogy egytől-egyig mindet a Formulas ribbonfül Defined names szekciójában fogjuk megalkotni a Define Name menüpont segítségével:

sumext7.jpgA következőkben néhány ilyen nevesített tartományhoz rendelt formulát fogunk megnézni, amelyek mindegyike segíteni fog a fent felvetett kérdés megoldásában.

Az elsőben a Range-ként elnevezett tartományunk Refers to sorába a következő formulát írjuk:

=OFFSET(Sheet1!$D$4,0,0,COUNT(Sheet1!$D:$D),1)

A korábbi posztokban mindkét függvényt megismertük már, de alapvetően ez a formula azt teszi, hogy táblánk első számértékétől kezdve (ez a D4-es abszolút hivatkozás) visszaad egy olyan celltartományt, amely ettől a D4-es cellától annyi cellával lefelé nyúlik, ahány számértékünk van a D oszlopban (ez lesz a COUNT függvény eredménye, jelen esetben hét).

Ezután pedig már szimplán elég ha a SUM függvényt erre a Range nevű nevesített tartományra húzzuk rá:

sumext8.jpgÉs akkor ennek az OFFSET-es nevesített tartományos hivatkozásnak használhatjuk jópár másik verzióját is, például ezt:

=OFFSET($D$4,0,0,MATCH(1E+306,$D:$D,1),1)

Ez valamelyest hasonló az előbbihez, azzal a változással, hogy a MATCH függvény alkalmazásával tartományunk mindig az utolsó számot tartalmazó celláig terjed majd.

Utána pedig értelemszerűen erre a nevesített tartományra kell az érintett alapfüggvényt elkészítenünk.

sumext9.jpg

Néhány gondolat a nevezetes 400-as hibaüzenetről

Alapvetően ha maguknak az Office programjainak a hibaüzenetei nem is igazán szoktak mindig sokat elárulni a hiba természetéről, addig alapesetben azért a Visual Basicben valamennyivel könnyebb dolgunk van, hiszen az esetek jelentős részében legalább egy általános üzenetet kapunk, amely üzenetablak Debug gombjának lenyomásával a problémás sort is be tudjuk azonosítani. Lásd például ezt a hírhedt Excel-hibaüzenetet:

error2.pngÉs ez pedig a másik oldal lenne, két VBA-hibaüzenettel:

error3.png

error4.jpgPersze itt most azért eléggé általánosítottam, hiszen akár fordított felállásban is tudtam volna hibaüzeneteket hozni, VBA esetében például mindenképpen a nehezen megfejthető hibaüzenetek listáján előkelő helyen szerepelne a hírhedt 400-as hiba:

error1.pngNem megfejthetetlen, az nem kérdés, de a megszokottól kicsit eltérően itt nem kapunk segítséget első körben, magunknak kell utánajárni a problémát okozó sornak. Leggyakrabban egyébként ilyet akkor láthatunk, ha a kódunkban valami olyasmire hivatkozunk, ami (már) nem létezik - például egy nem létező munkafüzetre vagy olyan változót akarunk mondjuk használni, amit nem deklaráltunk stb. (tehát nagyjából egy Application-defined or object-defined errornak feleltethető meg). Viszont a megoldás mindenképpen csak a manuális soronkénti ellenőrzés lehet, hiszen nem tudhatuk hol bújik meg a téves hivatkozás - bár azt azért ki tudjuk deríteni, hogy pontosan milyen hibánk van.

Ehhez nem kell mást tennünk, mint az adott kód változóinak deklarálása után beszúrni a következő sort:

On Error GoTo Errorcatch (vagy akár Errortrap, errorcheck és így tovább)

Majd az End Sub lezáró sor elé a következőt behelyezni:

Exit Sub
Errorcatch: MsgBox Err.Description

Így a 400-as hiba helyett valamivel több információt már be tudunk gyűjteni a problémáról egy felugró üzenetből és ha már tudjuk, hogy merrefelé keresgéljünk, akkor a beazonosítás is könnyebb lehet breakpointok beszúrásával vagy a sorok lépésenkénti futtatásával. De szívesen fogadok kommentben észrevételeket ennek a hibaüzenetnek a történetéről (az tény, hogy már a 97-es Excelben is elő tudtuk idézni), hiszen a fentiekben csak roppant általános jellemzőket foglaltam össze róla.

Könnyed ünnepi jótanács: a Spin Button használata

Minimális VBA-ismeret nélkül is rendkívül jól használható vizuális elem egy Excel-táblázatban a Spin Button, amelynek nyilaival szépen tudunk le- és felfelé mozogni egy listában és utána az aktuális értékkel mindenféle műveleteket is el tudunk végezni, anélkül, hogy a konkrét listát látnánk. Nézzünk meg erre egy roppant egyszerű kis példát!

Az Excel megfelelő sheetjén állva a Developer ribbonfül Controls szekciójából szúrjunk be egy Spin Buttont:

spin1.jpgMajd építsünk fel köré egy kis designt, amilyet éppen akarunk:

spin2.jpgAz én kis táblám csak a példa kedvéért négy magyar város és ezek lélekszáma lesz, tehát a nyilak segítségével a városok között tudunk majd váltogatni és ezen kiválasztott értékhez függvénnyel keressük majd be a lélekszámot. Értelemszerűen a segédtábla bárhol lehet az Excelben, most csak az egyszerűség kedvéért van a Spin Button közelében.

Kattinsunk jobb gombbal a Spin Buttonra, majd válasszuk a Format Control menüt, amelyben a Control fül lesz fontos nekünk. Első lépésként a Cell link mezőbe egy jelenleg még üres segédcella nevét írjuk be (nálam ez most véletlenszerűen az O3 lesz), amit szintén célszerű elrejtenünk egy "éles" munkalapnál:

spin3.jpgKövetkező lépésként lépjünk bele abba a cellába, ahol majd a nyíl nyomogatása után szeretnénk megjeleníteni a lista értékeit és a következő formulát írjuk be:

=INDEX(M4:M7,O3)

spin4.jpgUgyebár azt már kívülről fújjuk, hogy az INDEX függvény az első paramétereként megadott tömbből a második paramétereként megadott számú sorban lévő értéket adja vissza, így látható, hogy a négy település neve lesz a tömb, a Spin Buttonhoz linkelt O3 cella pedig a sorszámot fogja adni.

spin5.jpgAz O3 linkelt cella pedig a Spin Button nyilai alapján kapja az értéket, attól függően, hogy éppen hol állunk a tartományban. Fontos tennivaló még a maximum és minimum értékek beállítása, ugyanis ellenkező esetben lenne rengeteg #REF hibaüzenetünk is. Szóval kattintsunk még egyszer jobb gombbal a Spin Buttonra, majd a Format Control menü Control fülén állítsuk be a minimum és maximum értéket:

spin6.jpgÉs ezzel kész is vagyunk, a lélekszám bekeresését már nem fogom printscreenelni, azt a messze legismertebb Excel-függvénnyel, a VLOOKUP formulával könnyedén meg tudjuk oldani.

Data validation lista automatikus feltöltése munkalapunk chartjaival

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:

listofcharts.jpgSzúrjunk be a Data ribbonfül Data Tools szekciójából egy Data Validationt:

listofcharts1.jpgData 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:

listofcharts2.jpgEzutá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.

listofcharts3.jpgNa 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:

listofcharts4.jpgÉs ha ezt látjuk a második sheeten, akkor az is egyértelmű, hogy mit látunk az első sheeten:

listofcharts5.jpgInnentő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. 

Érdekes fejtörők beágyazott objektumokhoz kapcsolódóan

A mai posztban igazából két, nem túlságosan komplex, ám néha fejtörést okozó problémára keresem és próbálom megadni a választ, amelyekben a közös az, hogy mindkettő beágyazott objektumokhoz köthető. Az első a PowerPointot érinti és valószínűleg mindenki, aki valaha prezentált már ezzel a programmal, találkozott vele. Képzeljük el, hogy van egy szépen megkomponált előadásunk, a közönséget sikerült is lenyűgöznünk, figyelnek ránk, de aztán odaérünk egy diához, amelyen van egy beágyazott objektumunk, mondjuk egy Excel fájl, néhány fontos, bemutatandó adattal.

001_3.bmpNos, alapesetben ezt csak úgy tudjuk megnyitni, ha leállítjuk a prezentációt, visszalépünk szerkesztő üzemmódba, majd a megtekintés után újraindítjuk a vetítést. Ez általában eléggé megakasztja a prezentáció varázsát, úgyhogy következzen egy lehetséges megoldási mód a fentiek elkerülésére.

Szerkesztő üzemmódban lépjünk arra a diára, amelyen a beágyazott Excel-fájlunk van, jelöljük ki a fájlt, majd az Insert ribbonfül Links szekciójában található Action menüpontra kattintsunk:

002_2.bmpFelugrik egy eléggé magától értetődő kis ablak:

003_2.bmpItt tudjuk meghatározni azt, hogy mit tegyen a program akkor, ha rákattintunk (Mouse Click fül) vagy ráhúzzuk (Mouse Over) az egeret az adott objektumra. A lehetőségek elég jók, átléphetünk másik diára, elindíthatunk egy makrót vagy egy programot, illetve ami most minket leginkább érdekel, eseményt rendelhetünk az objektumra való kattintáshoz.

Mivel mi most megnyitni szeretnénk a beágyazott Excelünket, ezért kattintsuk be az Object action rádiógombot, majd válasszuk ki az Open eseményt és ha még esetleg a kattintás kijelölése (Highlight click) checkboxot is bepipáljuk, akkor nagyjából tökéletesen el is értük, amit akartunk. És ha most elindítjuk a vetítést, már működik is, amit mindig szerettünk volna:

005_1.bmpA másik kérdéskör, amit röviden feszegetni fogok, valószínűleg annyira ritka felhasználói igényt testesít meg, hogy tömegek valószínűleg nem is fogják felhasználni ezt a megoldást, de talán mégis segítség lehet valakinek. Ha van egy Excel-fájlunk, amiben különféle sheeteken szétszórva, elrejtve stb. vannak beágyazott objektumaink és egy summary sheetről kattintások alapján szeretnénk ezeket megnyitni (tehát nem linkeket akarunk, hanem egy cellára kattintva az ugyanabban az Excel-fájlban valahol beágyazott objektumunk nyíljon meg), akkor a következő út járható lesz.

object1_1.jpgA cél tehát az, hogy ha a D4-re (tehát a bekeretezett cellára) duplán kattint a felhasználó, akkor megnyíljon a példaként beszúrt kép-objektum. Menjünk át a VBA-editorba ALT+F11 lenyomásával, majd válasszuk ki, hogy az adott munkalap BeforeDoubleClick eseményéhez szeretnénk egy kódot hozzárendelni:

Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)

Ezután pedig meg kell határoznunk az eseményhez tartozó két paramétert, azaz ha a dupla kattintás abszolút hivatkozással a D4-es cellán történik (Target.Address), akkor szépen nyisson meg egy meghatározott névvel bíró beágyazott objektumot, majd tekintse megtörténtnek a dupla kattintást (Cancel = True).

Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
If Target.Address = "$D$4" Then
Sheets("Sheet1").OLEObjects("Object 1").Verb
Cancel = True
End If
End Sub

Ennyi lenne a történet. Az OLEObjects általában egy Active-X controlt, egy linkelt vagy beágyazott objektumot testesít meg, zárójelben mögötte nevesítjük is, hogy éppen melyiket. Az OLEObjects Verb metódusával pedig igazából műveletet tudunk végezni ezzel az objektummal, elég sok lehetőségünk van, amelyeket azonban az adott objektum forrásprogramja is meghatároz. Amennyiben nem adjuk meg a Verb paraméterét, akkor a default műveletet, a szerkesztést fogja végrehajtani, amire pont szükségünk is van.

R1C1: a sok hátrány mellett néhány előny bemutatása a Microsoft eredeti hivatkozási formátuma mellett

Aki elég régóta bütyköli az Excelt, az valószínűleg kapott már kérdést baráttól, kollégától, ismerőstől arra vonatkozóan, hogy mégis mi történt akkor, amikor ő ezt látja táblázatkezelőjében:

rc01.jpgA standard válasz pedig szintén valószínűsíthető módon ott volt a kedves Olvasó tarsolyában, azaz az Excel Options Formulas almenüjét kell választani:

rc02.jpgItt pedig a Working with formulas szekcióban ki kell venni a pipát az R1C1 reference style checkboxból.

rc03.jpgA probléma megoldva és lehet is továbblépni, viszont azért a kérdés ott maradhat sokakban: vajon erre az R1C1 hivatkozásos dologra mi szükség van, egyáltalán használja-e ezt valaki a mindennapokban?

A válasz a kérdésre igen, van egy-két elvetemült VBA-szerető, aki az 1982-ben a Microsoft Multiplan névre hallgató, a Lotus 1-2-3 verzióival versenybe szálló táblázatkezelő programjához megalkotott hivatkozás-struktúrát használja a megszokott A1,B1,C1 stb. helyett. Bizony, a B1 típusú cella-oszlop hivatkozás nem a Microsoft ötlete volt, bár hozzátartozik az igazsághoz, hogy az akkor még jelentős mértékben domináns Lotus lenyomása érdekében a Microsoft előbb a saját programjába is berakta mindkét hivatkozási formát, majd később fel is vásárolta vetélytársát.

Szóval igazság szerint túlságosan sokat nem kell agyalni a dolog hátterén, hiszen ez is csak egy olyan hivatkozási forma, mint a B1 típusú, ha valaki egyszer megértette a logikát, könnyedén megszokhatja ezt is.

Az alapkoncepció pedig a következő összeadáson keresztül gyorsan le is követhető. Adott a normál, megszokott formátum:

rc04.jpgÉs adott az R1C1 típusú formátum:

rc05.jpgAz R és C betűk angolul tudók számára valószínűleg azonnal érthető rövidítések, az R a sort (Row), a C pedig az oszlopot (Column) jelöli. Attól függően változik a mozgás iránya az aktuális cellához képest, hogy

1) a pozitív/negatív szám az R vagy a C betű mögött van-e, hiszen az R a sorban való mozgást, a C mögötti szám pedig oszlopban való mozgást jelent

2) pozitív vagy negatív szám van-e a betűk mögött, hiszen oszlopok esetén a negatív szám eggyel balra lépést jelent (a pozitív értelemszerűen jobbra), míg sorok esetén a negatív szám felfelé, a pozitív lefelé való lépést jelöl.

Tehát az utolsó képen az első oszlopban lévő összegzésnél látható ugyebár, hogy az aktuális cellától kettővel illetve eggyel feljebb lévő cellák tartalmát összegezzük. A harmadik oszlopban lévő összegzésnél ugyanez van, csak oszlopokra (vegyük észre, hogy itt már a C betű mögött vannak a számok), azaz az aktuális cellától kettővel balra lévő oszlop ugyanazon sorában található értéket adjuk össze az eggyel balra lévő oszlop ugyanazon sorában lévő értékkel.

És akkor a kérdés: mi kerül a második oszlopba, ha az egyes oszlop ötösét és a második oszlop hármasát akarom összeadni? A válasz:

=RC[-1]+R[-1]C

Ugye hogy nem nagy ördöngősség? Persze ez nem azt jelenti, hogy szakítanunk kellene a megszokott hivatkozási formánkkal, de azért ennek a típusnak is vannak előnyei a hátrányai mellett. Melyek ezek?

1. A VBA-ban könnyebben fog később menni a hivatkozások beírása, hiszen az Excelben R1C1 formában az abszolút hivatkozás is jóval egyszerűbb és tükrözi a "VBA-formátumot", hiszen az R3C1 minden esetében a harmadik sor első oszlopát fogja jelenteni és így tovább.

2. A második előny nagyjából ebből következik, hiszen ez minden furcsasága ellenére valószínűleg hatékonyabb módszere az abszolút hivatkozás beírásának, mint az F4 krónikus nyomogatása.

3. Az R1C1 módszerrel egyszerűbb eltévesztett abszolút-relatív hivatkozásokat javítani, hiszen az R1C1 hivatkozási formában bárhogy húzzuk le vagy húzzuk jobbra-balra automatikus kitöltéssel a cellánk, a formula ugyanaz marad, nem változik - így ha korrigálni akarunk egy bentmaradt relatív hivatkozást, akkor szimplán a megfelelő R1C1 hivatkozáson hajtunk egy Find/Replace műveletet.

4. Jóval kevésbé változnak a képleteink az R1C1 használatával, azaz például a következő összeadás sorozat esetén a formulánk minden egyes sorban teljesen ugyanaz.

rc06.jpgA konkluzió persze nem az, hogy most rohanjunk és azonnal így kezdjük el használni az Excelünket a bevált B1 típusú hivatkozás helyett, de remélhetőleg a fenti poszt segített megérteni egyrészt az R1C1 hivatkozástípus létének okát, másrészt azt, hogy miért van a mai napig olyan felhasználó, aki szívesen használja ezt a módszert.

Fájlok, könyvtárak bütykölése SharePointon VBA segítségével

Ha az elmúlt posztokban amúgy is az Excel és egyéb Office-modulok vagy programok kapcsolatát feszegettem, akkor folytassuk ezzel ismét, ugyanis a mai nap egy olyan apró kódsor kerül bemutatásra, amelynek segítségével roppant egyszerű módon tudunk fájlokat SharePointra feltölteni (de a módszer megismerésével sokkal többre is képesek leszünk).

Igazából ennél a témánál túlságosan nagy bevezetőt nem is lehet írni, hiszen a cél egyértelmű: van egy meghatározott fájlunk valahol (vagy usertől bekért elérhetőségünk), amit egy gombnyomással szeretnénk automatikusan egy meghatározott (vagy user által megadott) SharePoint folderbe bemásolni.

Tehát jelenleg érintetetlen az adott Document folder a SharePointon:

sp01.bmp

Szépen Alt+F11 lenyomásával az Excelünkből vándoroljunk be a VBA-editorba, majd kezdjük is el a kódunkat. Első lépésként értelemszerűen a változók deklarálásával kezdünk, alapesetben 4 változót fogunk használni.

Dim SharepointAddress As String
Dim LocalAddress As String
Dim WSNET as Object
Dim FileSO as Object

Ahogy látszik, az első két változó a SharePoint folder illetve a felmásolandó fájlunkat tartalmazó folder elérhetőségét fogja tárolni, a másik kettő objektum típusú változóra pedig konkrétan a SharePointhoz való kapcsolódás okán lesz szükségünk. Töltsük is fel őket, elsőként értelemszerűen a két útvonal-változót:

SharepointAddress = "\\officeguru.sharepoint.com\documents\fontos" & "\"
LocalAddress = "C:\1.bmp"

Figyeljünk oda arra, hogy a SharePointunk elérhetőségének megadásánál ne adjuk meg a http protokollt, illetve a tartománynév előtt mindenképp legyen két backslash karakterünk is. Pluszban ne felejtsünk még egy backslasht a végére is odavarázsolni.

Aztán jöhet a kódunk kulcsa, a két objektum típusú változó feltöltése.

Set WSNET = CreateObject("WScript.Network")
Set FileSO = CreateObject("Scripting.FileSystemObject")

A CreateObject("WScript.Network") objektumot jó megjegyezni hosszútávon is, hiszen ennek segítségével kapcsolódhatunk hálózati erőforrásokhoz, könyvtárakhoz, tárhelyekhez, nyomtatókhoz és információt gyűjthetünk be más, a hálózaton elérhető felhasználóról vagy akár saját magunkról is. Azaz egy ilyen objektumot kell akkor is használnunk, ha mondjuk nyomtatók akarnánk hozzáadni, majd defaultként beállítani.

A második objektum szintén elég fontos alaptudnivaló (ahogy erről már volt itt szó korábban), hiszen a FileSystemObject segít nekünk abban, hogy információkat gyűjtsünk be könyvtárakról, fájlokról, töröljünk, létrehozzunk könyvtárakat, fájlokat mozgassunk stb. A Scripting azt jelenti, hogy az FSO ebben a könyvtárban, a Scrrun.dll-ben érhető el.

Ha ezzel megvagyunk, akkor nagyjából már csak nagyjából a művelet elvégzésére van szükségünk (jelen esetben a másolásra):

If FileSO.FileExists(LocalAddress) Then
FileSO.CopyFile LocalAddress, SharepointAddress
End If

Az If feltételes utasításra azért van szükségünk, mert az FSO FileExists metódusa segítségével először megnézzük, hogy egyáltalán létezik-e a másolandó fájl, hiszen ha igen, akkor az FSO CopyFile metódusa segítségével meg is ejtük a műveletet - ellenkező esetben célszerű visszatérni a felhasználóhoz valamilyen üzenettel.

Ezután már nincs más hátra, mint esetlegesen a változók kiürítése és a szubrutin befejezése.

sp03.bmpInnentől kezdve már csak a képzeletünk és az elvégzendő feladat szab határt a lehetőségeknek, hiszen akár létrehozhatunk egy gombokkal vezérelhető userformot is vagy akár automatikusan beépíthetjük a felmásolást egy hosszabb kódunkba:

sp04.bmpÉs innentől kezdve az első képen bemutatott üres könyvtár pillanatok alatt megtölthető automatikusan:

sp02_1.bmp

YouTube videó PowerPoint prezentációban

Ha PowerPoint bemutatónkkal nem szeretnénk a neten eléggé gyakran idézett és ismert "halálra untatás prezentációval" nevű állapotba sodorni hallgatóságunkat, akkor minden egyes alkalommal be kell dobnunk valami extrát a figyelem fenntartása érdekében. Ez lehet valami egészen váratlan, de akár a meglévő lehetőségek kombinálásával is elérhetjük ezt - most egy ilyen, előnnyel és hátránnyal egyaránt bíró funkcionalitásról lesz szó: YouTube videót fogunk automatikusan elindítani az egyik diánkon.

Adott tehát egy üres slide, ahol majd videót szeretnénk használni:

youtube1.jpgA Developer ribbonfül Controls szekciójában kattintsunk a More Controls ikonra:

youtube2.jpgA felugró listában keressük meg és válasszuk ki a Shockwave Flash Object nevű controlt:

youtube3.jpgAz objektum beszúrása után ezt fogjuk látni:

youtube4a.jpgKattintsunk rajta jobb gombbal, majd a felugró content menüből a Property Sheet opciót válasszuk ki:

youtube5.jpgItt a tulajdonságok listájában menjünk el egészen a Movie tulajdonságig, majd ide illesszük be a YouTube videónk elérhetőségét:

youtube6.jpgFigyeljünk arra, hogy a helyes működés érdekében a linket kicsit át kell alakítanunk, azaz ebből

https://www.youtube.com/watch?v=sI8_cJFQOkk

ezt kell létrehoznunk:

https://www.youtube.com/v/sI8_cJFQOkk

Ezután pedig már látjuk is az eredményt:

youtube66.jpgHa még azt is szeretnénk beletenni, hogy a videó az adott diára való érkezéskor automatikusan induljon el, akkor nem kell mást tennünk, mint az előbb beollózott link után tegyük be a &autoplay=1 taget.

youtube8.jpgEzzel pedig meg is vagyunk! Hasonló módon egyébként más videómegosztókkal is tudunk ügyködni, vimeoval például szintén könnyedén meg tudjuk ezt csinálni.

süti beállítások módosítása
Mobil