Color profile: Generic CMYK printer profile Composite Default screen
Az utolsó használt cella kijelölése
Készítsünk programot amelyik valóban a munkalapon fel-
használt tartomány legutolsó celláját jelöli ki, ha a CTRL+END billentyû-kombinációt leütjük.
A feladat meghatározása Az elsõ feladatban módosítsuk a CTRL+END billentyû-kombináció mûködését. Ez ugyanis már az Excel korábbi változataiban is érdekesen mûködött. Ennek a billentyû utasításnak az a feladata, hogy kijelölje legutolsó felhasznált cellát. Ezt úgy kell értenünk, hogy ha például az A3-as és a D1-es cellába adatokat írtunk, akkor a legutolsó felhasznált cellának a D3-ast tekinti a program. Vagyis megkeresi a legutolsó sort és oszlopot amiben adatot módosítottunk és ezek metszéspontjában található cellát választja ki. Ez nem mindig jó. Próbáljuk ki mi történik akkor, ha mind az A3-as mind pedig a D1-es cella tartalmát töröljük, és szeretnénk kijelölni a pillanatnyilag használt utolsó cellát. A törlés után is a D3-as cellát fogja az utolsó használt cellaként kijelölni. Készítsünk egy olyan programot, ami CTRL+END leütése után a valódi utolsó cellát választja ki. A feladat megoldáskor ügyeljünk arra is, hogy a CTRL+END csak addig mûködjön a módosítottak szerint, amíg a programot tartalmazó munkafüzet be van töltve. A feladat megoldásának a kulcsa a munkalap objektum UsedRange tulajdonsága. A tervezés elõtt kicsit nézzünk utána a mûködésének.
A program algoritmusa Munkafüzet betöltésekor Az elsõ programrészletet akkor kell végrehajtanunk, amikor betöltjük a projektet, vagyis a munkafüzetet. Ekkor kell majd hozzárendelnünk a CTRL+END billentyû-kombinációhoz azt az eljárást, amelyik megkeresi az adott munkalap utolsó használt celláját. Ennek a programozását a jelenlegi munkafüzet osztálymoduljába fogjuk megírni.
1
E:\Dokumentumok\Excel makro\Ventura\Feladatok\Service\Service.vp 1999.januÆr.27. 13:22:08
Color profile: Generic CMYK printer profile Composite Default screen
AZ UTOLSÓ HASZNÁLT CELLA KIJELÖLÉSE
Vagyis felhasználjuk a jelenlegi munkafüzet Open eseményvezérelt eljárását.
Ugrás a utolsó cellára Ez egy önálló modul eljárása lesz. Az eljárás neve legyen EndCella. Ebben az eljárásban kiszámítjuk az utolsó cella helyét és amikor ez megvan, ki is jelöljük. A számításhoz felhasználjuk az aktív munkalap UsedRange tulajdonságát, ami tartomány típusú. A tartomány elsõ sorát meghatározhatjuk a Row, tulajdonságával. Ehhez hozzá kell adnunk az UsedRange tartomány sorainak számát. Ez a sorszám az utolsó használt cella mögé mutat, így le kell vonnunk egyet a kiszámított értékbõl ahhoz, hogy megkapjuk az utolsó sor számát. Az utolsó oszlop kiszámításához ugyanezt a módszert használjuk, csak most a Column és a Columns.Count – oszlopok száma – tulajdonságokat fogjuk felhasználni. Miután meghatároztuk az utolsó sor és oszlop számát, egy Cells kijelölés segítségével kijelöljük az utolsó felhasznált cellát.
A munkafüzet bezárása elõtt Mielõtt bezárnák a munkafüzetet, állítsuk vissza a CTRL+END billentyû-kombináció mûködését eredeti állapotába. Ennek a megvalósítására a jelenlegi munkafüzet BeforeClose eseményvezérelt eljárását használjuk fel.
A program terve (Jackson módszer) Munkafüzet betöltésekor A munkafüzet megnyitás eseményvezérelt eljárásában egyetlen utasítás lesz. Tervezzük meg ezt az egyszerû eljárást is.
Munkafüzet megnyitás
Open esemény
m F 1
F1: A munkafüzet megnyitása esemény bekövetkezett T1: A CTRL+END billentyû-kombinációhoz hozzá rendeljük az EndCella eljárást
T1
2
E:\Dokumentumok\Excel makro\Ventura\Feladatok\Service\Service.vp 1999.januÆr.27. 13:22:08
Color profile: Generic CMYK printer profile Composite Default screen
A PROGRAM TERVE (JACKSON MÓDSZER)
Tehát az esemény bekövetkezését feltételként ábrázolhatjuk. Ezt a Jackson ábra Szelekció dobozával jelöljük. Az elkészített ábrát a kódolás során utasítássorokká fogjuk alakítani.
Ugrás az utolsó cellára Folytassuk a munkát az EndCella eljárás megtervezésével. Ez az eljárás valójában egyetlen utasítással is elkészíthetõ, de az utasítássorok olyan hosszúak lennének, hogy késõbb nehéz lenne benne bármilyen módosítást elvégezni. Ezért bontsuk több utasításra. Az elsõ az legyen, amelyikkel kiszámítjuk az utolsó felhasznált tartomány utolsó sorát, majd számítsuk ki az utolsó felhasznált oszlopot is. A két kiszámított adat segítségével jelöljük ki az aktív munkalap utolsó celláját. Ennek a Jackson ábrája a következõ lesz: Utolsó cella jelölése
Utolsó sor kiszámítása
Utolsó oszlop kiszámítása
Utolsó cella kijelölése
A munkafüzet bezárása elõtt Fejezzük be a tervezést azzal, hogy rajzoljuk le azt a Jackson ábrát is, ami a munkafüzet bezárásakor végrehajtandó programot ábrázolja. Füzet bezárása
Bezárás esemény
m F 1
m F 2 Visszaállítás
F1: Munkafüzet BeforeClose esménye bekövetkezett. F2: Nem szakítottuk meg a bezárást T1: A CTRL+END visszaállítása
T1
3
E:\Dokumentumok\Excel makro\Ventura\Feladatok\Service\Service.vp 1999.januÆr.27. 13:22:09
Color profile: Generic CMYK printer profile Composite Default screen
AZ UTOLSÓ HASZNÁLT CELLA KIJELÖLÉSE
A program kódolása Az elkészített ábrák felhasználásával írjuk meg a program kódját. Ehhez szükségünk lesz a mellékletre, vagy a programnyelv más leírására. Most már a megfelelõ utasításokat kell megkeresnünk.
Munkafüzet betöltésekor Az eljárás megírásához használjuk fel annak a munkafüzetnek a ThisWorkbook osztálymodulját, amelyikben a jelenlegi projektet létrehozzuk. A Jackson ábrán feltüntetett Open esemény szelekciót nem kell külön megírnunk, mivel ez már készen vár minket a munkafüzet osztálymoduljában. A program kódja tehát a következõ lesz: Private Sub Workbook_Open() Application.OnKey “^{END}”, “EndCella” End Sub
Az OnKey mûködését az Excel ’97 programleírásából vagy a súgóból kerestük ki és a szintaktikának megfelelõen írtuk le.
Ugrás a utolsó cellára Ezt az eljárást egy egyedileg létrehozott modulba készítsük el önálló eljárásként. Az eljárás megvalósításához keressük ki a felhasznált tartomány – UsedRange – a Row, Column, Rows.Count és a Columns.Count tuljadonságok használati útmutatását. Ezután írjuk le az algoritmusban és a Jackson ábrán megfogalmazott lépéseket. Íme a program: Sub EndCella() Dim Sor As Integer Dim Oszlop As Integer With ActiveSheet.UsedRange Sor = .Row + .Rows.Count - 1 Oszlop = .Column + .Columns.Count - 1 End With Cells(Sor, Oszlop).Select End Sub
4
E:\Dokumentumok\Excel makro\Ventura\Feladatok\Service\Service.vp 1999.januÆr.27. 13:22:10
Color profile: Generic CMYK printer profile Composite Default screen
A PROGRAM MEGVALÓSÍTÁSA
A munkafüzet bezárása elõtt Ismét az OnKey mûködését használjuk fel, mégpedig a ThisWorkbook objektum osztálymoduljának BeforeClose eseményvezérelt eljárásában. Ez az eljárás akkor hajtja végre a bele írt utasításokat, mielõtt lezárnánk a munkafüzetet. Private Sub Workbook_BeforeClose(Cancel As Boolean) If Not Cancel Then Application.OnKey “^{END}” End If End Sub
Az utasítás visszaállítja a CRTL+END billentyû-kombináció eredeti mûködését.
A program megvalósítása Töltsük be az Excel ‘97-et. A betöltés után a program automatikusan megnyit egy új üres munkafüzetet. Mivel ezt a projektet beépülõ makróként szeretnénk elmenteni, válasszuk ki a Fájl [File] Ø Adatlap [Properties] utasítását és a megjelenõ panel Adatlap lapján töltsük ki a Cím és a Megjegyzés rovatokat. A cím a beépítéskor felkínált szöveg lesz, a Magyarázat pedig a beépülõ rövid leírása. A felesleges munkalapokat távolítsuk el, majd mentsük el munkafüzetet egyenlõre xls formában. Kapcsoljunk át a VBE programba, és írjuk meg az eljárásokat. Most a legalacsonyabb programszinttõl induljunk el, tehát az EndCella eljárást valósítsuk meg. Szúrjunk be a projektbe egy új modult. Ezt nevezzük el Main névvel. Ezután írjuk bele az új modulba a megtervezett eljárást. Ismét mentsük el a munkafüzetet. Most következhet az eseményvezérelt eljárás megvalósítása. Kattintsunk a projekt ablak ThisWorkbook elemére kettõt. Keressük meg a Workbook objektum Open() eljárását és írjuk bele a megfelelõ utasítást. Ezután ugyanebben a modulban keressük meg a BeforeClose eljárást is és abba is írjuk be a megfelelõ utasításokat. Az eljárások elkészítése után mentsük el a munkafüzetet. A munkafüzet lezárása és ismételt megnyitása után ki is próbálhatjuk mûködését. Igaz, hogy a megjegyzések beírása a program dokumentálásához tartozik, de helyesen járunk el, ha már most ellátjuk megjegyzésekkel a programot.
5
E:\Dokumentumok\Excel makro\Ventura\Feladatok\Service\Service.vp 1999.januÆr.27. 13:22:10
Color profile: Generic CMYK printer profile Composite Default screen
AZ UTOLSÓ HASZNÁLT CELLA KIJELÖLÉSE
A dokumentálás a teljes projekthez tartozik, tehát nem most fogjuk elkészíteni, hanem akkor, amikor a projekt mindhárom részletét elkészítettük. Ennek megfelelõen most folytassuk a munkát a Normál oszlopszélesség beállítását elvégzõ program megtervezésével.
6
E:\Dokumentumok\Excel makro\Ventura\Feladatok\Service\Service.vp 1999.januÆr.27. 13:22:10
Color profile: Generic CMYK printer profile Composite Default screen
Az üres munkalapok törlése
Egészítsük ki a munkalap füleken megjelenõ helyi menüt
egy új utasítással. Ennek a feladata az lesz, hogy az aktuális munkafüzetbõl eltávolítsa azokat a munkalapokat, amelyek egyik cellájába sem írtunk adatot. Ennek a feladatnak a megvalósítására ismét a Used- Range tulajdonságot használjuk fel.
A program algoritmusa Munkafüzet betöltésekor A projektet tartalmazó munkafüzet betöltése során gondoskodjunk arról, hogy a munkalapok helyi menüjében megjelenjen az új menüpont, a megfelelõ szöveggel, gombrajzolattal és a szükséges eljárás hozzárendelésével.
Az üres ûrlapok törlése Az utasítás végrehajtása során lépkedjünk végig az aktuális munkafüzet minden munkalapján. Vizsgáljuk meg, hogy akár egy cellájában is van-e valamilyen adat. Ha nincs, akkor töröljük a felesleges munkalapot. Ha egy teljesen üres munkafüzeten hajtjuk végre az utasítást, akkor az utolsó munkalap törlését tiltsuk le. Ezt ismét futásidejû hibakezeléssel oldjuk meg, ugyanis az utolsó lap törlését hibaüzenettel jelzi vissza a program. Az egyes munkalapokról úgy dönthetjük el, hogy üresek vagy sem, hogy három feltételt vizsgálunk meg. Ezek a következõk: – A felhasznált terület egy cellából áll? – Ez a cella az A1-es? – Az A1-es cellában nincs adat. Egy munkalapot akkor tekintünk üresnek, ha mind a három feltételnek egyszerre eleget tesz. Ennek megfelelõen mind a három feltételt megvizsgáljuk minden munkalapra, és ha üresnek bizonyulnak, akkor töröljük a kiválasztott munkalapot. A munkalapok
7
E:\Dokumentumok\Excel makro\Ventura\Feladatok\Service\Service.vp 1999.januÆr.27. 13:22:11
Color profile: Generic CMYK printer profile Composite Default screen
AZ ÜRES MUNKALAPOK TÖRLÉSE
törlését jóvá kell hagynunk. Most erre nem lesz szükségünk, ugyanis nem vesztünk adatot akkor, amikor egy üres munkalapot távolítunk el a munkafüzetbõl. Legrosszabb esetben új munkalapot kell majd beszúrnia a felhasználónak. Ezt a programot is úgy oldjuk meg, hogy a projekt betöltésekor automatikusan helyezzen el menüpontot abban a helyi menüben amelyik a munkalapok fülein jelennek meg. Ennek a szövege legyen az „Üres lapok törlése”. Tetszõlegesen állítsuk be a gomb felületén megjelenõ rajzot, és rendeljük hozzá a lapok törlését elvégzõ eljárást.
A munkafüzet bezárása esetén Készítsük el a munkafüzet bezáráshoz tartozó eljárásának teljes kiegészítését. Ebben szerepelni fog az Excel összes módosított jellemzõjének visszaállítása az eredeti állapotba.
A program tervezése (Jackson módszer) A munkafüzet megnyitása Most eljutunk a teljes eljárás tervéig. Ebben már szerepelni fog mind a három program kezdeti beállítása. Az ábra a következõ: Munkafüzet megnyitás
Open esemény T1
T2
T3
T4
m F 1
T5
T6
F1: A munkafüzet megnyitása esemény bekövetkezett T1: A CRTL+END billentyû-kombinációhoz hozzárendeljük az EndCella eljárást. T2: A Normál szélesség végrehajtás megváltoztatása T3: Új menüpont elhelyezése T4: Menüpont szöveg meghatározása T5: Menüpont rajz meghatározása T6: Eljárás hozzárendelése az új menüponthoz
Az üres ûrlapok törlése Mivel a Jckson módszert kifejezetten a struktúrált programozás jegyében fejlesztették ki, a következõ programrészletet folyamatábrán rajzoljuk meg. Ennek legfõbb oka az, hogy a struktúrált programozásban soha nem használunk ugrást, így erre a Jackson módszer nem tartalmaz eszközt. A Visual Basic hibakezeléséhez viszont ez elengedhetetlen az ugrás ábrázolása, mivel a hiba bekövetkezésének az eredménye az, hogy a elugrunk az On Error Goto utasításban megadott címkére. A folyamatábrán szürke színnel jelöljük azokat az elemeket, amelyek nem felelnek meg a struktúrált programozás szabályainak.
8
E:\Dokumentumok\Excel makro\Ventura\Feladatok\Service\Service.vp 1999.januÆr.27. 13:22:12
Color profile: Generic CMYK printer profile Composite Default screen
A PROGRAM TERVEZÉSE (JACKSON MÓDSZER)
Üres lapok törlése Hibakezelés kikapcs
Van még munkalap?
Képernyõ frissítés letiltása Üzenetek letiltása
Nem 1
Igen EgyCella = Egy használt cella? CellaA1 = Az A1-es használt?
1
A1Ures = Az A1-es üres?
Képernyõ frissítés bekapcsolása
EgyCella = Igaz
Nem
Mindhárom feltétel igaz?
Üzenetek bekapcsolása
CellaA1 = Igaz A1Ures = Igaz
Igen
Kilépés az eljárásból
Aktuális lap törlése Hiba címke: Nem
Marad még lap?
Képernyõ frissítés bekapcsolása
Ugrás a Hiba címkére Igen
Üzenetek bekapcsolása Eljárás vége
A munkafüzet bezárása esetén Ennek az eljárásnak is ez lesz a végleges formája. Ebben szerepel mind a három program okozta változás visszaállítása. Füzet bezárása
Bezárás esemény
m F 1
F1: Munkafüzet BeforeClose esménye bekövetkezett. F2: Nem szakítottuk meg a bezárást T1: A CTRL+END visszaállítása T2: A Normál méret menüpont visszaállítása T3: Az Üres lapok törlése menüpont eltávolítása
m F 2 Visszaállítás
T1
T2
T3
9
E:\Dokumentumok\Excel makro\Ventura\Feladatok\Service\Service.vp 1999.januÆr.27. 13:22:14
Color profile: Generic CMYK printer profile Composite Default screen
AZ ÜRES MUNKALAPOK TÖRLÉSE
Összegezzük az elsõ önálló program tervezését és megvalósítását. Mivel nagyon sok objektum áll a rendelkezésünkre, érdemes elvégezni minden program tervezését, hogy felmérjük a lehetõségeinket. Ehhez azokkal az objektumokkal kell megismerkednünk, amelyeket a programban használni fogunk. Ez segít minket abban is, hogy kellõ mélységig bontsuk le a programjainkat. Az ismerkedéshez kisebb próba programokat készíthetünk. A legjobb módszer ilyenkor egy-egy felvételt készíteni, amiben használjuk a kiszemelt objektumot. Ez késõbb a program kódolása során is segítséget jelent majd.
A program kódolása Hasonlóan az elõzõhöz, töltsük be a megkezdett projektet – elmentett munkafüzetet – és egészítsük ki az újabb programrészlettel.
A munkafüzet megnyitása Ezt az eljárást tegyük teljessé, így a kód a következõ lesz: Private Sub Workbook_Open() Set btnTorol = Application.CommandBars(27).Controls. _ Add(msoControlButton, , , 7, True) btnTorol.FaceId = 51 btnTorol.Caption = “Üres lapok törlése” btnTorol.OnAction = “LapTorles” Application.OnKey “^{END}”, “EndCella” End Sub
Az üres lapok törlése Ennek az eljárásnak a kódolásához az alkalmazás objektum néhány tulajdonságát használjuk fel. Ezek közül a következõ kettõre kerül sor: ScreenUpdating és a program üzeneteit letiltó vagy engedélyezõ DisplayAlerts tulajdonságra. Az eljárás kódolásához ismernünk kell a For Each Next ciklusszervezést. És az If elágazás utasítást. Sub LapTorles() On Error GoTo HibaLapTor Dim EgyCella As Boolean Dim A1EsCella As Boolean Dim A1Ures As Boolean
10
E:\Dokumentumok\Excel makro\Ventura\Feladatok\Service\Service.vp 1999.januÆr.27. 13:22:15
Color profile: Generic CMYK printer profile Composite Default screen
A PROGRAM ELKÉSZÍTÉSE
Dim Lap As Object Application.ScreenUpdating = False Application.DisplayAlerts = False For Each Lap In Worksheets EgyCella = Lap.UsedRange.Cells.Count = 1 A1EsCella = Lap.UsedRange = Cells(1) A1Ures = Lap.Cells(1) = “” If EgyCella And A1EsCella And A1Ures Then Lap.Delete End If Next Lap Application.DisplayAlerts = True Application.ScreenUpdating = True Exit Sub HibaLapTor: Application.DisplayAlerts = True Application.ScreenUpdating = True End Sub
A program elkészítése A programot folytassuk a korábban megkezdett projektben. Nyissuk meg és írjuk be a Main modulba a LapTorles eljárást. Egészítsük ki a szükséges utasításokkal a munkafüzet megnyitás és lezárás eseményeit.
Alakítsuk bõvítménnyé Ehhez nem kell mást tennünk, mint a Fájl [File] Mentés másként [Save As] utasítását használni. A fájltípus listapanelben válasszuk ki a Microsoft Excel bõvítmény lehetõséget.
A program dokumentációja A dokumentáció egy részét már elkészítettük tervezés közben. Ezt nevezzük tervdokumentációnak. Ennek része a teljes program kinyomtatása és egy archivált példány a programból. A dokumentáció szerves részét képezik azok a megjegyzések, amelyeket a program sorai közé írtunk. Ez késõbb megkönnyíti a program követését, az egyes változtatások megvalósítását. A dokumentáció másik formája a felhasználót segíti a program használatában. Itt a lehetõ legrészletesebb leírást kell adnunk. Beleértve a program használatbavételétõl kezdve annak a használati
11
E:\Dokumentumok\Excel makro\Ventura\Feladatok\Service\Service.vp 1999.januÆr.27. 13:22:16
Color profile: Generic CMYK printer profile Composite Default screen
AZ ÜRES MUNKALAPOK TÖRLÉSE
útmutatóján keresztül mindaddig, hogy kihez fordulhat a programmal kapcsolatos esetleges észrevételeivel. Tegyük fel, hogy a bõvítményt floppy lemezen adjuk közre.
A Service.xla használata A beépülõ program telepítése 1. A floppy lemezt helyezzük a meghajtóba. 2. A lemezen található Service.xla fájlt magyar Office esetén másoljuk a: C:\Program files\Microsoft Office\Office\Makro Angol változat esetén pedig a; C:\Program files\Microsoft Office\Office\Library Mappába. 3. Töltsük be az Excel ’97 programot. 4. A program betöltése után hajtsuk végre a Eszközök [Tools] Ø Bõvítménykezelõ [AddIns] utasítását. 5. A megjelenõ párbeszédpanelben keressük meg Az Excel kiegészítése nevû bõvítményt. 6. Kapcsoljuk be. 7. Kattintsunk az OK gombra.
A beépített program használata A Service bõvítmény bekapcsolása után a program néhány utasítása másként mûködik. Megváltozik a CTRL+END billentyû-kombináció használatának az eredménye. A bõvítmény nélkül a CTRL+END billentyû-kombináció a munkalapon a valamikor is használt legnagyobb felhasznált tartomány utolsó celláját jelöli ki. A Service segédlet betöltése után a mindenkor aktuális felhasznált terület utolsó cellájára léphetünk. A munkalapok fülén megjelenõ helyi menüben egy új utasítás jelenik meg. Az utasítás szövege Üres lapok törlése. Ennek az utasításnak a végrehajtása azt eredményezi, hogy a munkafüzetben található üres munkalapokat figyelmeztetés nélkül törli a program. Ha a munkafüzet minden munkalapja teljesen üres volt, akkor a munkafüzetben egy munkalap benne marad.
12
E:\Dokumentumok\Excel makro\Ventura\Feladatok\Service\Service.vp 1999.januÆr.27. 13:22:16
Color profile: Generic CMYK printer profile Composite Default screen
A PROGRAM HASZNÁLAT MEGSZÜNTETÉSE
A program használat megszüntetése Válasszuk ki az Eszközök [Tools] Ø Bõvítménykezelõ [AddIns] utasítását. A megjelenõ panelben keressük meg Az Excel kiegészítése jelölõnégyzetet és kapcsoljuk ki, ezután a beépülõ programot törölhetjük a Makró könyvtárból.
13
E:\Dokumentumok\Excel makro\Ventura\Feladatok\Service\Service.vp 1999.januÆr.27. 13:22:16