Excel jellemzése, architektúra modellje Excel architektúra: A modellre a következőképp gondolhatunk: a szerkezet középpontja egy Excel motor. Ez különböző szolgáltatásokat biztosít, tehát gondolhatunk rá, hogy benne megírtak mindenféle hasznos dolgot, és ezt nyújtja nekünk, vagy esetleg segédeszközként is tud funkcionálni más alkalmazásoknak. Nézzük mikből áll ez: munkalap(Worksheet): ezeken tárolódnak adataink cellákba szerveződve. függvények: a munkalapon a feldolgozást előre megírt függvények segítik. grafikonok, rajzelemek: adatok, összefüggések szemléltetésére Excel API : ez arra jó, hogy külső alkalmazás tudja az Excel elemeit programozni. Ez OLE DB provider segítségével történik (tehát C#-ból tudunk Excelbe machinálni, munkalapot kezelni, függvényeket ott végrehajtani stb..) C#-ból tehát hogy programozzuk, kell egy OLE DB provider for Excel és akkor az Excel API elemeit, hívásait használhatjuk C#-ból. VBA program futtató: írhatunk további makrókat az excelhez. Így megoldhatóak olyan problémák, mint esetleg DBMS felé lekérdezések küldése Excelből, e-mail küldése excelből, fájlkezelés (tehát akár írhatunk/olvashatunk fájlból , törülhetünk fájlt a fáljrendszeren stb.) stb.. a motorhoz lehet bővítményeket letölteni, csomagok, Pl. Solver Excel jellemzése: Előnyei: egyszerű, általános, sok funkció van benne Hátrányai: nehezebben, veszélyesebben programozható mint pl. egy DBMS. Gondoljunk bele, ha VBA makró kitörölhet fájlokat a gépről és használhat minden windows api elemet.. => makróvírusok Interpreteres a nyelv a VBA. (azaz ha találkozik egy változó névvel és nem létezett még (nincs deklarálva), akkor a jobb oldali érték alapján előállítja. Ha létezik, de más típusú értéket adunk, akkor egyszerűen csak a típust változtatja.). Erről írtam másik kidolgozásba is, hogy ez miért
drága ->option explicit stb.. Ebből eredően egy jellegzetes hiba:
szum=0 For i=1 To 100 sum=sum +100 Next If szum<>50 Then .. End If
A hiba hogy nem vettük észre hogy összegzéskor elírtuk a változót, de semmi hibajelzést nem kapunk róla, megy minden a maga módján alatta. Excel nem konkurrens elérésű (azaz 100 klienst egyszerre nem nagyon tud kiszolgálni)=>egyfelhasználós rendszerről beszélünk Kisebb adatmennyiség tárolására célszerű használni egyszerűbb kapcsolat rendszer jellemzi (DBMS-be látható, ott kicsit tágabbak a kapcsolat lehetőségek) nem perzisztens szerver VBA egyébként egy dinamikus nyelv: ez azt jelenti hogy egyik sor (utasítás) állítja elő a következő sorra. Azaz a program önmagát határozza meg. Ez ellenőrzés szempontjából viszont nem jó, tehát hátrány ez is.
Excel adatmodell Ha DBMS-eknél nézzük, az adatmodell tartalmaz strukturális részt, műveleti részt és integritási részt. Excelnél első körben megnézzük, milyen tárolási egységekkel dolgozik (mondhatni ezt struktúrának). Fontos, hogy programozási szemszögből (tehát ha VBA megközelítésből nézem) akkor ezek a tárolási egységek is objektumként kezelhetők. A tárolási egységek egyfajta hiearchiát alkotnak, ezt érdemes megnézni és akkor itt megnézzük. A hierachiában a csúcstól kiindulva részletezzük ezeket:
1.) Application objektum: ez maga az Excel. További objektumokat tartalmaz ez az objektum, amelyek közül néhány tárolási egységnek is megfelel: Workbook : ezek voltaképp az xls vagy xlsx fájlok akár. Ez nyílván az alkalmazás objektumhoz tartozik. Ez egy tárolási egység, munkalapok (Worksheet) tárol, amelyek az Excel további tárolási egységei WorksheetFunction: ezek az Excel függvényeket tartalmazzák (Min, Max, CountIf (~darabteli), Count (~darab)), ha VBA-ban ezeket használni szeretnénk, ezen objektumon keresztül tudjuk elérni 2.) Az Application minden objektuma további objektumot tartalmaz Nézzük példaként a Workbook objektumot: Chart: ez a diagram munkalap, VBa-ban így tudnánk rá hivatkozni, Excelben nyílván csak kiválasszuk a munkalapok közül Name: ez a munkafüzet neve, azt adná vissza. Worksheet: munkalapokat tartalmazó objektum. A munkalap további tárolási egység. 3.) Workbook objektumai is további objektumokat tartalmaznak. Nézzük a Worksheet-et: Name: munkalap neve Range: ez további tárolási egység, a munkalap celláinak részhalmazát tartalmazhatja, meg kell neki adnunk, melyeket. Itt érdemes megemlíteni, hogy a tárolási egységek közül a legkisebbeket a Range objektum tartalmazza. A cella egy
egyelemű Range objektumnak felel meg. (tehát a tárolási egységek közül a Range a legkisebb, ennek lehet egy eleme is, ekkor tekintünk rá cella-ként). Meadási módjai egy tartománynak: lehet direkten („A2:C5”), de akár a tartományoknak egyedi név is adható. VBA szemszögből: Range(„A2:C5”) Range(Cells(sor, oszlop), Cells(sor, oszlop)) azaz előző példa: Range(Cells(2,1), Cells(5, 3)) Programozási logikája: VBA nyelvet használhatjuk, amiről másik tételben már szót említettünk. Így nézzük meg itt, hogy az egyes tárolási egységeket hogyan programozhatjuk. Első lépésként, hogy hogyan érhetjük el az egyes tárolási egységeket. Több út van. Először is minden gyűjteményekbe van rendezve, mert ugye több munkalapunk lehet, fent meg csak egy objektumról volt szó, tehát kellene egy tömb, ami ezeket tárolja. Ezek a tömbök: Workbooks : a megnyitott munkafüzeteket tárolja (tehát megnyitott xls fájlok..) Worksheets: Workbook objektum által tárolt Worksheet objektumok (tehát egy adott munkafüzet munkalapjait ezen tömbön keresztül érhetjük el) Sheets: ugyanaz, mint a Workheets Charts:munkafüzet (Workbook) objektum összes diagrammja VBA-ban akkor nézzük mit hogyan kezelhetünk: Munkafüzetet, munkalapokat ellehet nevükkel vagy indexükkel érni. Worksheets(1), Worksheets(„Új munkalap”). Lehet a hiearchia csúcsától kezdeni a hivatkozást: Application.Workbooks(“Book1.xlsx”).Worksheets(1).Range(“A1”).Value És akkor a fent említett hiearchiát bejárjuk. De ez elég hosszú el lehet hagyni bizonyos részeit. Worksheets(1).Range(“A1”).Value
De ha a VBA makrókezelőben pl. az Első munkafüzet részben kódolunk akkor: Range(“A1”).Value Tehát általában a legkisebb tárolási egységet szeretnénk elérni, a cellát és annak értékeit felhasználni. Egy dolgot jegyezzünk meg. Objektum szinten a legkisebb tárolási egység a Range! Olyan objektum, hogy Cell nincs.Tehát habár cellának hívjuk, a a cella excelben nem más, mint egy Range objektum, amely egy elemet tartalmaz.
Érdekességképpen, védelem létezik az Excel-ben is, egy cellát, munkafüzetet stb.. gond nélkül le lehet jelszavazni.
Integritási dolgokat nézve felmerül a kérdés, hogy lehet e olyan dolgokat csinálni, mint pl. DBMS-ben, hogy egy cella értékére mondjuk kikötéseket tenni. VBA-val utánozható. Egy példa : Meg szeretnénk szabni, hogy a B oszlopban szám legyen. Ez cellaformázással elérhető, azonban nem elég erős, mert így is beírhatunk szöveget. Tehát ez elég gyenge. De ha VBA ban írunk egy eseménykezelőt, amely a B oszlop módosításait figyeli, ugyanolyan erős ellenőrzést kaphatunk szinte, mint egy DBMS-ben: Példaként: a második oszlopra olyan „automatikus ellenőrzést” szeretnénk, hogy csak 5 és 15 közötti értékeket írhassunk be és nem számot ne engedjen. Ha nem megengedett dolgot írunk be, akkor írja vissza a régi értéket! Tehát olyasmit akarunk, mint DBMS-ben egy check a mezőkre. A kódunk: Ezt Makróknál mivel a Munka1 nevű munkalapra akarom csak az ellenőrzöt, abba a modulba kell ezt beillesztenem (nyílván lehet más modul is, attól függ
melyik nevű munkalapra kell, vagy esetleg mindegyikre kell-e…)
Dim regiertek As Variant Dim programIrjaBe As Boolean Private Sub Worksheet_Change(ByVal Target As Range) If Target.Column = 2 Then ertek = Target(1, 1).Value If (((ertek < 5 Or ertek > 15)) And Not programIrjaBe) Or Not IsNumeric(ertek) Then MsgBox "Csak 1 es 15 kozott lehet és szám lehet" programIrjaBe = True Target(1, 1) = regiertek End If End If
End Sub Private Sub Worksheet_SelectionChange(ByVal Target As Range) regiertek = Target(1, 1).Value Cells(3, 3).Value = IsNumeric(Target(1, 1).Value) programIrjaBe = False End Sub
Működés: Két eseményt kell felülírni. A régi érték eltárolásáért a Worksheet_SelectionChange esemény lesz a felelős. Hisz mielőtt írnánk egy cellába, tök logikus, hogy kijelöljük (nem foglalkoztunk más esetekkel most). Ha kijelöljük, akkor mindig lementjük a kijelölt cella értékét. Van még egy szerepe az eseménynek: figyeli, hogy ki módosít. A program ha beír a cellába (pl. a VBA kódunk ha visszaírja a régi értéket), az is kivált ilyen eseményt. Ezért meg kell különböztetnünk, ki váltotta ki. Erre azért van szükség, mert ha az oszlopba léteztek korábbi értékek, amik a makrónk megszületése előtt voltak ott, gondot okozhatnak, hisz akkor ha visszaírjuk ugyanazt és nincs a tartományba, ismételten kiváltaná és végtelen ciklus… Kiválthatná a problémát az üres cella, de az le van kezelve IsNumeric-al. A „check”-ért a Worksheet_Change esemény lesz a felelős. Ő figyeli, hogy: az eseményt ki váltja ki (ha program akkor nem kell ellenőrizni, mert feltehetően jót írunk vissza hisz az jó volt), milyen értéket akarunk beírni és ez szám-e. (ha rosszat, akkor a régi-t visszaírjuk).