Computervaardigheden Hoofdstuk 4 — Scripting (Let op: dit is enkel voor studenten Biologie.)
2 Inhoud Dit hoofdstuk bekijkt heel kort de basis van scripting. -Opstellen van functies. -Conditionele code. -Iteraties.
3 Wat is scripting ? Scripting is programmeren “in the small” -Automatiseren van kleine, repetitieve taken -Vaak eenmalig gebruik Excel biedt hiervoor VBScript aan -Het is een subset van grote broer Visual Basic -Heeft integratie met Excel
4 De editor Open VisualBasic Editor -Tools > Macro > Visual Basic Editor De code komt hier. Code testen kan (o.a.) hier.
5 Voorbereidend werk Maak Module -(1) rechtsklik op "VBA Project" -Dan: Insert > Module Hernoem Module1 -(2) venster "Properties" -Klik in vak naast "(Name)" -Nieuwe naam: "GlobaleFuncties" 1 2
6 Een eerste Functie In Editor -Schrijf volgende code: -Sla op In Excel -Plaats volgende formule in een cel: "=inc(0)" Public Function inc(x) inc = x + 1 End Function
7 Testen van je code Ga terug naar de Visual Basic Editor In het venster "Immediate”: -Schrijf: "MsgBox(inc(1))" + keyboard: Enter Dit toont een pop-up venstertje met daarin het resultaat van de berekening. -Schrijf: "Debug.print(inc(2))" + keyboard: Enter Dit schrijft het resultaat van de berekening naar het Immediate venster. -Merk op dat je deze functies ook rechtsreeks in je eigen code kan gebruiken.
8 De vorm van elke functie Public Wat hier gedefinieerd wordt is "overal" te gebruiken. Function Wat we aan het maken zijn. name Vrij te kiezen, maar moet wel uniek zijn. parameters Data die meegegeven wordt en gebruikt kan worden binnen de functie. statements De echte code. Eén statement per lijn. End Function Einde van de code voor deze functie. Public Function name(parameters) statements End Function
9 Variabelen en "assignment" Een variabele is een naam die verwijst naar een waarde. naam = ”Bert” leeftijd = 22 Deze twee statements stellen twee variabelen (naam en leeftijd) in, elk met een eigen waarde (resp. de tekst “Bert” en het getal 22). leeftijd = leeftijd + 1 Dit statement neemt de waarde van variabele leeftijd (22), en telt er 1 bij op. Het resultaat (23) wordt daarna toegekend (ge-assigneerd) aan variabele leeftijd. Na afloop van deze statement heeft leeftijd de nieuwe waarde (23).
10 Functie-oproep leeftijd = inc(leeftijd) Dit statement toont een functie-oproep. De functie die opgeroepen wordt is onze “inc” functie. Deze functie vraagt één parameter. We kiezen hiervoor de waarde van variabele leeftijd (23). De functie geeft een nieuwe waarde terug (24), en deze nieuwe waarde wordt ge- assigneerd aan de variabele leeftijd. Na afloop van dit statement is de nieuwe waarde van variabele leeftijd dan ook 24. functienaam(parameter1, parameter2,...) Dit is de algemene vorm van een functie-aanroep. Je gebruikt de naam van de functie gevolgd met de lijst van parameters tussen haakjes. De parameters zelf worden gescheiden met kommas.
11 Functie-waarde inc = x + 1 Hoe maak je duidelijk wat het resultaat moet zijn van een functie die je aan het schrijven bent ? Heel eenvoudig: assigneer de waarde die je wil doorgeven aan de naam van de functie. Bij onze “inc” schreven we dan ook: Eens de “End Function” bereikt wordt, neemt Excel deze waarde om door te geven aan de oproeper van de functie.
12 Output en tekst-manipulatie Debug.Print(leeftijd) Dit statement schrijft de waarde van variabele leeftijd uit (24). Merk op dat ook dit statement een functie-aanroep is. Debug.Print(naam & ” is ” & leeftijd & ” jaar.”) Dit statement concateneert (d.m.v. de & ’ en) de waarde van variabele naam (“Bert”), “ is “, de waarde van variabele leeftijd (24) en “ jaar.”, en schrijft het geheel uit. Je zou dan ook in het immediate venster moeten zien verschijnen: “Bert is 24 jaar.”
13 Commentaar in je code ‘ Dit is commentaar. Volgende regel is dat niet. maand = 1 ‘ Dit is dan weer wel commentaar. Rem En dit ook. Het is vaak nuttig om een woordje uitleg te schrijven bij je code. Dit kan je doen met behulp van zogenaamde commentaar-regels. Een voorbeeld: Alles wat na een enkele quote (‘) of na “Rem” staat, tot het einde van de lijn, wordt door Excel genegeerd. Je kan hier dan ook schrijven wat je wil.
14 Voorwaardelijke code If (zon > 0) Then Debug.Print(”Zonneschijn.”) Else Debug.Print(”Geen zon.”) End If Volgende code doet vast wat je denkt: Dit is een voorbeeld van voorwaardelijke code. Afhankelijk van de waarde van variabele “zon” schrijf je ofwel de ene boodschap uit, ofwel de tweede. In geen geval zullen beide boodschappen verschijnen!
15 Werking van het If-statement expr then-block else-block truefalse expr then-block true false If expr Then then-block Else else-block End If If expr Then then-block End If
16 Voorwaardelijke expressies a = b‘ is gelijk aan ? a <> b‘ is niet gelijk aan ? a < b‘ is kleiner dan ? a > b‘ is groter dan ? a <= b‘ is kleiner dan of gelijk aan ? a >= b‘ is groter dan of gelijk aan ? expr_1 or expr_2‘ Geldt er minstens één ? expr_1 and expr_2‘ Gelden beide ? not expr‘ Geldt dit niet ? Merk hier op dat "=" in VBScript gebruikt wordt zowel voor het testen op gelijkheid als voor assignatie. De context zou duidelijk moeten maken in welk geval je zit. Elke “expr” kan op zich weer een voorwaardelijke expressie zijn. Gebruik waar nodig haakjes om de juiste logica te krijgen.
17 IF-statement variant expr1 block-1 true false expr2 block-2 true false exprn-1 block-n-1 true false... block-n... If expr1 Then block-1 ElseIf expr2 Then block-2 ‘ Enzovoort... ElseIf exprn-1 Then block-n-1 Else block-n End If
18 Voorbeeld: faculteit ‘ Volgende functie berekent de faculteit van een getal. ‘ We nemen aan dat n >= 1. Public Function faculteit(n) If (n = 1) Then faculteit = 1 Else faculteit = n * faculteit(n - 1) End If End Function De implementatie van deze functie steunt op het feit dat n! = n * (n-1)!, en dit voor alle n. Dit “truukje” moet echter op een gegeven moment stoppen, vandaar de controle of n gelijk is aan 1, in welk geval de functiewaarde 1 moet zijn.
19 Oneindige lus faculteit(-1) Dit veroorzaakt een oneindige lus. faculteit(-1) ‘ => -1 * faculteit(-2) ‘ => -1 * -2 * faculteit(-3) ‘ => -1 * -2 * -3 * faculteit(-4) ‘ enz... Wat je dan bij uitvoering kan zien is dat Excel meldt dat er geen “stack space” meer is. Dit komt omdat elke functie-aanroep plaats op “de stack” vraagt. Door de oneindige lus heb je oneindig plaats nodig, wat nog steeds niet kan in onze computers... Hoe je met dergelijk situaties om moet gaan wordt wel duidelijk in de oefeningenlessen. Probeer eens:
20 Alternatieve definitie van faculteit ‘ Volgende functie berekent de faculteit van een getal. ‘ We nemen aan dat n >= 1. Public Function faculteit(n) faculteit = 1 Do While (n <> 1) faculteit = faculteit * n n = n - 1 Loop End Function Deze implementatie maakt gebruik van herhaling (ook “iteratie” genoemd). Hoe iteratie werkt, wordt getoond op de volgende slides.
21 WHILE/UNTIL statement expr block true false block wordt mogelijk 0 x uitgevoerd ! expr block true false Do While expr block Loop Do Until expr block Loop
22 Oneindige lus (2) faculteit(-1) Dit veroorzaakt nog steeds een oneindige lus. faculteit(-1) ‘ => faculteit = -1; n = -2 ‘ => faculteit = -1 * -2; n = -3 ‘ => faculteit = -1 * -2 * -3; n = -4 ‘ enz... Ook hier weer kan Excel je een melding geven van het probleem. In dit geval zie je waarschijnlijk een “overflow” melding. Dit is omdat de waarde van variabele faculteit telkens groter en groter wordt. Er is echter een limiet aan wat de waarde van een getal kan zijn. Gaat de berekende waarde over die limiet dan krijg je “overflow”. Probeer nog eens:
23 FOR-statement (vorm) truefalse naam <= last block naam = first naam = naam + step For naam = first To last Step step block Next naam first, last, step: expressies met als resultaat een geheel getal For naam = first To last block Next naam Hierbij impliciet: step = 1
24 Nog maar eens een faculteit ‘ Volgende functie berekent de faculteit van een getal. ‘ We nemen aan dat n >= 1. Public Function faculteit(n) faculteit = 1 For i = 1 To n faculteit = faculteit * i Next i End Function Ook hier maken we weer gebruik van iteratie. Het verschil met de “Do While” versie is dat we deze keer niet zelf onze “teller” moeten beheren. Merk op dat we deze keer geen oneindige lus krijgen als n = -1. Reden hiervoor is dat tellen van 1 tot -1 meteen stopt.
25 Exit Function ‘ Volgende functie berekent de faculteit van een getal. Public Function faculteit(n) faculteit = 1 If (n < 1) Then Exit Function ‘ => Verlaat de functie met waarde 1. End If For i = 1 To n faculteit = faculteit * i Next i End Function Deze versie controleert de waarde van parameter n, en indien die kleiner dan 1 is stopt de functie meteen (Exit Function).
26 Survival guide Belangrijk -Een eigen functie definiëren. -Die functie kunnen aanroepen vanuit een werkblad. -Een IF-statement gebruiken. Nuttig -Een lus-structuur gebruiken. Loop While Loop Until For
27 Conclusie Scripting -Eigen functies opstellen en gebruiken vanuit Excel. -Conditionele code (If Then Else). -Iteratieve code. (Do While, Do Until, For).