A 2. géptermi beszámoló VBA anyagának összefoglalása Function, paraméteres Sub: Név, formális (bemenő/kimenő) paraméterek, (típus, érték) Hívás, aktuális paraméterek Olvasás fájlból, tömbök : Fájlnév megadása, Open for Input / Close, Input, EOF Egy- és kétindexes tömbök fix indexhatárral Tömbök formális/aktuális paraméterként és a globális változók Makrók rögzítése, testreszabása: Cellahivatkozások az aktív munkalapon Munkalap neve, hivatkozása Aktív diagram „tulajdonságaiból”: hely, típus, forrásadatok, cím, tengelyek
Macska-egér példa Függvénnyel és Eljárással Function eger(macska$, kg#) As Integer If macska = "kandur" Then eger = CInt(kg * 3.6) Else eger = CInt(kg * 2.4) End If End Function output paraméter Sub eger2 (macska$, kg#, n%) If macska = "kandur" Then n = CInt(kg * 3.6) Else n = CInt(kg * 2.4) End If End Sub Sub tobbvaltozo() Dim suly#, j% suly = 1.5 For j = 3 To 8 Cells(j, 1) = suly Cells(j, 2) = eger("kandur", suly) Cells(j, 3) = eger("cica", suly) suly = suly + 0.3 Next j End Sub Sub tobbvaltozo() Dim suly#, j%, db% suly = 1.5 For j = 3 To 8 Cells(j, 1) = suly Call eger2("kandur", suly, db): Cells(j, 2) =db Call eger2("cica", suly, db): Cells(j, 3) =db suly = suly + 0.3 Next j End Sub
Függvény (Function) használata (feladat) Készítsen programot az itt megadott ábra szerint, egy f(x) függvény [a;b] intervallum fölötti görbéje és az x tengely által határolt terület kiszámítására. A területszámításhoz az [a;b] szakaszt ossza n egyenlő részre, és az így kapott h=(b-a)/n magasságú derékszögű trapézok területének összegével közelítse a görbe alatti területet. (Az ábra n=3 részre való osztást mutat.) a b a+h a+2h f(x) x y A k-adik trapéz területét az x=a+k*h értékadás után az alább látható f(x) Function hívásával, a t=h*(f(x-h)+f(x))/2 utasítással számítsa. Function f(x#) As Double If x < 2 Then f = 5 / (1 + x ^ 2) Else f = x ^ 2 - 3 End If End Function A programok által kiírt eredményeket a=1, b=3 és n=10 adatokkal a jobboldali táblázat mutatja.
Függvény (Function) használata (megoldás) Function f(x#) As Double If x < 2 Then f = 5 / (1 + x ^ 2) Else f = x ^ 2 - 3 End If End Function A függvény neve: f formális paramétere: x A függvénynek típusa van, itt: “As Double” Nevének értéket kell adni Sub Trapez () Dim a#, b#, n%, h#, x#, t#, Sum#, k% a = 1: b = 3: n=10: h = (b - a) / n Cells(1, 1) = "x": Cells(1, 2) = "trapéz" Cells(1, 3) = "összeg" x = a: Sum=0 For k = 1 To n x = x + h t = h * (f(x - h) + f(x)) / 2 Sum = Sum + t Cells(k+1, 1) = x Cells(k+1, 2) = t: Cells(k+1, 3) = Sum Next k End Sub Függvényhívások az x-h és x aktuális paraméter-értékekkel
Eljárás (paraméteres Sub) használata (feladat) A balra látható BorBiral.txt fájl a Tulajdonságok szöveg után a bor-tulajdonságok számát (nT) és nevét, a Bírálók szöveg után a bírálók számát (nB), majd két borfajta nevét és az egyes borfajtákhoz tartozó – soronként egy-egy tulajdonságra vonatkozó – bírálati értékeket tartalmazza. Az alábbi feladatokat úgy oldja meg, hogy a program olyan (a BorBiral.txt fájllal azonos szerkezetű) input fájl esetén is helyes eredményt adjon, ahol a tulajdonságok és a bírálók száma más, de nT<= 10 és nB<=10. Készítsen Borok nevű VBA programot a fájl adatainak beolvasására. A program számítsa ki a beolvasott bírálati értékeknek az egyes tulajdonságokra vonatkozó átlagait, és irassa ki az adatokat és átlagokat a jobb oldali táblázatnak megfelelő formában. A tulajdonságok nevét egy String típusú, Tul nevű (a modul lapra vonatkozóan) globális, 10 elemű tömbbe olvastassa. Ugyancsak (a modul lapra vonatkozóan) globális változók legyenek nT és nB. A feladat megoldásában használt összes változót deklarálja. Az egyes borfajták nevének és bírálati értékeinek beolvasására és kiiratására valamint az átlagok kiszámítására és kiiratására készítsen MintaOlvas nevű, paraméteres Sub-ot. A MintaOlvas eljárás egyetlen formális paramétere az Integer típusú kezd legyen, a paraméter aktuális értéke azon sor számát adja meg, amelybe az adott borfajta nevének kiiratása kerül. Hívja meg a Borok program a MintaOlvas Sub-ot kétszer úgy, hogy az egyes hívások eredményül a jobboldali táblázatnak a Bikavér fajtára vonatkozó (a 2-ik sornál kezdődő) ill. a Medoc fajtára vonatkozó (az nT+3-ik sornál kezdődő) kiiratásokat adják.
Eljárás (paraméteres Sub) használata (megoldás) Option Explicit Dim Tul$(10), nT%, nB%, j% Globális változók A Sub neve: MintaOlvas Formális paramétere: kezd Lokális változók Sub Borok() Dim rizsa$, fnev$ fnev = Application.GetOpenFilename Open fnev For Input As #1 Input #1, rizsa, nT For j = 1 To nT: Input #1, Tul(j): Next j Input #1, rizsa, nB Cells(1, 1) = "2 borminta bírálata" Call MintaOlvas(2) Call MintaOlvas(3 + nT) Close #1 End Sub Sub MintaOlvas(kezd%) Dim Bnev$, Bir%, Sum#, k% , s% Input #1, Bnev: Cells(kezd, 1) = Bnev Cells(kezd, 2 + nB) = "Átlag" For j = 1 To nT s=kezd+j: Sum = 0 For k = 1 To nB Input #1, Bir: Cells(s, k) = Bir Sum = Sum + Bir Next k Cells(s, nB + 1) = Tul(j) Cells(s, nB + 2) = Sum / nB Next j End Sub Lokális változók A Sub hívásai a 2 és 3+nT aktuális paraméter-értékekkel Kiiratások Input adatok
Egyindexes tömbök, fájlból olvasás 3 Első: 1, -2, 2 Második: 3, 0, 4 A feladat a KetVektor.txt fájl adatainak (2 db 3 dimenziós vektornak) a beolvastatása, majd a vektorok skalárszorzatának kiszámítása és kiiratása az alábbiak szerint: Tömbök „dimenzionálása” Sub Vektorok() Dim a#(3), b#(3), cim$(2), Skal#, n%, k% Open "KetVektor.txt" For Input As #1 Input #1, n, cim(1) Cells(1, 1) = cim(1): Skal = 0 For k = 1 To n Input #1, a(k): Cells(1, k + 1) = a(k) Next k Input #1, cim(2): Cells(2, 1) = cim(2) Input #1, b(k): Cells(2, k + 1) = b(k) Skal = Skal + a(k) * b(k) Close #1 Cells(4, 1) = "skalárszorzat=": Cells(4, 2) = Skal End Sub Fájl megnyitása Adatok beolvasása fájlból A fájlnevet célszerű az elérési útvonallal együtt megadni! Fájl bezárása
A fájlnevet célszerű az elérési útvonallal együtt megadni! 3 Első: 1, -2, 2 Második: 3, 0, 4 Fájlból olvasás - 2 A feladat a KetVektor.txt fájl adatainak (2 db 3 dimenziós vektornak) a beolvastatása, majd a vektorok skalárszorzatának kiszámítása és kiiratása az alábbiak szerint: Sub Vektorok() Dim a#(3), b#(3), cim$(2), Skal#, n%, k%, fnev$ fnev = Application.GetOpenFilename Open fnev For Input As #1 Input #1, n, cim(1) Cells(1, 1) = cim(1): Skal = 0 For k = 1 To n Input #1, a(k): Cells(1, k + 1) = a(k) Next k Input #1, cim(2): Cells(2, 1) = cim(2) Input #1, b(k): Cells(2, k + 1) = b(k) Skal = Skal + a(k) * b(k) Close #1 Cells(4, 1) = "skalárszorzat=": Cells(4, 2) = Skal End Sub A fájlnevet célszerű az elérési útvonallal együtt megadni!
Tömbök fix indexhatárral, lokális és globális változók Option Explicit Dim a#(5, 3), b#(3) 'A modul globális változói Function skalar(sor%, n%) As Double Dim sum#, i% 'A skalar Function lokális változói sum = 0 For i = 1 To n : sum = sum + a(sor, i) * b(i) : Next i skalar = sum End Function Sub sokVektor() Dim c#(5), k%, j%, cim$, ures 'A főprogram lokális változói Open "adat.txt" For Input As #1 Input #1, cim : Cells(6, 1) = cim Input #1, b(1) , b(2) , b(3) For k = 1 To 3 : Cells(k + 1, 5) = b(k) : Next k Input #1, ures 'Az adatfájl üres sorának kezelése For j = 1 To 5 For k = 1 To 3 Input #1, a(j, k) : Cells(j, k) = a(j, k) Next k Next j Close #1 c(j) = skalar(j, 3) : Cells(j, 7) = c(j) Cells(3, 4) = "*": Cells(3, 6) = "=": Cells(6, 1) = cim End Sub Ha globális változókat használunk (pl. itt az input-tömbök deklarációjánál), ezeket a változókat a modul-lap bármely (al)programjában használhatjuk. skalárszorzatok 1,0,1 1,3,2 -2,0,6 1,1,1 0,0,5 -3,1,4 Az adat.txt fájl A kiiratások
Hivatkozás a munkalap nevére Makrók rögzítése, testreszabása Cellahivatkozások az aktív munkalapon: C3=C2+(A3-A2)*(B3+B2)/2 Range("C3").Select ActiveCell.FormulaR1C1 = "=R[-1]C+(RC[-2]-R[-1]C[-2])*(RC[-1]+R[-1]C[-1])/2" Munkalap neve: lapnev = ActiveSheet.Name Aktív diagram „tulajdonságaiból”: példák: hely, típus, forrásadatok, cím, tengelyek ActiveSheet.Shapes.AddChart2(240, xlXYScatterSmooth).Select ActiveSheet.Shapes.AddChart.Select ActiveChart.ChartType = xlXYScatterSmooth ActiveChart.SetSourceData Source:=Range(lapnev+"!$A$1:$B$52") ActiveChart.ChartTitle.Text = "Kiss Pál " ActiveChart.Axes(xlValue).MinimumScale = 0 VBA 2013 két utasítást „összevont” Hivatkozás a munkalap nevére