12 Excel aanpassen - Pearson Education
12 Excel aanpassen - Pearson Education
12 Excel aanpassen - Pearson Education
You also want an ePaper? Increase the reach of your titles
YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.
<strong>12</strong><br />
EXCEL AANPASSEN<br />
De belangrijkste punten van hoofdstuk <strong>12</strong><br />
Het <strong>aanpassen</strong> en uitbreiden van <strong>Excel</strong>;<br />
Een menu met keuzen daarin te verwijderen of juist toe te voegen;<br />
Deze menukeuzen te koppelen aan een macro;<br />
Zelf een functie ontwerpen;<br />
Een invoegtoepassing maken van een eigen functie.
Wat leert u in dit hoofdstuk?<br />
Een eigen menu aan de <strong>Excel</strong>-menubalk toevoegen.<br />
Een functie die we ook uit <strong>Excel</strong> kennen in een macro toepassen.<br />
Een eigen functie in de functiewizard.
MACRO’S EN VBA IN EXCEL de basis<br />
298<br />
<strong>12</strong>.1 Met menu’s werken<br />
Misschien hebt u het zich nog nooit zo direct gerealiseerd, maar de menubalk van <strong>Excel</strong><br />
met standaardopties is eigenlijk helemaal niet zo standaard. U kunt de menuopties<br />
naar eigen inzicht schikken, verwijderen of er zelfs eigen menu’s aan toevoegen. Dit<br />
kan via een van de dialoogvensters van <strong>Excel</strong>, maar ook direct vanuit een macro.<br />
OORSPRONKELIJKE MENU’S TERUGHALEN<br />
Er is een eenvoudige methode om de oorspronkelijke instelling van <strong>Excel</strong> terug te halen. Hebt<br />
u een stand-alone machine of een pc die op een netwerk van gelijkwaardige machines is<br />
aangesloten (peer-to-peer) dan kunt u het in ieder geval zelf. Is uw pc in een bedrijfsnetwerk<br />
aangesloten, dan kan het noodzakelijk zijn dat u de hulp van een systeembeheerder inroept.<br />
Sommige grote bedrijven of instellingen hebben <strong>Excel</strong> namelijk aangepast aan de taken die u<br />
er mee moet uitvoeren. Het kán dus voorkomen dat bepaalde menu-onderdelen niet geladen<br />
worden. In dat geval zal het u ook onmogelijk gemaakt worden zelf wijzigingen aan te brengen.<br />
De laatstgebruikte indeling van de menu’s en de werkbalken legt <strong>Excel</strong> telkens weer vast in<br />
een bestand op schijf als u het programma langs de normale weg afsluit – dus niet als de stekker<br />
er gewoon uit getrokken wordt of als de machine vastloopt. Per gebruiker wordt er een<br />
bestandje op schijf vastgelegd met deze naam: <strong>Excel</strong>11.xlb. Doorgaans vindt u dit bestand in<br />
dit pad, waarbij u username moet vervangen door uw eigen inlognaam:<br />
C:\Documents and Settings\username\Application Data\Microsoft\<strong>Excel</strong>\<br />
Als u <strong>Excel</strong> afgesloten hebt en u verwijdert vervolgens dit bestand met de Windows Verkenner,<br />
zal <strong>Excel</strong> de volgende keer starten zoals het programma dat deed toen het oorspronkelijk<br />
op de pc geïnstalleerd werd. Het bestandje met de instellingen zal op deze manier ook weer<br />
opnieuw worden aangemaakt.<br />
Presenteert <strong>Excel</strong> zich een dag later echter weer anders, zonder dat u er iets aan gedaan<br />
hebt, dan hebt u te maken met een of ander automatisch recovery systeem. In dat geval raadpleegt<br />
u de systeembeheerder.<br />
<strong>12</strong>.1.1 Menu’s toevoegen<br />
Als u nog nooit iets met de uitbreiding van menu’s gedaan hebt, is het verstandig deze<br />
procedure eerst even te oefenen voordat u gaat experimenteren met het wijzigen van<br />
<strong>Excel</strong>’s menustructuur via macro’s. De stappen zijn als volgt:<br />
1 In het dialoogvenster Aanpassen sleept u vanaf de lijst op het tabblad Opdrachten<br />
een Nieuw menu naar de menubalk van <strong>Excel</strong>;
<strong>12</strong> <strong>Excel</strong> <strong>aanpassen</strong><br />
2 Vervolgens sleept u net zoveel nieuwe menu’s in dit zojuist toegevoegde menu als u<br />
nodig denkt te hebben;<br />
3 Daarna wijzigt u de opschriften van de menu’s;<br />
4 Tot slot koppelt u de menukeuzen aan macro’s die u vooraf geschreven en getest<br />
hebt.<br />
Het is mogelijk een menu op elke willekeurige plek op de bestaande menubalk tussen<br />
te voegen. We noemen dit met name, omdat u zich zo realiseert dat de volgorde van de<br />
menu’s in principe niet vast staat! Zolang het dialoogvenster Aanpassen op het scherm<br />
staat, kunt u namelijk ook de bestaande, ingebouwde <strong>Excel</strong>-menu’s verslepen en zelfs<br />
verwijderen. Probeer het maar eens met het menu Bestand – een leuke keuze om mee<br />
te beginnen!<br />
Oefening <strong>12</strong>.1 Menu’s <strong>aanpassen</strong> en macro toekennen aan een<br />
menukeuze<br />
1 Kies in het menu Beeld, Werkbalken de laatste keuze van het uitvouwmenu: Aanpassen…;<br />
2 Selecteer het tabblad Opdrachten;<br />
3 Scroll onder Categoriën helemaal omlaag tot u Nieuw menu ziet. Selecteer dit;<br />
4 Sleep vanuit het vak Opdrachten de keuze Nieuw menu naar de menubalk. U ziet dit in afbeelding<br />
<strong>12</strong>.1;<br />
5 Herhaal deze procedure, maar positioneer het volgende menu in het kleine vakje onder de tekst<br />
Nieuw menu op de menubalk. Zo creëert u een keuze ín een menu. Herhaal dit een paar maal.<br />
Merk overigens op dat enkele van de oorspronkelijke <strong>Excel</strong>-menu’s in afbeelding <strong>12</strong>.2 op een<br />
andere plek liggen. U kunt ze gewoon verslepen, in een ander menu leggen of zelfs naar het<br />
dialoogvenster slepen waardoor ze van de menubalk verdwijnen!<br />
6 Het instellen van een menu op de menubalk of een keuze ín een menu is gelijk. Klik met de rechter<br />
muisknop op het menu of de keuze en geef achter Naam: de menunaam op. U kunt een ampersand<br />
( & ) vóór de letter plaatsen die onderstreept moet worden. Met de toetsencombinatie<br />
Alt + deze letter kan het menu dan geopend worden,dit wordt de sneltoets genoemd. De letter<br />
moet uniek zijn en mag niet nog eens op de menubalk voorkomen; zie afbeelding <strong>12</strong>.3.<br />
7 In hetzelfde snelmenu kunt u klikken op Macro toewijzen…waarna in een lijst een macro geselecteerd<br />
kan worden. Het is een goede gewoonte om macro’s aan menukeuzen te verbinden die<br />
in de persoonlijke macrowerkmap zijn ondergebracht. Deze wordt immers steeds automatisch<br />
geladen! Raadpleeg hoofdstuk 1 voor het werken met de persoonlijke macrowerkmap.<br />
299
MACRO’S EN VBA IN EXCEL de basis<br />
300<br />
Afbeelding <strong>12</strong>.1<br />
Nieuw menu aan de menubalk toevoegen.<br />
Afbeelding <strong>12</strong>.2<br />
Menukeuze aan het menu toevoegen.
Afbeelding <strong>12</strong>.3<br />
Menunaam opgeven.<br />
Afbeelding <strong>12</strong>.4<br />
Macro toekennen.<br />
<strong>12</strong> <strong>Excel</strong> <strong>aanpassen</strong><br />
301
MACRO’S EN VBA IN EXCEL de basis<br />
302<br />
Op soortgelijke wijze kunt u knoppen aan de menubalk of een van de werkbalken toevoegen.<br />
In afbeelding <strong>12</strong>.5 ziet u dat knoppen uit de categorie Macro’s gehaald kunnen<br />
worden. In feite is er maar een knop beschikbaar, maar deze kunt u weer via een<br />
snelmenu helemaal instellen zoals u dat wenst. Ook aan een knop kan op vergelijkbare<br />
manier een macro toegewezen worden.<br />
Afbeelding <strong>12</strong>.5<br />
Knop toevoegen.<br />
<strong>12</strong>.1.2 Menu’s beheren via een macro<br />
VBA herkent de menubalk in <strong>Excel</strong> als CommandBars(1) van het Application-object.<br />
Dat is een beetje lastig omdat hier niet met een naam, maar met een volgnummer<br />
(index) gewerkt wordt. Het is wel prettig dat de eerste CommandBar gewoon de <strong>Excel</strong>menubalk<br />
is.<br />
Het CommandBar-object bezit een Controls-verzameling. Deze bevat in eerste instantie<br />
alle menu’s van <strong>Excel</strong>. Het merkwaardige feit doet zich voor dat volgnummer één<br />
het menu Bestand is en volgnummer tien het menu Help. Nummer acht lijkt niet bij<br />
een menu te horen. Voert u de volgende macro’s maar eens stap voor stap uit en wie<br />
het dan weet mag het zeggen…<br />
Oefening <strong>12</strong>.1 Het menumysterie<br />
C Sub WisMenus()<br />
Dim intT As Integer<br />
For intT = 1 To 10
Application.CommandBars(1) _<br />
.Controls.Item(intT).Visible = False<br />
Next<br />
End Sub<br />
Sub ZetMenusTerug()<br />
Dim intT As Integer<br />
For intT = 1 To 10<br />
Application.CommandBars(1) _<br />
.Controls.Item(intT).Visible = True<br />
Next<br />
End Sub<br />
1 Neem beide procedures over in een module;<br />
<strong>12</strong> <strong>Excel</strong> <strong>aanpassen</strong><br />
2 Voer WisMenus stap voor stap uit door in de procedure te klikken en herhaaldelijk op F8 te klikken;<br />
3 Als u daarbij de VBA-editor iets verkleint zoals in afbeelding <strong>12</strong>.6 en de muis boven de telvariabele<br />
laat rusten, ziet u bij elke stap welke waarde deze heeft, terwijl u op de achtergrond ziet<br />
hoe <strong>Excel</strong> van z’n hele menu ontdaan wordt;<br />
4 De andere macro brengt alle menu’s weer terug.<br />
Afbeelding <strong>12</strong>.6<br />
Menu’s verbergen.<br />
303
MACRO’S EN VBA IN EXCEL de basis<br />
<strong>12</strong>.1.3 Eigen menu’s toevoegen<br />
304<br />
Behalve via de zojuist genoemde methode met de ingebouwde menu’s goochelen, kunt<br />
u ook een eigen menu toevoegen. U kunt dit menu het beste een duidelijke naam<br />
geven, bijvoorbeeld een bedrijfs- of afdelingsnaam. Het Controls-object biedt verschillende<br />
methoden en eigenschappen om met menu’s te werken.<br />
Tabel <strong>12</strong>.1 Overzicht van methoden en eigenschappen<br />
Item Parameters Omschrijving<br />
Methode<br />
Add Voeg een menu toe.<br />
Type Bepaalt het type besturingselement dat wordt toegevoegd, zoals een knop<br />
– msoControlButton, een menu – msoControlPopup of een keuzelijst – mso-<br />
ControlDropDown.<br />
Id Wordt deze parameter weggelaten dan wordt een leeg besturingselement<br />
van het opgegeven type toegevoegd. Een waarde voegt een van de ingebouwde<br />
elementen toe.<br />
Parameter Hiermee kunt u een willekeurige waarde aan VBA-procedures doorgeven.<br />
Before Bepaalt de positie van het element. Waarde een plaatst een eigen menu dus<br />
vóór het ingebouwde menu Bestand.<br />
Temporary De waarde True zorgt ervoor dat het toegevoegde menu tijdelijk is en verwijderd<br />
wordt als <strong>Excel</strong> wordt afgesloten. Geeft u False op dan blijft het menu<br />
bewaard in het eerder genoemde bestand <strong>Excel</strong>11.xlb.<br />
Delete Verwijder een menu<br />
Eigenschap<br />
Temporary Als deze parameter de waarde True heeft én het menuelement is geplaatst<br />
met de waarde False in de Temporary parameter van de Add methode,<br />
wordt het menu alleen verwijderd voor de duur van de sessie. Wordt <strong>Excel</strong><br />
opnieuw gestart dan komt het menuelement terug. Geeft u de waarde False<br />
op dan is de verwijdering permanent.<br />
BeginGroup Een boolean eigenschap die een groepslijntje in een menu zet.<br />
Caption De menutekst<br />
Count Telt het aantal elementen in de Controls-verzameling.<br />
Enabled True maakt het menu toegankelijk. False laat het menu wel zien, maar het is<br />
grijs en kan niet gebruikt worden<br />
OnAction Verwijst naar de macro die uitgevoerd moet worden als de gebruiker op het<br />
menu klikt of de bijbehorende sneltoets gebruikt.<br />
Visible True maakt het menu zichtbaar. False maakt het onzichtbaar.
Oefening <strong>12</strong>.2 Menu toevoegen via een macro<br />
1 Neem de volgende macro over om een menu toe te voegen:<br />
C Sub VoegEenMenuToe()<br />
Dim mnuMM As Object<br />
MsgBox Application.CommandBars(1).Controls.Count<br />
Set mnuMM = Application.CommandBars(1).Controls.Add _<br />
(Type:=msoControlPopup, before:=1, temporary:=True)<br />
mnuMM.Caption = "Ipaa &Service"<br />
mnuMM.Visible = True<br />
mnuMM.OnAction = "LogInDatabase"<br />
MsgBox Application.CommandBars(1).Controls.Count<br />
End Sub<br />
<strong>12</strong> <strong>Excel</strong> <strong>aanpassen</strong><br />
Eerst wordt het aantal menu’s geteld en weergegeven in een messagebox. Dan wordt een menu<br />
toegevoegd vóór het menu Bestand. De menutekst wordt opgegeven met een ampersand voor<br />
een letter die niet in een van de andere menu’s voorkomt. Dit wordt de sneltoets. De macro die<br />
uitgevoerd wordt is LogInDatabase. U kunt een willekeurige macro gebruiken die u gemaakt<br />
hebt. Tot slot wordt het aantal menu’s weer geteld en weergegeven.<br />
Bij menu’s op de menubalk – zoals in dit voorbeeld – wordt normaal gesproken geen handeling<br />
uitgevoerd als we op de menukeuze klikken. In dat geval laat u gewoon de OnAction eigenschap<br />
weg en vult u het menu met items.<br />
2 Deze macro verwijdert een specifiek toegevoegd menu. U noemt het dus bij naam!<br />
C Sub VerwijderEenMenu()<br />
Application.CommandBars(1).Controls("Ipaa &Service").Delete<br />
End Sub<br />
Overigens is het een goede zaak om een menu eerst te verwijderen voordat u het toevoegt.<br />
Bestaat het menu namelijk al en u voegt het (nogmaals) toe, dan zijn er twee! In de procedure<br />
VoegEenMenuToe roept u gewoon eerst de procedure VerWijderEenMenu aan. Probeert u<br />
daarentegen een menu te verwijderen, terwijl het nog niet bestaat, dan levert dat een fout in de<br />
macro op.<br />
3 Deze fout kunt u als volgt voorkomen:<br />
C Sub VerwijderEenMenu()<br />
On Error Resume Next<br />
Application.CommandBars(1).Controls("Ipaa &Service").Delete<br />
On Error Goto 0<br />
End Sub<br />
Voeg deze uitbreiding pas toe als alles foutloos werkt. Met On Error Resume Next zegt u ’Ga<br />
305
MACRO’S EN VBA IN EXCEL de basis<br />
306<br />
maar gewoon door met de macro als er een fout optreedt’! Zo zult u andere fouten echter óók<br />
niet meer zien.<br />
Afbeelding <strong>12</strong>.7<br />
Het menu is toegevoegd.<br />
Opdracht <strong>12</strong>.1 Geschikt event zoeken om automatisch een menu toe<br />
te voegen<br />
Ga na in welke events u dit soort macro’s zou kunnen plaatsen om <strong>Excel</strong> automatisch van de juiste<br />
menu’s te voorzien.<br />
Opdracht <strong>12</strong>.2 Werkbalk opbouwen via een macro<br />
Probeer er zelf achter te komen hoe u een werkbalk via een macro zou kunnen opbouwen. Een<br />
paar tips: kijk in de helpbestanden onder andere bij: CommandBars en de methoden Delete en Add.<br />
Om een knop aan de werkbalk toe te voegen hebt u nodig:<br />
Set btnKnop = wbMijnWerkBalk.Controls.Add(Type:=msoControlButton)<br />
En verder maakt u ook gebruik van de eigenschappen Caption, ToolTipText en Position. De constante<br />
msoBarFloating zorgt bijvoorbeeld voor een vrij boven het programmavenster zwevende<br />
werkbalk.<br />
<strong>12</strong>.2 Functies toevoegen<br />
U bent bekend met de ingebouwde functies van <strong>Excel</strong>. Een ingebouwde functie is<br />
niets anders dan een eenmaal vastgelegde gecompliceerde berekening die ook heel<br />
goed direct in formules op het werkblad uitgevoerd zou kunnen worden. Een functie<br />
maakt het gebruik echter eenvoudiger. Daarnaast is een functie slimmer dan conventionele<br />
formules; zie ook mijn boek Formules en Functies in <strong>Excel</strong>, eveneens uitgegeven<br />
door <strong>Pearson</strong> <strong>Education</strong>.<br />
Als we bijvoorbeeld een gemiddelde willen berekenen van een reeks getallen en we<br />
doen dat met een conventionele formule, dan zullen er vreemde resultaten optreden als<br />
er in de reeks getallen bijvoorbeeld een cel is die per abuis geen getal, maar een tekst<br />
bevat. Een cel die leeg is (geen waarde bevat) zal als waarde nul meetellen. De ingebouwde<br />
functie Gemiddelde gaat hier anders mee om; zie de afbeeldingen <strong>12</strong>.8 en <strong>12</strong>.9.
Afbeelding <strong>12</strong>.8<br />
Een lege cel wordt anders geïnterpreteerd.<br />
Afbeelding <strong>12</strong>.9<br />
Tekst is een probleem voor een conventionele formule.<br />
<strong>12</strong> <strong>Excel</strong> <strong>aanpassen</strong><br />
307
MACRO’S EN VBA IN EXCEL de basis<br />
308<br />
Tekst leidt in het ene geval tot een fout, maar in het andere geval ziet u dat een functie<br />
de tekst negeert. Even buiten beschouwing gelaten of de manier waarop deze functie<br />
werkt wel of niet voordelig is, duidelijk is dat een functie meer intelligentie bevat<br />
dan een conventionele formule die op het oog hetzelfde doet. Waarom is dat zo? Een<br />
ingebouwde functie is geprogrammeerd in een programmeertaal die oneindig veel<br />
mogelijkheden biedt; iets waar u, aangekomen bij de laatste paragraaf van dit laatste<br />
hoofdstuk in dit boek, hopelijk inmiddels óók achter bent.<br />
U kunt zelf een ingebouwde functie aan <strong>Excel</strong> toevoegen, waar de volgende stappen<br />
voor nodig zijn:<br />
1 Programmeer de functie;<br />
2 Test de werking grondig;<br />
3 Neem de functiemacro op in een speciaal werkblad;<br />
4 Bewaar dit werkblad in een speciaal bestandsformaat;<br />
5 En in een speciale map op schijf.<br />
Afbeelding <strong>12</strong>.10<br />
Parameters vanuit <strong>Excel</strong> doorgeven naar een functie.
<strong>12</strong>.2.1 Functie programmeren<br />
<strong>12</strong> <strong>Excel</strong> <strong>aanpassen</strong><br />
Een functie heeft als bijzonderheid dat ze een functiewaarde kan teruggeven aan de<br />
aanroepende instantie. In dit geval is de aanroepende instantie een cel in een <strong>Excel</strong>werkblad<br />
met een formule waarin de functie gebruikt wordt. Een aanroepende instantie<br />
zou echter ook heel goed een andere procedure kunnen zijn. De functie wordt<br />
gevoed met een of meer parameters. In de functiewizard ziet u deze parameters in stap<br />
2 van de wizard. In afbeelding <strong>12</strong>.10 ziet u hoe de parameters voor de functie Gemiddelde<br />
ingevuld worden.<br />
Overigens zijn niet alle <strong>Excel</strong>-functies direct in VBA te benaderen.Voor de functies die<br />
we wel kunnen aanroepen, gebeurt dat met hun Amerikaanse functienaam.<br />
Afbeelding <strong>12</strong>.11<br />
De resultaten van de werkbladfuncties.<br />
Oefening <strong>12</strong>.3 Functies in een <strong>Excel</strong>-werkblad versus een macro<br />
1 Neem het werkblad uit afbeelding <strong>12</strong>.11 over.<br />
2 Vul in kolom E de formules met de functies in zoals ze als tekst in kolom G zijn afgebeeld.<br />
3 Verifieer de uitkomsten.<br />
4 Neem de volgende macro over in een moduleblad.<br />
5 Start de macro en vergelijk de uitkomst met die in afbeelding <strong>12</strong>.<strong>12</strong>.<br />
C Sub MaandBedragHyphoteek()<br />
MsgBox "€ " & CStr(Round( _<br />
Pmt(0.06 / <strong>12</strong>, 360, 100000, 0, 0), 2))<br />
End Sub<br />
Deze procedure geeft het maandbedrag van een lening weer en gebruikt drie VBA-functies die<br />
we ook in <strong>Excel</strong> kennen; zie ook tabel <strong>12</strong>.2.<br />
309
MACRO’S EN VBA IN EXCEL de basis<br />
310<br />
Afbeelding <strong>12</strong>.<strong>12</strong><br />
Resultaat van een van de VBA-functies<br />
Tabel <strong>12</strong>.2 Enkele werkbladfuncties versus vergelijkbare VBA-functies<br />
<strong>Excel</strong> Argumenten VBA Argumenten<br />
TEKST (waarde;opmaak_tekst) CStr (expressie)<br />
AFRONDEN (getal;aantal-decimalen) Round (expressie [,AantDecPosities])<br />
BET (rente;aantaltermijnen;hw;tw;type_getal)<br />
Pmt (rate, nper, pv[, fv[, type]])<br />
De notatie in de functiewizard van <strong>Excel</strong> en in de helpbestanden van VBA is helaas<br />
niet gelijk. Zelfs binnen VBA is sprake van kennelijk haastwerk bij de vertaling; het<br />
ene is in het Nederlands, het andere in het Engels, soms vet gedrukt en soms weer<br />
cursief<br />
Er is echter één belangrijk onderscheid tussen verplichte en niet verplichte argumenten.<br />
In <strong>Excel</strong> wordt dit aangegeven door de verplichte argumenten vet af te drukken<br />
en de niet verplichte niet. In VBA worden [niet verplichte argumenten] tussen rechte<br />
haken gezet.
<strong>12</strong> <strong>Excel</strong> <strong>aanpassen</strong><br />
Wanneer u zelf een werkbladfunctie ontwerpt, kunt u ook aangeven welke argumenten<br />
verplicht zijn en welke niet. Zonder de verplichte argumenten kan een functie<br />
niet werken en moet een foutmelding gegenereerd worden. Dit is overigens niet per se<br />
noodzakelijk omdat <strong>Excel</strong> deze taak op zich neemt . Als de niet verplichte argumenten<br />
achterwege gelaten worden, moet er een standaardwaarde ingevuld worden.<br />
Bij het bekijken van afbeelding <strong>12</strong>.13 ziet u in het bereik B4:C7 cellen gevuld met<br />
getallen. Alleen in C6 staat tekst en B6 is leeg. Laten wíj nu een eens een functie programmeren<br />
die aan de volgende eisen voldoet:<br />
Het gemiddelde van waarden in een bereik moet berekend worden;<br />
Een lege cel mag niet meetellen voor het gemiddelde;<br />
Een cel met de waarde nul moet wél meegeteld worden;<br />
Een cel met een tekst mag geen aanleiding geven tot een fout;<br />
Het resultaat moet afgerond worden op een willekeurig aantal op te geven decimalen;<br />
Wordt geen afronding opgegeven, dan moet er standaard afgerond worden op twee<br />
decimalen.<br />
Afbeelding <strong>12</strong>.13<br />
Werkblad bij oefening <strong>12</strong>.4<br />
In afbeelding <strong>12</strong>.13 zijn in kolom G de gebruikte formules afgedrukt die in de formulecellen<br />
in kolom E gebruikt worden. In kolom E ziet u dus de resultaten van deze<br />
zelfgemaakte functie.<br />
311
MACRO’S EN VBA IN EXCEL de basis<br />
Oefening <strong>12</strong>.4 Functiemacro programmeren<br />
1 Neem uit het werkblad van afbeelding <strong>12</strong>.13 het bereik B4:C9 over.<br />
2 Neem de formules pas over als u de functiemacro gemaakt hebt.<br />
3 Ga naar de VBA-editor en voeg de volgende programmacode toe aan een module:<br />
C Function MijnGemiddelde(rngBereik As Range, _<br />
Optional intAantalDecs As Integer = 2)<br />
'Declaraties<br />
Dim lngAantalGeldig As Long<br />
Dim sngTotaal As Single<br />
Dim objCel As Object<br />
'Initialisaties<br />
lngAantalGeldig = 0: sngTotaal = 0<br />
'Haal de inhoudvan alle cellen 1 voor 1 op<br />
For Each objCel In rngBereik<br />
If IsNumeric(objCel.Value) Then<br />
If Not (IsEmpty(objCel.Value)) Then<br />
lngAantalGeldig = lngAantalGeldig + 1<br />
sngTotaal = sngTotaal + objCel.Value<br />
End If<br />
End If<br />
Next<br />
'Geef de functiewaarde terug naar het werkblad<br />
MijnGemiddelde = Round((sngTotaal / lngAantalGeldig), intAantalDecs)<br />
End Function<br />
4 Ga naar het werkblad en start de functiewizard.<br />
5 In de categorie Door gebruiker gedefinieerd zult u de functie aantreffen, maar u mag ook gewoon<br />
de functie op de formulebalk invoeren.<br />
3<strong>12</strong><br />
Het bereik wordt in het argument van de functie doorgegeven aan de parameter rngBereik.<br />
De volgende parameter wordt voorafgegaan door het sleutelwoord Optional wat<br />
inhoudt dat deze parameter weggelaten mág worden. In dat geval krijgt intAantalDecs<br />
de waarde twee. Wordt de parameter in de werkbladformule wél gevuld, dan wordt die<br />
waarde gebruikt!<br />
Onder de regel initialisaties ziet u iets merkwaardigs wat op zich niet zo heel belangrijk<br />
is; de dubbele punt mag gebruikt worden om twee verschillende opdrachten op<br />
een regel te zetten.
<strong>12</strong> <strong>Excel</strong> <strong>aanpassen</strong><br />
Er is een objectvariabele objCel gedefinieerd en die wordt gebruikt om één voor één<br />
langs alle cellen in het bereik te gaan en de waarde op te vragen via de eigenschap<br />
Value. Met de functies IsEmpty en IsNumeric wordt nagegaan of de cel niet leeg is en<br />
alleen getallen bevat. Als het om getallen gaat, wordt de inhoud steeds bij het reeds<br />
opgetelde totaal in sngTotaal gevoegd en wordt het aantal cellen dat een geldige waarde<br />
bevat met één opgehoogd.<br />
Tot slot ziet u hoe een functiewaarde teruggegeven kan worden naar een formule in<br />
het werkblad. Er wordt netjes afgerond op het aantal opgegeven decimalenof het standaard<br />
aantal decimalen.<br />
Deze functie hebt u in een module gemaakt die bij een of andere werkmap hoort. Als<br />
deze werkmap gesloten is en de functie werd ook in een andere map toegepast, dan<br />
werkt deze niet meer en zult u de melding #NAAM! in de formulecel(len) zien. We<br />
kunnen natuurlijk deze functie in de persoonlijk macrowerkmap opnemen, maar er is<br />
ook een andere mogelijkheid.<br />
<strong>12</strong>.2.2 Een invoegtoepassing maken<br />
Een invoegtoepassing wordt via het menu Extra, Invoegtoepassingen aan <strong>Excel</strong> gekoppeld<br />
en dan ook steeds geladen als <strong>Excel</strong> gestart wordt.<br />
Oefening <strong>12</strong>.5 Invoegtoepassing maken<br />
1 Open een nieuwe werkmap.<br />
2 Verwijder alle bladen in deze werkmap op een na. Dit blad kunt u gebruiken voor testdoeleinden<br />
of er informatie over de functiemacro’s in opnemen.<br />
3 Ga naar de VBA-editor en voeg aan deze enkelbladige werkmap een module toe.<br />
4 Verplaats de functiemacro met knippen-en-plakken naar deze module; zie afbeelding <strong>12</strong>.14.<br />
5 Open het dialoogvenster Eigenschappen via het menu Bestand. Vul het in; zie ook afbeelding<br />
<strong>12</strong>.15. Deze informatie ziet u later terug in het dialoogvenster Invoegtoepassingen en in de functiewizard.<br />
6 Sla de werkmap op schijf op.<br />
7 Sla de werkmap nu opnieuw op, maar geef aan dat u de werkmap als Invoegtoepassing wilt<br />
bewaren; zie afbeelding <strong>12</strong>.16. De map wordt nu direct in de map Invoegtoepassingen op schijf<br />
opgeslagen als xla-bestand.<br />
313
MACRO’S EN VBA IN EXCEL de basis<br />
314<br />
Afbeelding <strong>12</strong>.14<br />
Functiemacro is verplaatst.<br />
Afbeelding <strong>12</strong>.15<br />
Leg de details vast en vul de eigenschappen voor de werkmap in.
Afbeelding <strong>12</strong>.16<br />
Werkmap als invoegtoepassing opslaan.<br />
8 Waarschijnlijk ziet u nu in het oorspronkelijke<br />
werkblad in de cellen waarin de functie Mijngemiddelde<br />
gebruikt werd, de foutmelding<br />
#NAAM?. Logisch, want de functiemacro is er<br />
niet meer. Deze hebt u in stap 4 immers verplaatst.<br />
9 Sla de werkmap op en sluit <strong>Excel</strong> af.<br />
10 Start het programma opnieuw en open de werkmap.<br />
11 Kies in het menu Extra, Invoegtoepassingen….<br />
Uw zelfgemaakte invoegtoepassing wordt keurig<br />
in de lijst vermeld en u kunt deze koppelen<br />
door er een vinkje voor te plaatsen; zie afbeelding<br />
<strong>12</strong>.17.<br />
<strong>12</strong> Open de functiewizard en controleer dat de<br />
functie beschikbaar is; zie afbeelding <strong>12</strong>.18.<br />
<strong>12</strong> <strong>Excel</strong> <strong>aanpassen</strong><br />
Afbeelding <strong>12</strong>.17<br />
De invoegtoepassing wordt aan <strong>Excel</strong> gekoppeld.<br />
315
MACRO’S EN VBA IN EXCEL de basis<br />
13 Ook de argumenten zijn bekend. U ziet dat de benamingen van de parameters als argument van<br />
de functie genoemd worden. Het kan dus helpen als u duidelijke namen gebruikt; zie afbeelding<br />
<strong>12</strong>.19.<br />
316<br />
Afbeelding <strong>12</strong>.19<br />
…evenals de noodzakelijke argumenten.<br />
Afbeelding <strong>12</strong>.18<br />
De functiewizard kent de functie nu…
Afbeelding <strong>12</strong>.20<br />
Ook indien het verplichte argument ontbreekt, is er een foutmelding.<br />
<strong>12</strong> <strong>Excel</strong> <strong>aanpassen</strong><br />
Wilt u de functiemacro na wijziging opnieuw als xla-bestand opslaan onder dezelfde<br />
naam, dan dient u eerst de invoegtoepassing te ontkoppelen omdat het xla-bestand op<br />
schijf vastgehouden (gelockt) wordt zodra <strong>Excel</strong> start.<br />
KOPPELEN VAN EEN FUNCTIEMACRO<br />
Behalve dat u via het menu Extra, Invoegtoepassingen een invoegmacro kunt koppelen, is het<br />
ook mogelijk het .xla-bestand gewoon te openen om zo de functies in het werkblad te laten<br />
werken. Ontkoppelt u de invoegtoepassing én is het .xla-bestand niet geopend, dan zijn er<br />
twee mogelijkheden:<br />
<strong>Excel</strong> kan de locatie van het .xla-bestand vinden en zal op de formulebalk het volledige pad<br />
naar dit bestand en de functie daarin weergeven en de functies zullen werken.<br />
Of het bestand kan niet gevonden worden, in welk geval er in de formulecellen een foutmelding<br />
zal verschijnen.<br />
317
MACRO’S EN VBA IN EXCEL de basis<br />
Opdracht <strong>12</strong>.3 Macro voor uitgebreide voorwaardelijke opmaak<br />
U weet dat met Voorwaardelijke opmaak in het menu Opmaak tot drie onderscheiden waardebereiken<br />
in een cel tot een bepaalde celopmaak kunnen leiden. Drie ís echter wat weinig. Probeert u<br />
eens een functie te maken die tien onderscheiden bereiken kan duiden. De waarde in een cel moet<br />
in de naastgelegen cel waarin deze functie in een formule gebruikt wordt grafisch weergegeven<br />
worden met sterretjes en bovendien moeten deze sterretjes steeds een andere kleur krijgen.<br />
318