Info-books
BI4a
Inform 5-6
Toegepaste Informatica Boekhouden-informatica Informaticabeheer
Deel 4a: Programmeren in VBA DAO-objecten (Access 2000 - 2002) J. Gils – E. Goossens
Hoofdstuk 8
8.1
Functies ontwerpen
Probleemstelling Voor heel wat probleempjes bestaat de oplossing uit een enkelvoudig resultaat, bijvoorbeeld het gemiddelde berekenen van een aantal getallen. Daarom is het ha ndig dat er procedures bestaan die één waarde als resultaat terugsturen. Dergelijke procedures heten functies of functieprocedures. Sommige zijn ingebouwd maar je kunt er ook zelf schrijven.
8.2
Wat zijn functies? Functieprocedures (meestal ook gewoon functies genoemd) geven een waarde als resultaat, procedures doen dat niet. Visual Basic bevat veel ingebouwde functies. De functie NOW () geeft bijvoorbeeld de huidige datum en tijd als resultaat. Afgezien van deze ingebouwde functies, kun je ook je eigen, aangepaste functies maken. Deze functies kunnen ofwel in één bepaalde module (private) of in de hele database (public) gekend zijn. Omdat functies waarden als resultaat geven, kun je ze ook in expressies gebruiken. datDag = strGetal strGetal intGetal
Now() = Str(intGetal) = Str(Now()) = Val(strGetal)
Functies worden meestal opgeroepen met argumenten. Een argument geeft aanvullende informatie door aan de functie of aan de procedure. Als je een functie declareert moet je ook argumenten declareren als je aanvullende informatie aan de functie wilt doorgeven als je ze oproept. Wanneer je een functie met argumenten oproept, moet je ook de argumenten opgeven die je aan de functie wilt doorgeven. Syntaxis [Public | Private] [Static] Function Naam [(argumenten)] [As type] [instructies] ..[Naam = expressie] ..[Exit Function] ß te mijden End Function
78
Programmeren in VBA
J. Gils – E. Goossens
Voorbeeld: Function Groepjes(strTekst As String, bytAantal as byte) As String Dim bytLengte As Byte Dim intTeller As Integer Dim strHulp As String, strResultaat As String ‘Hier gebeurt de verwerking: de cijfers van het getal dat in strTekst ‘zit worden gesplitst in groepjes van bytAantal cijfers, gescheiden ‘door spaties. ‘Het resultaat wordt in strResultaat bewaard. Groepjes = strResultaat End Function
Deze functie heet Groepjes(). Ze wordt als volgt vanuit een andere procedure opgeroepen: strUitkomst= “12345” [txtUitkomst] = Groepjes(strUitkomst,3)
De waarde van strUitkomst wordt doorgegeven aan de variabele strTekst die in de kop van de functie gedeclareerd is en de waarde 3 wordt doorgegeven aan de variabele bytAantal. De functie zelf is gedeclareerd met het type String. In de functie gebeurt een hele verwerking. Het resultaat van die verwerking kan alleen maar via de functienaam naar de variabele txtUitkomst uit het hoofdprogramma teruggestuurd worden. In feite wordt hier niet de waarde van strResultaat doorgegeven, maar wel het adres waar strResultaat in het geheugen zit. Dit adres wordt doorgegeven aan strTekst. Deze manier van doorgeven heet ‘call by reference’.
8.3
Waarden aan procedures en functies meegeven Het is mogelijk om via een parameterlijst informatie mee te geven bij de aanroep van een procedure of een functie. De parametervariabelen van een procedure staan nooit tussen haakjes, die van een functie altijd! Er zijn 2 mogelijkheden: • Call by reference Niet de inhoud van de variabele wordt doorgegeven, maar wel een verwijzing naar de geheugenplaats waar de variabele zit. Binnen de functie of procedure wordt aan deze verwijzing een nieuwe naam toegekend. Als de inhoud van die nieuwe variabele gewijzigd wordt, dan wordt daardoor ook de inhoud van de oorspronkelijke variabele gewijzigd. Procedure: Declaratie: Sub Test(ByRef intGetal As Integer)à
J. Gils – E. Goossens
Programmeren in VBA
intGetal is een parametervariabele
79
of kortweg: Sub Test (intGetal As Integer) intGetal = intGetal * 2 End Sub
à ByRef hoef je niet te schrijven
Het gegevenstype van de meegegeven expressie moet overeenstemmen met het gegevenstype van de procedure. De procedure oproepen: call Test intWaarde
à het adres waar intWaarde naar wijst wordt doorgegeven of kortweg: Test intWaarde
à call hoef je niet te schrijven
Als in de procedure Test de variabele intGetal van waarde verandert, dan zal ook de waarde van intWaarde in het hoofdprogramma veranderen, zelfs al is intWaarde geen publieke variabele. Dit komt omdat twee variabelen naar dezelfde geheugenplaats wijzen en de waarde van een variabele is niets anders dan de inhoud van die geheugenplaats. Functie: Declaratie: Function Test (intGetal As Integer) as Integer intGetal = intGetal * 2 Test = intGetal End Function
De functie oproepen: intResultaat = Test(intWaarde)
Als in de functie Test de variabele intGetal van waarde verandert, dan zal ook de waarde van intWaarde in het hoofdprogramma veranderen. • Call by value In de procedure of functie wordt een kopie van de variabele gemaakt zodat wijzigingen van de parametervariabele geen effect hebben op de aanroepende procedure. Declaratie: Function Test (ByVal intGetal As Integer) As Integer intGetal = intGetal * 2 Test = intGetal End Function
De functie oproepen: intResultaat = Test(intWaarde)
80
à de waarde van getal wordt doorgegeven
Programmeren in VBA
J. Gils – E. Goossens
De functie zal de variabele intWaarde niet kunnen wijzigen, tenzij intWaarde publiek is en er in de functie duidelijk staat dat: intWaarde = “iets”. Het is mogelijk Call by reference en Call by value te mengen: Sub Test(ByVal intGetal As Integer,ByVal x As Integer,y As Integer) ... End Sub
8.4
Functies kunnen waarden teruggeven Functies bieden de mogelijkheid om informatie aan de aanroepende procedure terug te geven. Hierbij staat de naam van de functie voor een afzonderlijke “terug te geven” waarde. Binnen de functie moet de berekende waarde aan de naam van de functie toegewezen worden. Function Test (intGetal As Integer) As Integer Test = intGetal *2 End Function … intResultaat = Test(5)
Het voordeel t.o.v. een procedure is dat je een functie ook kunt gebruiken in een bewerking: intResultaat=Test(5) * Test(3)
Merk op dat de parametervariabelen bij het oproepen van de functie altijd tussen haakjes staan. Opdrachten 1. Een functie vanuit het venster DIRECT oproepen a. Open een nieuwe module en noem ze BASTEST. b. Kopieeer hierin uit het formulier FRMKLINKERS (pagina 76) de procedure waarbij de klinkers in een woord door sterretjes ve rvangen worden worden. c. Verander de procedure in een functie STERRETJES die je uit het venster Direct als volgt oproept: ? Sterretjes (“Stella Matutina”) à resultaat: St*ll* M*t*t*n*. 2. Schrijf een func tie EVEN die test of een geheel getal even of oneven is. ? Even(13) à resultaat: onwaar.
J. Gils – E. Goossens
Programmeren in VBA
81
Samenvatting procedures en functies
Option Compare Database Option Explicit '[txtGetal] = "123" Private Sub Test_Sub_Ref(ByRef strHulp As String) strHulp = "*" + strHulp + "*" End Sub Private Sub Test_Sub_Val(ByVal strHulp As String) strHulp = "*" + strHulp + "*" End Sub Private Function Test_Function(strHulp As String) As String strHulp = "*" + strHulp + "*" test_function = strHulp End Function Private Sub CmdRef_click()
Private Sub cmdVal_click()
Dim strGetal As String [txtRef] = ""
Dim strGetal As String [txtVal] = ""
Dim strGetal As String [txtFunction] = ""
strGetal = txtGetal Test_Sub_Ref strGetal
strGetal = txtGetal Test_Sub_Val strGetal
[txtRef] = strGetal
[txtVal] = strGetal
strGetal = txtGetal strGetal = Test_Function(strGetal) [txtFunction]=strGetal
End Sub
End Sub
Private Sub cmdFunction_click()
End Sub
Kun je de waarden van txtRef, txtVal en txtFunction verklaren?
82
Programmeren in VBA
J. Gils – E. Goossens
8.5
Cijfers in groepjes groeperen
8.5.1 Probleemstelling Volgens de BIN-normen moeten getallen met een spatie als scheidingsteken voor de duizendtallen afgebeeld worden. Als je hexadecimaal rekent moeten de cijfers in groepjes van twee gegroepeerd zijn en als je binair rekent in groepjes van vier. Natuurlijk is het geen probleem om dit via een gepaste opmaak op te lossen. Maar waarom zou je het gemakkelijk maken als het moeilijk ook kan? Ontwerp een functie GROEPJES () die een willekeurig geheel getal netjes opmaakt zoals je het wenst.
Omdat we deze functie ook nodig hebben in het rekenmachine-programma, moet je er rekening mee houden dat het resultaat vóór de opmaak reeds spaties kan bevatten. 8.5.2 Probleemanalyse Het ingevoerde getal is van het type tekst of String. Je moet er van uitgaan dat in dit getal ook spaties kunnen zitten. De string met de cijfers en eventuele spaties wordt aan de functie Groepjes() doorgegeven. • Verwijder eerst alle spaties die in de string zitten. Neem één na één de karakters en plaats die in een nieuwe string. Als het karakter een spatie is moet er niets gebeuren. Dit kan in een aparte functie Blanks() gebeuren. • Groepeer de cijfers, bijvoorbeeld in groepjes van drie, en voeg spaties toe. Neem de cijfers van achter naar voor en plaats ze in een nieuwe string. Nadat er drie cijfers genomen zijn en voordat het volgende cijfer toegevoegd wordt moet je een spatie toevoegen. De functie Groepjes() zal van het type String zijn. De eerste lijn ziet er als volgt uit: Function GROEPJES (strGetal As String, intAantal As Integer) As String De argumenten: • strGetal: het getal waarin spaties gezet worden; Omdat er ook met binaire en hexadecimale cijfers gewerkt moet worden kun je het getal alleen maar als string doorgeven. • intAantal: hoeveel cijfers moeten gegroepeerd worden? Ze wordt als volgt opgeroepen: [txtResultaat] = Groepjes([txtGetal], Val([txtGroep]))
J. Gils – E. Goossens
Programmeren in VBA
83
De functie Blanks() zal ook van het type String zijn. De eerste lijn ziet er als volgt uit: Function BLANKS(strGetal As String) As String Ze wordt als volgt opgeroepen: strGetal = Blanks(strGetal) 8.5.3 Structogram met variabelenlijst •
Functie Groepjes()
Declaratie strLetter, strGetal, intLengte, strResultaat, intAantal, intTeller strLetter ß “” strGetal ß invoer strResultaat ß “” (= nieuw resultaat) intAantal ß 3 (bijvoorbeeld groepjes van drie) strGetal ß blanks verwijderen intLengte ß lengte van strGetal Voor intTeller = 1 tot intLengte strLetter ß intTeller’ste letter van rechts in strGetal (intTeller <>1) And (intTeller MOD intAantal =1) Ja Nee strResultaat ßspatie + strResultaat strResultaat ß strLetter + strResultaat Volgende intTeller Stuur strResultaat terug •
Functie Blanks()
Declaratie strGetal, strLetter, strResultaat, intLengte, intTeller strGetal ß invoer strLetter ß “” strResultaat ß “” (= nieuw resultaat) intLengte ß lengte van strGetal Voor intTeller = 1 tot intLengte strLetter ß intTeller’ste letter in strGetal strLetter<> spatie Ja strResultaat ßstrResultaat + strLetter Volgende intTeller Stuur strResultaat terug
84
Programmeren in VBA
Nee
J. Gils – E. Goossens
8.5.4 Programmacode van de functie •
Objecten Formulier Besturingselementen
•
•
frmGroepjes txtGetal, txtGroep, txt Resultaat lblGetal, lblGroep, txtResultaat cmdGroepeer
Eigenschappen Naam frmGroepjes
Type Formulier
IUV I/U
txtGetal lblGetal txtGroep lblGroep txtResultaat
Tekstvak Label Tekstvak Label Tekstvak
I
lblResultaat cmdGroepeer
Label Opdrachtknop V
I U
Eigenschap bijschrift … tabvolgorde bijschrift tabvolgorde bijschrift ingeschakeld vergrendeld bijschrift tabvolgorde Bij klikken
Waarde Cijfers groeperen … 0 Getal: 1 Groepjes van: nee ja Resultaat: 2 gebeurt. proced.
Gebeurtenisprocedure en functies
Private Sub cmdGroepeer_Click() [txtResultaat] = Groepjes([txtGetal], Val([txtGroep])) End Sub
Private Function Groepjes(strGetal As String, intAantal As Integer) As String Dim intTeller As Integer Dim strResultaat As String ' eventueel aanwezige spaties verwijderen strGetal = Blanks(strGetal) ' duizendtallen met spaties scheiden strResultaat = "" For intTeller = 1 To Len(strGetal) If (intTeller Mod intAantal = 1) And (intTeller > 1) Then strResultaat = " " + strResultaat End If strResultaat=Mid(strGetal,Len(strGetal)-intTeller+1,1)+strResultaat Next intTeller Groepjes = strResultaat End Function
J. Gils – E. Goossens
Programmeren in VBA
85
Private Function Blanks(strGetal As String) As String Dim strLetter As String, strResultaat As String Dim intTeller As Integer Dim intLengte As Integer strResultaat = "" intLengte = Len(strGetal) For intTeller = 1 To intLengte strLetter = Mid(strGetal, intTeller, 1) If strLetter <> " " Then strResultaat = strResultaat + strLetter End If Next intTeller Blanks = strResultaat End Function
TIP Als je aftelt in een For-lus dan moet de teller van het type Integer zijn: het type Byte kan immers niet negatief worden. 8.5.5 De functiebibliotheek Kopieer de twee functies Groepjes() en Blanks() naar een moduleblad. Noem dit blad basPubliek. Verwijder de term “Private” uit de kop van de twee functies: zo worden deze functies publiek voor de hele database en kunnen ze opgeroepen worden vanuit gelijk welk formulier of rapport. TIP
86
Via het venster DIRECT kun je alleen maar functies en procedures uit een algemene module oproepen!
Programmeren in VBA
J. Gils – E. Goossens
8.6
Talstelsels
8.6.1 Probleemstelling Er wordt een geheel getal kleiner dan 2 miljard ingevoerd. Dit getal wordt decimaal afgebeeld in groepjes van drie cijfers, hexadecimaal in groepjes van twee cijfers, binair in groepjes van vier cijfers. Het karakter dat overeenkomt met de ASCII-waarde van de restdeling van het getal door 256 wordt eveneens getoond.
8.6.2 Probleemanalyse Het is de bedoeling dat je één enkele functie schrijft die zowel een hexadecimale als een binaire waarde kan berekenen. Deze functie wordt opgeroepen met twee parameters: enerzijds het getal dat omgezet moet worden en anderzijds het grondtal. Het resultaat van deze functie zal van het type String zijn omwille van de hexadecimale cijfers en omwille van de zeer lange binaire getallen.
Zolang de gehele uitkomst van de deling door het grondtal nog groter is dan of gelijk is aan dat grondtal moet je blijven delen door het grondtal. De eerste rest die gevonden wordt is het laagste cijfer van het omgezette getal. De laatste uitkomst is het hoogste cijfer van het omgezette getal. In geval het grondtal 16 is, kan de rest ook 10, 11, 12, 13, 14 en 15 zijn. Deze waarden moeten omgezet worden naar A, B, C, D, E en F. Voor deze omzetting schrijf je een aparte functie. J. Gils – E. Goossens
Programmeren in VBA
87
Zolang de rest kleiner is dan 10 is er geen probleem. Is de rest gelijk aan 10, dan krijgt de rest de waarde “A”. De ASCII-waarde van “A” is 65. Als je bij de ASCII-code 55 de waarde van de rest bijtelt heb je automatisch de ASCII-code van de gewenste letter. Via een functie CHR() kun je de ASCII-waarde omzetten naar een karakter. Nadat het getal omgezet is moet nog het juiste scheidingsteken toegevoegd worden. Hiertoe roep je een functie Groepjes() op met als parameters het omgezette getal (als string) en een getal dat aangeeft hoeveel cijfers er gegroepeerd moeten worden. 8.6.3 Structogram met variabelenlijst •
Functie Talstelsel()
Declaratie Talstelsel(lngGetal as Long, intGrondtal as Integer) as String lngRest, strRest, strResultaat lngGetal ß waarde van de invoer in [txtGetal] intGrondtal ß 2 strResultaat ß “” Zolang lngGetal >= intGrondtal lngRest ß lngGetal Mod intGrondtal lngGetal ß (lngGetal – lngRest) / intGrondtal ( of lngGetal ß lngGetal \ intGrondtal) strRest ß HexCijfer(lngRest ) strResultaat ß strRest & strResultaat strRest ß HexCijfer(lngGetal) strResultaat ß strRest & strResultaat Ingeval intGrondtal 2 10 strResultaat = strResultaat = Groepjes(strResultaat,4) Groepjes(strResultaat,3) Talstelsel ß strResultaat •
Functie HexCijfer()
Declaratie HexCijfer(lngGetal as Long) as String strHexCijfer lngGetal ß getal van de oproepende functie Ingeval lngGetal van 0 tot 9 strHexCijferß lngGetal naar String Hexcijfer ß strHexCijfer
88
16 strResultaat = Groepjes(strResultaat,2)
van 10 tot 15 strHexCijfer ß CHR( 55 + lngGetal)
Programmeren in VBA
J. Gils – E. Goossens
8.6.4 Programmacode •
Objecten Formulier Besturingselementen
•
•
frmTalstelsel txtInvoer, txtDec, txtHex, txtAsc, txtBin lblInvoer, lblDec, lblHex, lblAsc, lblBin lblTitel1, lblTitel2
Eigenschappen Naam frmTalstelsel
Type Formulier
IUV I/U
txtInvoer
Tekstvak
I
lblInvoer
Label
txtDec txtHex txtAsc txtBin lblDec lblHex lblAsc lblBin lblTitel1 lblTitel2
Tekstvak
Label
U
Eigenschap Bijschrift … Tabvolgorde Na bijwerken Bijschrift Ingeschakeld Vergrendeld
Bijschrift
Waarde Getallen omzetten … 0 Gebeurtenisprocedure Geef een geheel getal kleiner dan 2 miljard nee ja
txtDec txtHex txtAsc txtBin Invoer: Uitvoer:
Procedures en functies
Private Sub txtInvoer_AfterUpdate() Dim lngInvoer As Long If [txtInvoer] <> "" Then lngInvoer = Val([txtInvoer]) [txtDec] = Talstelsel(lngInvoer, 10) [txtAsc] = Chr(lngInvoer Mod 256) [txtHex] = Talstelsel(lngInvoer, 16) [txtBin] = Talstelsel(lngInvoer, 2) End If [txtInvoer] = "" End Sub
J. Gils – E. Goossens
Programmeren in VBA
89
Private Function Talstelsel(ByVal lngGetal As Long, intGrondtal As Integer) As String Dim lngRest As Long Dim strResultaat As String, strRest As String lngRest = lngGetal strResultaat = "" Do While lngGetal >= intGrondtal lngRest = lngGetal Mod intGrondtal lngGetal = lngGetal \ intGrondtal strResultaat = HexCijfer(Cbyte(lngRest)) + strResultaat Loop strResultaat = HexCijfer(Cbyte(lngGetal)) + strResultaat Select Case intGrondtal Case 2 Talstelsel = Groepjes(strResultaat, 4) Case 10 Talstelsel = Groepjes(strResultaat, 3) Case 16 Talstelsel = Groepjes(strResultaat, 2) End Select End Function
In deze functie wordt gebruik gemaakt van “Call by value. De waarde van lngInvoer mag na de oproep [txtHex]=Talstelsel(lngInvoer,16) niet wijzigen omdat je dezelfde waarde nogmaals nodig hebt bij de oproep [txtBin]=Talstelsel(lngInvoer,2). Als lngInvoer “by reference” zou doorgegeven worden, dan zou het resultaat van [txtBin] fout zijn. Private Function HexCijfer(bytGetal As Byte) As String Dim strHexCijfer As String Select Case bytGetal Case 0 To 9 strHexCijfer = Trim(str(bytGetal)) Case 10 To 15 strHexCijfer = Chr(55 + bytGetal) End Select HexCijfer = strHexCijfer End Function
Voor de grondtallen 2 en 10 is deze functie overbodig. Eventueel kun je via een keuze alleen de getallen die groter dan 9 zijn, als het grondtal 16 is, naar deze functie doorsturen. Omdat in deze functie bytGetal van het type Byte is, moet tijdens de oproep van deze functie een conversie gebeuren van het type Long naar het type Byte: HexCijfer(Cbyte(lngRest)) Breng de functie HexCijfer() en Talstelsel() ook over naar de functiebibliotheek basProcedure en verwijder het woordje “private” uit het declaratiegedeelte.
90
Programmeren in VBA
J. Gils – E. Goossens
8.7
Enkele belangrijke functies
8.7.1 Conversiefuncties Cbool(expressie)
Convert. expressie naar Boolean
Check = CBool(A = B)
Cdate(expressie)
Convert. expressie naar Date
Cdate("10 Mei, 1996")
Ccur(getal)
Convert. getal naar Currency
Ccur(125) à 125 BEF
Cbyte(getal)
Convert. expressie Byte
CByte(125.5678) à 125
Cint(expressie)
Convert. expressie nr Integer
CLng(expressie)
Convert. expressie naar Long
CSng(expressie)
Convert. expressie naar Single
CDbl(expressie)
Convert. expressie nr Double
CStr(expressie)
Convert. expressie naar String
Cvar(expressie)
Convert. expressie naar Variant
CVErr(expressie)
Convert. error-code naar Variant
Format(expressie,,,)
geeft een bep. opmaak aan een expressie
Format(5459.4, "##,##0.00") à "5,459.40".
Hex(getal)
string met hexadecimale voorstelling van het getal
MyHex = Hex(459) à1CB.
Oct(getal)
string met octale waarde van het getal
MyOct = Oct(459) à 713.
CStr(437.324) à "437.324"
8.7.2 Stringfuncties Len(string)
lengte van string
Lcase(string)
string naar kleine letters
LCase(“SINT”) à“sint”
Ucase(string)
string naar hoofdletters
Ucase (“Sint” à “SINT”
Ltrim(string)
linker spaties verwijderen
Rtrim(string)
rechter spaties verwijderen
Trim(string)
begin- en eindspaties weg
Left(string,lengte)
linkse deel van een string
Left(“Sint”,1) à “S”
Right(string,lengte)
rechtse deel van een string
Right(“Sint”,2) à “nt”
Mid(string,start,lengte)
deel uit een string
Mid(“Sint”,2,2) à “in”
J. Gils – E. Goossens
Programmeren in VBA
91
InStr(start,doelstring, zoekstring)
zoekt naar de plaats van een lettercombinatie
InStr(1,”iets”,”t”) à 3
String(aantal,teken)
repeterende string opbouwen
String(5, "*") à "*****".
Asc(string)
geeft de ascii-waarde van de eerste letter van de string
ASC(Appel) à 65
Chr(getal)
geeft het teken dat bij de code CHR(65)à “A” hoort
Str(getal)
getal omzetten naar string
Str(-459.65) à”-459.65”
Val(string)
string omzetten naar getal
val("10 okt”) à 10.
Een aantal functies heeft twee versies: • de ene versie geeft het gegevenstype Variant als resultaat, bijvoorbeeld Mid(); • de andere het gegevenstype String, bijvoorbeeld Mid$(). De Variant-versies krijgen de voorkeur omdat varianten conversies tussen verschillende typen gegevens automatisch afhandelen. In de volgende gevallen is het wel handig om de String-versie te gebruiken: • het programma is erg groot en er worden veel variabelen in gebruikt; • je wilt controleren wanneer gegevens van het ene type worden geconverteerd naar een ander type; • je schrijft gegevens rechtstreeks naar bestanden met directe toegang. De volgende functies geven een variabele van het type String als resultaat wanneer je een dollarteken ($) achter de functienaam plaatst. Deze functies hebben dezelfde syntaxis als de Variant-versies zonder het dollarteken en worden op dezelfde manier gebruikt. Chr$ Dir$ Input$ LeftB$ Right$ Str$ UCase$
ChrB$ Error$ InputB$ Mid$ RightB$ String$
CurDir$ Format$ LCase$ MidB$ RTrim$ Time$
Date$ Hex$ Left$ Oct$ Space$ Trim$
8.7.3 Rekenkundige functies Fix(-8,4)= -8
Het gedeelte voor de komma van een getal.
Int (-8,4)= -9
Het gedeelte voor de komma van een getal.
Rnd()
Rnd geeft een willekeurig getal < 1 als resultaat. Gebruik de volgende formule als je willekeurige integers in een gegeven reeks wilt maken: Int((bovengrens – benedengrens + 1) * Rnd + benedengrens)
Randomize
Om de generator van willekeurige getallen te starten met een begingetal op basis van de systeemtimer.
92
Programmeren in VBA
J. Gils – E. Goossens
Sgn(getal)
Bepaalt of een getal positief (1), nul (0) of negatief (-1) is.
Sqr(getal)
Geeft de vierkantswortel van een getal als resultaat.
Cos (functie) Sin (functie) Tan (functie) Abs(getal)
Geeft de absolute waarde van een getal als resultaat.
Exp (getal)
Het getal e (de basis van natuurlijke logaritmen) verheven tot een bepaalde macht.
Ln/log(getal)
Geeft als resultaat de natuurlijke logaritme van een getal.
Boogtan/Atn(getal) 8.7.4 Datum- en tijdfuncties Date()
systeemdatum
Date() à “29/07/96”
Time()
systeemtijd
Time() à “21:25:17”
Now()
systeemdatum en -tijd
Now() à “29/07/96 21:26:27”
Time(datum)
tijd in uur:minuten:seconden
Time( Now() ) à “15:34:12”
Year(datum)
jaartal uit de datum
Year( Date() ) à 1996
Month(datum)
nummer van de maand
Month( Now() ) à 7
Weekday(datum)
nummer van de weekdag (zondag = 1)
Weekday( Now() ) à 2 (maandag)
Day(datum)
nummer van de dag
Day( Now() ) à 29
Hour(datum)
uur van de dag (0 -23)
Hour(“15:34:12”) à 15
Minute(datum)
minuten van het uur (0 –59)
Second(datum)
seconden (0 - 59)
Timer()
het aantal seconden sinds middernacht
J. Gils – E. Goossens
Programmeren in VBA
Timer() à 77499,65
93
Besluit Functies geven een waarde als resultaat terug: daarom kunnen ze rechtstreeks in expressies gebruikt worden. Procedures geven na oproep geen waarde terug. Tijdens de declaratie van de functie leg je het type vast en bepaal je met welke parameters, en van welk type, de functie opgeroepen wordt. Deze declaratie gebeurt in de eerste lijn van de functie. De variabelen waarmee je de functie oproept moeten van hetzelfde type zijn als de parameters die in het functiehoofd gedeclareerd zijn. Functies kunnen zowel private als public gedeclareerd worden. In het eerste geval zijn ze alleen maar op te roepen binnen de module waarin ze gedeclareerd zijn, in het andere geval zijn ze op te roepen vanuit de hele database. Wil je een bibliotheek van functies aanleggen die bereikbaar is voor de hele database, dan verzamel je die functies in een aparte module, een standaard module, en je verwijdert het woordje ‘private’ uit de declaratie van elke functie. Waarden kunnen aan een functie doorgegeven worden by reference of by value. “Call by Reference” geeft alleen het adres van de variabele door. In dat geval kan de inhoud van de variabele ook binnen de functie gewijzigd worden. “Call by value” kopieert de variabele die wordt doorgegeven naar een nieuwe variabele. In dat geval zal de oorspronkelijke variabele nooit gewijzigd kunnen worden binnen die functie. De parameters waarmee je een functie oproept staan altijd tussen ronde haken. Bij een procedure is dat juist niet het geval.
Wat je moet kennen en kunnen: • • • • • •
zelf functies definiëren, implementeren en gebruiken; uitleggen wat ‘Private’ en ‘Public’ is bij de declaratie van functies; het verschil tussen ‘Call by reference’ en ‘Call by value’ uitleggen; procedures en functies zodanig schrijven dat ze herbruikbaar zijn; gebruikmaken van bestaande procedures en functies en deze eventueel aanpassen; herbruikbare procedures en functies groeperen in bibliotheken.
Opdrachten 3. Schrijf de functie Positie(strWoord As String, strLetter As String) As Byte die als resultaat de plaats aangeeft waar een bepaalde letter de eerste maal in een woord voorkomt. Gebruik deze functie om de postcode van de woonplaats te scheiden. 4. Schrijf de functie Splits(strWoord As String, bytDeel As Byte) As String die van een invoer die uit twee woorden bestaat die gescheiden zijn door een spatie, zoals naam en voornaam, ofwel het eerste (bytDeel=1) ofwel het tweede (bytDeel=2) woord als resultaat geeft. Schrijf een analoge functie SplitsChar() die splitst vanaf een opgegeven karakter.
94
Programmeren in VBA
J. Gils – E. Goossens
5. Schrijf de functie Invoegen(strWoord As String, strExtra As String, bytPositie As Byte) As String die een bepaalde tekenreeks invoegt op een bepaalde plaats in een woord. Gebruik deze functie om een spatie te zetten tussen de postcode en de woonplaats, in de veronderstelling dat de postcode en de woonplaats vast aan mekaar geschreven zijn. 6. Schrijf de functie Rest(lngGetal As Long,lngDeeltal As Long) As Long die de rest van de deling van het getal door de deler weergeeft. Gebruik deze functie in het programma talstelsel van FRM TALSTELSEL. 7. Schrijf de functie Afronden(dblGetal As Double, intHoever As Integer) As Double die een getal tot op intHoever aantal cijfers na de komma afrondt. 8. Ontwerp een formulier FRM KLEUR om de functie RGB() te testen. Via een opdrachtknop kies je een kleur, met de pijlknoppen (cmdOmhoog, cmdOmlaag) kun je de getalwaarde (intRood, intGroen of intBlauw) van die kleur vermeerderen of verminderen. De kleurknoppen zet je in een groepsvak zodat er maar één knop geselecteerd kan zijn. TIPS • IntRood, intGroen en intBlauw moeten globale variabelen zijn. • maak zoveel mogelijk gebruik van procedures.
De achtergrond van het tekstvak txtRood, … toont je alleen maar de kleur van intRood: de getalwaarde van die kleur druk je af in txtRoodWaarde. In een groot tekstvak, txtKleur toon je het resultaat van de drie kleuren samen. Bij het openen van het formulier is er geen kleur geactiveerd en zijn de pijlknoppen verborgen. De functie RGB(intRood,intGroen,intBlauw) geeft als resultaat een Long-waarde met een geheel getal dat een RGB-kleurwaarde aangeeft. intRood intGroen intBlauw
TIP
Een getal in het bereik van 0 tot en met 255 dat de rode component van de kleur aangeeft. Een getal in het bereik van 0 tot en met 255 dat de groene component van de kleur aangeeft Een getal in het bereik van 0 tot en met 255 dat de blauwe component van de kleur aangeeft.
De functie RGB() kan als volgt gebruikt worden: txtKleur.BackColor = RGB(255,255,255) ß Wit txtKleur.BackColor = RGB(255,0,0) ß Rood txtKleur.BackColor = RGB(0,0,0) ß Zwart
J. Gils – E. Goossens
Programmeren in VBA
95