05.09.2013 Views

12 Excel aanpassen - Pearson Education

12 Excel aanpassen - Pearson Education

12 Excel aanpassen - Pearson Education

SHOW MORE
SHOW LESS

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

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!