Az 5,6,7 laborok VBA anyagának összefoglalása Tömbök, olvasás fájlból: 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 Dinamikus indexhatárú tömbök (Betükeresési feladat) Function, paraméteres Sub: Név, formális (bemenő/kimenő) paraméterek, (típus, érték) Hívás, aktuális paraméterek Program elágaztatása Select Case utasítással Egy Select Case utasítás átírása If-es utasításra 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
Function és paraméteres Sub Kandúrok és cicalányok napi egérfogyasztása testsúlyuk szerint…(Function) 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 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
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
Tömbök fix indexhatárral, lokális és globális változók Öt vektor mindegyikét szeretnénk megszorozni egy adott vektorral… Ha csak lokális változókat használunk: 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 Function skal(sor%, x#(), y#(), n%) As Double Dim sum#, i% sum = 0 For i = 1 To n sum = sum + x(sor, i) * y(i) Next i skal = sum End Function Formális paraméterek A „megfelelő” tömböket föl kell venni a paraméterek listájára Sub sokvektor() Dim a#(5, 3), b#(3), c#(5), k%, j% Open "adat.txt" For Input As #1 ‘ Itt beolvassuk a és b elemeit Close #1 For j = 1 To 5 c(j) = skal(j, a, b, 3) Cells(j, 7) = c(j) Next j End Sub Aktuális paraméterek A kiiratások
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 skal(sor%, n%) As Double Dim sum#, i% 'A skal Function lokális változói sum = 0 For i = 1 To n : sum = sum + a(sor, i) * b(i) : Next i skal = sum End Function Sub sokvektor() Dim c#(5), k%, j%, cim$, ures 'A főprogi lokális változói Open "adat.txt" For Input As #1 Input #1, cím : 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 Input #1, a(j, k) : Cells(j, k) = a(j, k) Next j Close #1 c(j) = skal(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 az input-tömbök deklarációjánál, a tömböket 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 Beolvasás fájlból A kiiratások
Dinamikus tömb, fájlnév megadása elérési útvonallal Írjon VBA programot, amely először a L6_Szoveg.txt fájlban adott szöveget beolvassa egy String típusú változóba, és a Len standard Function aktivizálásával megadja a szöveg karaktereinek számát. Ezután InputBox-szal beolvas egy vizsgálni kívánt karaktert, majd a Mid Function hívásával megkeresi, hogy a szövegben hányszor és hol fordul elő a vizsgálni kívánt karakter. A kapott előfordulási helyeket egy Integer típusú, szöveg-karakterszám méretű dinamikus tömbben tárolja, majd az eredeti szöveget és az eredményeket az alábbi táblázat szerint írja ki: Sub BetuKeres() Dim szoveg$, betu$, n%, j%, k%, fnev$, HolVan%() fnev = Application.GetOpenFilename Open fnev For Input As #1 Input #1, szoveg Close #1 Cells(1, 1) = szoveg n = Len(szoveg) betu = InputBox("betü?", , "r") Cells(2, 1) = "a keresett jel(=" + betu + ") előfordulási helyei:" k = 0 For j = 1 To n If betu = Mid(szoveg, j, 1) Then k = k + 1: ReDim Preserve HolVan(k) HolVan(k) = j End If Next j For j = 1 To k: Cells(3, j + 1) = HolVan(j): Next j End Sub fájlnév megadása A dinamikus tömb deklarációjánál nem adjuk meg indexhatárát A ReDim utasítással adjuk meg a dinamikus tömb (új) indexhatárát, a Preserve utasítás hatására a tömb korábbi elemei megtartják értéküket
Program elágaztatása Select Case utasítással Sub Elagazasok() Dim k%, m% Cells(1, 1) = "m": Cells(1, 2) = "kifejezés" k = 1 Do k = k + 1 m = InputBox("szám?", "2, 23, 102, 9, -3, 0") Cells(k, 1) = m Select Case m Case 0: Cells(k, 2) = "m=0, vége" Case 1 To 8: Cells(k, 2) = m ^ 3 Case 10 To 50: Cells(k, 2) = m ^ 2 Case 100 To 200: Cells(k, 2) = m + 1 Case Else: Cells(k, 2) = "m nincs benne!" End Select Loop Until m = 0 End Sub A Select Case átírása If Then utasításokra Sub Elagazasok_If() Dim k%, m% Cells(1, 1) = "m": Cells(1, 2) = "kifejezés" k = 1 Do k = k + 1 m = InputBox("szám?", "2, 23, 102, 9, -3, 0") Cells(k, 1) = m If m = 0 Then Cells(k, 2) = "m=0, vége" If m > 0 And m < 9 Then Cells(k, 2) = m ^ 3 If m > 9 And m < 51 Then Cells(k, 2) = m ^ 2 If m > 99 And m < 201 Then Cells(k, 2) = m + 1 If m < 0 Or m = 9 Or (m > 50 And m < 100) Or m > 200 Then Cells(k, 2) = "m nincs benne!" End If Loop Until m = 0 End Sub
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.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 Hivatkozás a munkalap nevére