Besturingselementen en formulieren - Pearson Education
Besturingselementen en formulieren - Pearson Education
Besturingselementen en formulieren - 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.
11<br />
BESTURINGS-<br />
ELEMENTEN EN<br />
FORMULIEREN<br />
De belangrijkste punt<strong>en</strong> van hoofdstuk 11<br />
<strong>Besturingselem<strong>en</strong>t<strong>en</strong></strong> zoals knopp<strong>en</strong>, lijst<strong>en</strong> invulvakk<strong>en</strong>, keuzerondjes <strong>en</strong> dergelijke.<br />
Er zijn vele dialoogv<strong>en</strong>sters in Excel beschikbaar die u als VBA-programmeur kunt b<strong>en</strong>utt<strong>en</strong>.<br />
Mogelijkhed<strong>en</strong> om eig<strong>en</strong> dialoogv<strong>en</strong>sters sam<strong>en</strong> te stell<strong>en</strong>.<br />
<strong>Besturingselem<strong>en</strong>t<strong>en</strong></strong> direct in e<strong>en</strong> werkblad te gebruik<strong>en</strong>.<br />
Interactie met de gebruiker.<br />
Gegev<strong>en</strong>s uit e<strong>en</strong> dialoogv<strong>en</strong>ster overbr<strong>en</strong>g<strong>en</strong> naar e<strong>en</strong> werkblad.
Wat leert u in dit hoofdstuk?<br />
Ingebouwd dialoogv<strong>en</strong>ster b<strong>en</strong>utt<strong>en</strong>.<br />
De werkbalk <strong>Besturingselem<strong>en</strong>t<strong>en</strong></strong>.<br />
E<strong>en</strong> ‘Userform’.
MACRO’S EN VBA IN EXCEL de basis<br />
11.1 Ingebouwde dialoogv<strong>en</strong>sters<br />
De ingebouwde dialoogv<strong>en</strong>sters van Excel k<strong>en</strong>t u zeer waarschijnlijk al. Als u bijvoorbeeld<br />
in het m<strong>en</strong>u Opmaak de optie Celeig<strong>en</strong>schapp<strong>en</strong> kiest <strong>en</strong> e<strong>en</strong> van de tabblad<strong>en</strong><br />
selecteert, ziet u zo’n dialoogv<strong>en</strong>ster; zie afbeelding 11.1<br />
Afbeelding 11.1<br />
Het dialoogv<strong>en</strong>ster Celeig<strong>en</strong>schapp<strong>en</strong>, tabblad Uitlijning.<br />
In VBA kunt u zo’n dialoogv<strong>en</strong>ster ook makkelijk oproep<strong>en</strong>, maar het ziet er dan wel<br />
iets anders uit. Lat<strong>en</strong> we dit e<strong>en</strong>s prober<strong>en</strong> met e<strong>en</strong> eerste oef<strong>en</strong>ing.<br />
Oef<strong>en</strong>ing 11.1<br />
Ingebouwd dialoogv<strong>en</strong>ster oproep<strong>en</strong><br />
1 Op<strong>en</strong> e<strong>en</strong> lege map.<br />
2 Ga naar de VBA-editor <strong>en</strong> voeg e<strong>en</strong> module toe.<br />
3 Neem de volg<strong>en</strong>de procedure over in de module:<br />
C Sub Dialoogv<strong>en</strong>sters_1()<br />
Application.Dialogs(xlDialogAlignm<strong>en</strong>t).Show<br />
End Sub<br />
4 Klik in de regel Application…<strong>en</strong> start de uitvoering van de macro met F5. Afbeelding 11.2 geeft<br />
het dialoogv<strong>en</strong>ster weer met slechts dat <strong>en</strong>e tabblad.<br />
262
11 <strong>Besturingselem<strong>en</strong>t<strong>en</strong></strong> <strong>en</strong> formulier<strong>en</strong><br />
Afbeelding 11.2<br />
Het dialoogv<strong>en</strong>ster Uitlijning.<br />
5 U mag ook met e<strong>en</strong> objectvariabele werk<strong>en</strong>, dan ziet het er zo uit:<br />
C Dim dlgD As Dialog<br />
Set dlgD = Application.Dialogs(xlDialogAlignm<strong>en</strong>t)<br />
With dlgD<br />
.Show<br />
End With<br />
De vraag is nu hoe we de door de gebruiker te kiez<strong>en</strong> informatie aan het dialoogv<strong>en</strong>ster<br />
kunn<strong>en</strong> ontfutsel<strong>en</strong>. Welnu, dat hóeft helemaal niet! Als u vanuit e<strong>en</strong> macro e<strong>en</strong><br />
dialoog laat verschijn<strong>en</strong>, word<strong>en</strong> e<strong>en</strong>voudig direct de gemaakte keuzes toegepast op de<br />
geselecteerde cell<strong>en</strong>.<br />
Elk ingebouwd dialoogv<strong>en</strong>ster bezit tal van parameters. Deze kunt u in de Help vind<strong>en</strong><br />
als u zoekt naar Dialog Object <strong>en</strong> dan op de helppagina klikt op Lijst van argum<strong>en</strong>t<strong>en</strong><br />
voor ingebouwde dialoogv<strong>en</strong>sters. In de lijst zijn tev<strong>en</strong>s alle constant<strong>en</strong> te vind<strong>en</strong> voor<br />
de ingebouwde dialoogv<strong>en</strong>sters.<br />
Veel argum<strong>en</strong>t<strong>en</strong> zijn niet instelbaar, maar soms is dat wel het geval, bijvoorbeeld bij<br />
het dialoogv<strong>en</strong>ster Op<strong>en</strong><strong>en</strong> dat de volg<strong>en</strong>de argum<strong>en</strong>t<strong>en</strong> k<strong>en</strong>t: file_text, update_links,<br />
read_only, format, prot_pwd, write_res_pwd, ignore_rorec, file_origin, custom_delimit,<br />
add_logical, editable, file_access, notify_logical, converter. Deze argum<strong>en</strong>t<strong>en</strong> zijn<br />
g<strong>en</strong>ummerd: file_text is argum<strong>en</strong>t nummer 1, read_only is argum<strong>en</strong>t 3. Als u de macro<br />
sam<strong>en</strong>stelt zoals hierna is aangegev<strong>en</strong>, dan zult u ook zi<strong>en</strong> dat als u de Show-methode<br />
invoert, VBA reageert met de lijst die u in afbeelding 11.3 ziet<br />
263
MACRO’S EN VBA IN EXCEL de basis<br />
Afbeelding 11.3<br />
De argum<strong>en</strong>t<strong>en</strong>lijst van de methode Show.<br />
Het is e<strong>en</strong> beetje omslachtig in VBA dat we deze argum<strong>en</strong>t<strong>en</strong> gewoon moet<strong>en</strong> aftell<strong>en</strong>.<br />
U mag dus schrijv<strong>en</strong>:<br />
blnR = .Show(arg3:=True) of<br />
blnR = .Show(, , True)<br />
In het laatste geval moet u g<strong>en</strong>oeg komma’s zett<strong>en</strong> om daarmee aan te gev<strong>en</strong> dat u<br />
het derde argum<strong>en</strong>t de waarde True wilt gev<strong>en</strong>. De elders in VBA wel geaccepteerde<br />
schrijfwijze met b<strong>en</strong>oemde argum<strong>en</strong>t<strong>en</strong>, levert hier e<strong>en</strong> foutmelding op. Het is grappig<br />
om te zi<strong>en</strong> dat wat dit betreft, e<strong>en</strong> - overig<strong>en</strong>s ook weinig gebruikt - deel van de programmeertaal<br />
niet af is:<br />
blnR = .Show(read_only:=True)<br />
Wilt u e<strong>en</strong> gebruiker dit dialoogv<strong>en</strong>ster ton<strong>en</strong> met als vaste waarde om e<strong>en</strong> bestand<br />
alle<strong>en</strong> als read-only oftewel alle<strong>en</strong>-lez<strong>en</strong> te op<strong>en</strong><strong>en</strong>, dan moet dat zo:<br />
Oef<strong>en</strong>ing 11.2<br />
Parameter ingebouwd dialoogv<strong>en</strong>ster instell<strong>en</strong><br />
1 Neem de volg<strong>en</strong>de procedure over:<br />
C Sub Dialoogv<strong>en</strong>sters_2()<br />
Dim blnR As Boolean<br />
Dim dlgD As Dialog<br />
Set dlgD = Application.Dialogs.Item(xlDialogOp<strong>en</strong>)<br />
264
11 <strong>Besturingselem<strong>en</strong>t<strong>en</strong></strong> <strong>en</strong> formulier<strong>en</strong><br />
With dlgD<br />
blnR = .Show(arg3:=True)<br />
End With<br />
If Not (blnR) Th<strong>en</strong><br />
MsgBox "De gebruiker heeft op annuler<strong>en</strong> gedrukt"<br />
End If<br />
End Sub<br />
2 Start de procedure.<br />
3 Selecteer e<strong>en</strong> bestand in het dialoogv<strong>en</strong>ster Op<strong>en</strong><strong>en</strong> <strong>en</strong> klik op de knop Op<strong>en</strong><strong>en</strong>.<br />
4 Vergelijk uw resultaat met dat van afbeelding 11.4 <strong>en</strong> controleer of het geop<strong>en</strong>de bestand in de<br />
Excel-titelbalk de aanduiding [Alle<strong>en</strong> lez<strong>en</strong>] gekreg<strong>en</strong> heeft.<br />
Afbeelding 11.4<br />
E<strong>en</strong> bestand is als ‘alle<strong>en</strong> lez<strong>en</strong>’ geop<strong>en</strong>d.<br />
Waarom zoud<strong>en</strong> we ons toch met deze dialoogv<strong>en</strong>sters bezighoud<strong>en</strong>? Het is bijvoorbeeld<br />
mogelijk om de totale Excel-interface weg te hal<strong>en</strong> (zie hoofdstuk 12) <strong>en</strong> alle<strong>en</strong><br />
díe dialog<strong>en</strong> aan de gebruiker voor te schotel<strong>en</strong> waarvan u wilt dat ze gebruikt kunn<strong>en</strong><br />
word<strong>en</strong>. Het mooie aan het vorige voorbeeld is dat de gebruiker bij het kiez<strong>en</strong> <strong>en</strong><br />
op<strong>en</strong><strong>en</strong> van het bestand helemaal ge<strong>en</strong> indicatie krijgt dat het bestand als alle<strong>en</strong> lez<strong>en</strong><br />
geop<strong>en</strong>d wordt.<br />
11.2 <strong>Besturingselem<strong>en</strong>t<strong>en</strong></strong><br />
<strong>Besturingselem<strong>en</strong>t<strong>en</strong></strong> zijn onderdel<strong>en</strong> die normaal in dialoogv<strong>en</strong>sters aangetroff<strong>en</strong><br />
word<strong>en</strong>. Voorbeeld<strong>en</strong> van deze elem<strong>en</strong>t<strong>en</strong> zijn: knopp<strong>en</strong>, lijst<strong>en</strong>, keuzevakjes <strong>en</strong> keuzerondjes<br />
In tabel 11.1 ziet u e<strong>en</strong> compleet overzicht van de besturingselem<strong>en</strong>t<strong>en</strong> die<br />
u in Excel <strong>en</strong> VBA kunt toepass<strong>en</strong>.<br />
265
MACRO’S EN VBA IN EXCEL de basis<br />
Tabel 11.1<br />
Overzicht van besturingselem<strong>en</strong>t<strong>en</strong><br />
Afbeelding Besturingselem<strong>en</strong>t VBA b<strong>en</strong>aming Toepassing<br />
Selectievakje CheckBox Voor het pres<strong>en</strong>ter<strong>en</strong> van niet-unieke keuzes.<br />
Er kan bijvoorbeeld gekoz<strong>en</strong> word<strong>en</strong> voor Vet<br />
<strong>en</strong> Cursief, e<strong>en</strong> van beid<strong>en</strong> of ge<strong>en</strong> van beid<strong>en</strong>.<br />
Tekstvak TextBox E<strong>en</strong> kader waar tekst ingevoerd kan word<strong>en</strong><br />
door de gebruiker of via programmacode.<br />
Keuzerondje OptionButton Keuzerondjes staan altijd in groep<strong>en</strong> bij elkaar<br />
<strong>en</strong> word<strong>en</strong> gebruikt voor het pres<strong>en</strong>ter<strong>en</strong> van<br />
keuzes die elkaar uitsluit<strong>en</strong>. U kunt bijvoorbeeld<br />
kiez<strong>en</strong> voor ligg<strong>en</strong>d of staand afdrukk<strong>en</strong>, maar<br />
niet voor beide.<br />
Knop CommandButton E<strong>en</strong> drukknop zoals we die in talloze dialog<strong>en</strong><br />
aantreff<strong>en</strong>, met als meest bek<strong>en</strong>de voorbeeld<br />
de Annuler<strong>en</strong>-knop.<br />
Keuzelijst ListBox E<strong>en</strong> kader waarin e<strong>en</strong> lijstje met mogelijkhed<strong>en</strong><br />
gepres<strong>en</strong>teerd kan word<strong>en</strong>. Afhankelijk van de<br />
instelling<strong>en</strong> kan de gebruiker uit de lijst e<strong>en</strong> of<br />
meer mogelijkhed<strong>en</strong> kiez<strong>en</strong>. De keuzelijst heeft<br />
vaste afmeting<strong>en</strong>.<br />
Keuzelijst met<br />
invoervak<br />
ComboBox<br />
Dit is e<strong>en</strong> combinatie van e<strong>en</strong> e<strong>en</strong>regelig<br />
tekstvak <strong>en</strong> e<strong>en</strong> lijst. Naast het tekstvak dat hier<br />
aangeduid wordt met invoervak vind<strong>en</strong> we e<strong>en</strong><br />
m<strong>en</strong>usymbool Als de gebruiker hierop klikt valt<br />
de lijst op<strong>en</strong> <strong>en</strong> toont de beschikbare keuzes.<br />
Het is mogelijk dat de gebruiker items aan de<br />
lijst toevoegt omdat in het invoervak iets getypt<br />
kan word<strong>en</strong>. Via wat programmacode kan het<br />
getypte aan de lijst toegevoegd word<strong>en</strong>.<br />
WisselKnop ToggleButton Wisselt tuss<strong>en</strong> twee toestand<strong>en</strong>.<br />
Kringveld Spinbutton Klein knopje met twee pijltjes die omhoog <strong>en</strong><br />
omlaag wijz<strong>en</strong>. Erop klikk<strong>en</strong> doet meestal e<strong>en</strong><br />
waarde op- of weer aflop<strong>en</strong>.<br />
Schuifbalk ScrollBar De bek<strong>en</strong>de schuiv<strong>en</strong> die u ook in Excel rechts<br />
<strong>en</strong> onderaan in e<strong>en</strong> docum<strong>en</strong>tv<strong>en</strong>ster ziet.<br />
Label Label E<strong>en</strong> label wordt gebruikt om verklar<strong>en</strong>de<br />
tekst<strong>en</strong> bij andere besturingselem<strong>en</strong>t<strong>en</strong> te<br />
zett<strong>en</strong> of om e<strong>en</strong>voudige mededeling<strong>en</strong> aan de<br />
gebruiker te do<strong>en</strong>.<br />
Afbeelding Image E<strong>en</strong> kader dat u kunt gebruik<strong>en</strong> om afbeelding<strong>en</strong><br />
in te plaats<strong>en</strong>.<br />
266
11 <strong>Besturingselem<strong>en</strong>t<strong>en</strong></strong> <strong>en</strong> formulier<strong>en</strong><br />
Afbeelding 11.5<br />
Alle gangbare besturingselem<strong>en</strong>t<strong>en</strong> in e<strong>en</strong> werkblad getek<strong>en</strong>d.<br />
In afbeelding 11.5 ziet u <strong>en</strong>kele belangrijke onderdel<strong>en</strong>:<br />
Rechtsonder de werkbalk <strong>Besturingselem<strong>en</strong>t<strong>en</strong></strong>.<br />
Alle gangbare besturingselem<strong>en</strong>t<strong>en</strong> die op deze werkbalk te vind<strong>en</strong> zijn, zijn in<br />
dezelfde volgorde als ze op de werkbalk hebb<strong>en</strong>, in het werkblad getek<strong>en</strong>d.<br />
Bij besturingselem<strong>en</strong>t<strong>en</strong> waarvan de VBA-b<strong>en</strong>aming niet in het elem<strong>en</strong>t g<strong>en</strong>oemd<br />
wordt, is e<strong>en</strong> kader geplaatst waarin u de naam kunt aflez<strong>en</strong>. Deze naam is via tabel<br />
11.1 te herleid<strong>en</strong> naar de b<strong>en</strong>aming op de tooltips van werkbalk.<br />
Rechtsbov<strong>en</strong> het dialoogv<strong>en</strong>ster Eig<strong>en</strong>schapp<strong>en</strong> waarmee u elk individueel besturingselem<strong>en</strong>t<br />
kunt instell<strong>en</strong>. De eig<strong>en</strong>schapp<strong>en</strong> van de CommandButton word<strong>en</strong><br />
weergegev<strong>en</strong> omdat deze geselecteerd is.<br />
Er is wel e<strong>en</strong> bepaalde volgorde die u di<strong>en</strong>t aan te houd<strong>en</strong> om succesvol met besturingselem<strong>en</strong>t<strong>en</strong><br />
te kunn<strong>en</strong> werk<strong>en</strong>:<br />
1 Zet de werkbalk <strong>Besturingselem<strong>en</strong>t<strong>en</strong></strong> op het scherm via het m<strong>en</strong>u<br />
Beeld,Werkbalk<strong>en</strong>;<br />
2 Klik op de knop Ontwerpmodus;<br />
267
MACRO’S EN VBA IN EXCEL de basis<br />
3 Selecteer e<strong>en</strong> besturingselem<strong>en</strong>t <strong>en</strong> tek<strong>en</strong> het op het werkblad op dezelfde manier<br />
zoals u met e<strong>en</strong> tek<strong>en</strong>programma werkt.<br />
4 Klik op de knop Eig<strong>en</strong>schapp<strong>en</strong> om de k<strong>en</strong>merk<strong>en</strong> van het getek<strong>en</strong>de elem<strong>en</strong>t in<br />
te kunn<strong>en</strong> stell<strong>en</strong>;<br />
5 Klik op de knop Programmacode weergev<strong>en</strong> om bij de standaardgebeurt<strong>en</strong>is te<br />
kom<strong>en</strong> dat bij het besturingselem<strong>en</strong>t hoort. Indi<strong>en</strong> nodig voegt u daar de gew<strong>en</strong>ste<br />
programmacode toe of verwijst u naar e<strong>en</strong> procedure (macro) die uitgevoerd moet<br />
word<strong>en</strong>.<br />
11.2.1 <strong>Besturingselem<strong>en</strong>t<strong>en</strong></strong> in e<strong>en</strong> werkblad<br />
Het plaats<strong>en</strong> van besturingselem<strong>en</strong>t<strong>en</strong> in het werkblad is e<strong>en</strong> vrij e<strong>en</strong>voudige procedure.<br />
Volg deze stapp<strong>en</strong> om e<strong>en</strong> besturingselem<strong>en</strong>t in het werkblad te plaats<strong>en</strong>, de<br />
eig<strong>en</strong>schapp<strong>en</strong> ervan in te stell<strong>en</strong> <strong>en</strong> er e<strong>en</strong> macro aan te koppel<strong>en</strong>.<br />
De macro die bij e<strong>en</strong> besturingselem<strong>en</strong>t hoort, wordt in e<strong>en</strong> specifieke procedure geplaatst<br />
die e<strong>en</strong> gebeurt<strong>en</strong>isprocedure of ev<strong>en</strong>t g<strong>en</strong>oemd wordt; daarover in paragraaf<br />
11.2.3 meer.<br />
Oef<strong>en</strong>ing 11.3<br />
Besturingselem<strong>en</strong>t in e<strong>en</strong> werkblad plaats<strong>en</strong><br />
1 Selecteer e<strong>en</strong> leeg werkblad.<br />
2 Kies in het m<strong>en</strong>u Beeld,Werkbalk<strong>en</strong> <strong>en</strong> selecteer in het uitvouwm<strong>en</strong>u Werkset <strong>Besturingselem<strong>en</strong>t<strong>en</strong></strong>;<br />
zie afbeelding 11.6.<br />
3 Klik op de knop Opdrachtknop <strong>en</strong> trek erg<strong>en</strong>s op het werkblad e<strong>en</strong> kader. Als u de muisknop los<br />
laat, tovert Excel e<strong>en</strong> knopje op de plaats van het kader; zie afbeelding 11.7.<br />
Het is belangrijk dat u ev<strong>en</strong> goed naar de werkbalk Werkset <strong>Besturingselem<strong>en</strong>t<strong>en</strong></strong> kijkt. De<br />
knop Ontwerpmodus heet nu Ontwerpmodus afsluit<strong>en</strong>. Dit verschil lijkt klein, maar de effect<strong>en</strong><br />
zijn groot. Zie hiervoor ook tabel 11.2.<br />
268
11 <strong>Besturingselem<strong>en</strong>t<strong>en</strong></strong> <strong>en</strong> formulier<strong>en</strong><br />
Afbeelding 11.6<br />
De werkbalk Werkset <strong>Besturingselem<strong>en</strong>t<strong>en</strong></strong> op het scherm zett<strong>en</strong><br />
Afbeelding 11.7<br />
E<strong>en</strong> knop in het werkblad<br />
269
MACRO’S EN VBA IN EXCEL de basis<br />
Tabel 11.2<br />
Instelling<strong>en</strong> van de Ontwerpmodus<br />
Pictogram Knop naam Effect<br />
Ontwerpmodus<br />
<strong>Besturingselem<strong>en</strong>t<strong>en</strong></strong> in e<strong>en</strong> werkblad kunn<strong>en</strong> gebruikt<br />
word<strong>en</strong> voor het doel waarvoor ze ontworp<strong>en</strong> zijn. De knop<br />
kan nu bijvoorbeeld met de muis ingedrukt word<strong>en</strong>.<br />
ONTBREEKT><br />
***knop-ontwerpmodusafsluit<strong>en</strong>.jpg<br />
Ontwerpmodus afsluit<strong>en</strong><br />
Nu kunt u elk besturingselem<strong>en</strong>t in het werkblad selecter<strong>en</strong>,<br />
de afmeting<strong>en</strong> aanpass<strong>en</strong>, het elem<strong>en</strong>t verslep<strong>en</strong>,<br />
eig<strong>en</strong>schapp<strong>en</strong> instell<strong>en</strong> <strong>en</strong> er e<strong>en</strong> macro aan koppel<strong>en</strong>.<br />
4 Het besturingselem<strong>en</strong>t kan verplaatst word<strong>en</strong> door de muiscursor er midd<strong>en</strong> op zett<strong>en</strong> <strong>en</strong> het te<br />
verslep<strong>en</strong>.<br />
5 Het aanpass<strong>en</strong> van de afmeting<strong>en</strong> gebeurt door e<strong>en</strong> handvat te verslep<strong>en</strong>.<br />
6 Klik in de werkbalk Werkset <strong>Besturingselem<strong>en</strong>t<strong>en</strong></strong> op de knop Ontwerpmodus afsluit<strong>en</strong>.<br />
7 Klik nu met de muis op de knop die in het werkblad getek<strong>en</strong>d is. U ziet dat de knop nu ‘ingedrukt’<br />
wordt. Er gebeurt echter nog niets omdat we er nog e<strong>en</strong> macro aan moet<strong>en</strong> koppel<strong>en</strong>. Bov<strong>en</strong>di<strong>en</strong><br />
moet de standaardtekst op de knop vervang<strong>en</strong> word<strong>en</strong>. We kunn<strong>en</strong> dit do<strong>en</strong> door de eig<strong>en</strong>schapp<strong>en</strong><br />
van dit besturingselem<strong>en</strong>t aan te pass<strong>en</strong>.<br />
11.2.2 Eig<strong>en</strong>schapp<strong>en</strong> van e<strong>en</strong> besturingselem<strong>en</strong>t instell<strong>en</strong><br />
Eerst word<strong>en</strong> de eig<strong>en</strong>schapp<strong>en</strong> van het besturingselem<strong>en</strong>t ingesteld. Afhankelijk van<br />
het type besturingselem<strong>en</strong>t, zijn er per elem<strong>en</strong>t soms wel ti<strong>en</strong>tall<strong>en</strong> eig<strong>en</strong>schapp<strong>en</strong>. In<br />
tabel 11.3 zijn e<strong>en</strong> aantal veelgebruikte eig<strong>en</strong>schapp<strong>en</strong> van de knop op e<strong>en</strong> rijtje gezet<br />
om e<strong>en</strong> idee te gev<strong>en</strong>.<br />
Er is één eig<strong>en</strong>schap die uitermate belangrijk is bij het werk<strong>en</strong> met besturingselem<strong>en</strong>t<strong>en</strong><br />
<strong>en</strong> dat is de eig<strong>en</strong>schap Name. De Name property bepaalt de naam waaronder het<br />
elem<strong>en</strong>t binn<strong>en</strong> de macro bek<strong>en</strong>d is. Het is namelijk vaak nodig om ook in e<strong>en</strong> macro<br />
e<strong>en</strong> besturingselem<strong>en</strong>t aan te kunn<strong>en</strong> sprek<strong>en</strong>. U kunt daar verder in dit hoofdstuk<br />
e<strong>en</strong> voorbeeld van zi<strong>en</strong>. Belangrijk is dat u de Name property altijd opgeeft. Laat u<br />
dit na, dan krijgt het besturingselem<strong>en</strong>t e<strong>en</strong> g<strong>en</strong>erieke naam op het mom<strong>en</strong>t dat het<br />
getek<strong>en</strong>d wordt. In dit geval is dat CommandButton1. U ziet deze naam ook op de<br />
270
11 <strong>Besturingselem<strong>en</strong>t<strong>en</strong></strong> <strong>en</strong> formulier<strong>en</strong><br />
knop staan. Wellicht verwarr<strong>en</strong>d, maar het opschrift van de knop wordt weer door e<strong>en</strong><br />
andere eig<strong>en</strong>schap bepaald, namelijk de eig<strong>en</strong>schap Caption. VBA (of zo u wilt: Excel)<br />
maakt de caption van e<strong>en</strong> knop echter standaard id<strong>en</strong>tiek aan de g<strong>en</strong>erieke naam.<br />
Oef<strong>en</strong>ing 11.4<br />
Eig<strong>en</strong>schapp<strong>en</strong> van e<strong>en</strong> besturingselem<strong>en</strong>t vind<strong>en</strong><br />
1 Klik in de werkbalk Werkset <strong>Besturingselem<strong>en</strong>t<strong>en</strong></strong> op de knop Ontwerpmodus.<br />
2 Selecteer de eerder aangemaakte CommandButton1-knop of maak deze alsnog aan. U ziet nu<br />
de handvat<strong>en</strong> verschijn<strong>en</strong>.<br />
3 Klik op de werkbalk op de knop Eig<strong>en</strong>schapp<strong>en</strong>. Het gelijknamige v<strong>en</strong>ster verschijnt.<br />
4 Bekijk de inhoud; er moet<strong>en</strong> vijf<strong>en</strong>twintig eig<strong>en</strong>schapp<strong>en</strong> zijn die alle bij de commandbutton<br />
hor<strong>en</strong>.<br />
5 Bekijk tabel 11.3 voor e<strong>en</strong> uitleg van de eig<strong>en</strong>schapp<strong>en</strong>.<br />
Tabel 11.4<br />
Eig<strong>en</strong>schap<br />
(Name)<br />
Accelerator<br />
AutoSize<br />
BackColor<br />
BackStyle<br />
Caption<br />
Enabled<br />
Eig<strong>en</strong>schapp<strong>en</strong> van de knop (CommandButton)<br />
Functie<br />
Bepaalt de naam van e<strong>en</strong> besturingselem<strong>en</strong>t zoals het in de programmacode bek<strong>en</strong>d<br />
zal staan.<br />
E<strong>en</strong> van de letters van het opschrift van de knop. De knop kan dan ook ’ingedrukt’<br />
word<strong>en</strong> met de toets<strong>en</strong>combinatie Alt + deze letter. Kies e<strong>en</strong> letter die niet als Accelerator<br />
in e<strong>en</strong> van de m<strong>en</strong>u’s gebruikt wordt!<br />
De afmeting van het besturingselem<strong>en</strong>t wordt automatisch aangepast aan de<br />
hoeveelheid gegev<strong>en</strong>s als de waarde True aangegev<strong>en</strong> wordt. Voor de knop betek<strong>en</strong>t<br />
dat aanpassing van de afmeting aan de hoeveel tekst van de eig<strong>en</strong>schap Caption.<br />
De achtergrondkleur. Deze eig<strong>en</strong>schap geeft twee palett<strong>en</strong>: Palet <strong>en</strong> Systeem. Via<br />
Palet kunt u willekeurige kleur<strong>en</strong> kiez<strong>en</strong>, via de keuze Systeem alle<strong>en</strong> Windows systeem<br />
kleur<strong>en</strong> die in te stell<strong>en</strong> zijn via het configuratiescherm.<br />
Knopp<strong>en</strong> kunn<strong>en</strong> opaque (ondoorzichtig) of transparant zijn.<br />
Dit is het opschrift op de knop.<br />
E<strong>en</strong> eig<strong>en</strong>schap die bepaald of e<strong>en</strong> knop ingedrukt kan word<strong>en</strong> of niet. Soms is het<br />
nodig e<strong>en</strong> knop (tijdelijk) uit te schakel<strong>en</strong> tot de gebruiker e<strong>en</strong> bepaalde handeling<br />
verricht of e<strong>en</strong> bepaald gegev<strong>en</strong> verstrekt heeft. Dat kan met Knop.Enabled =<br />
False. Aanzett<strong>en</strong> gebeurt met Knop.Enabled = True.<br />
271
MACRO’S EN VBA IN EXCEL de basis<br />
Eig<strong>en</strong>schap<br />
ForeColor<br />
Height<br />
Left<br />
Locked<br />
MouseIcon<br />
MousePointer<br />
Picture<br />
PicturePosition<br />
Placem<strong>en</strong>t<br />
PrintObject<br />
Shadow<br />
TakeFocusOnClick<br />
Top<br />
Functie<br />
De kleur van het opschrift op de knop.<br />
De hoogte van de knop opgegev<strong>en</strong> in pixels.<br />
De positie in het werkblad of het formulier t<strong>en</strong> opzichte van de linkerrand. Zie paragraaf<br />
?? voor het werk<strong>en</strong> met formulier<strong>en</strong>.<br />
Bepaalt met de booleaanse waard<strong>en</strong> True <strong>en</strong> False of e<strong>en</strong> besturingselem<strong>en</strong>t bewerkt<br />
kan word<strong>en</strong> of niet.<br />
Kies e<strong>en</strong> bepaalde afbeelding die verschijnt als u met de muis bov<strong>en</strong> de knop komt én<br />
als de volg<strong>en</strong>de eig<strong>en</strong>schap hierna ingesteld wordt op 99-frmMousePointerCustom.<br />
Kies e<strong>en</strong> van de ingebouwde muiscursors of de waarde 99-frmMousePointerCustom<br />
als u bij de vorige eig<strong>en</strong>schap e<strong>en</strong> afbeelding hebt opgegev<strong>en</strong>.<br />
Zet e<strong>en</strong> afbeelding op de knop. Vaak word<strong>en</strong> hiervoor pictogramm<strong>en</strong> gebruikt.<br />
Plek van de afbeelding.<br />
Bepaalt hoe het object zich gedraagt t<strong>en</strong> opzichte van de onderligg<strong>en</strong>de cell<strong>en</strong>.<br />
Bij het afdrukk<strong>en</strong> van e<strong>en</strong> werkblad bepaalt de waarde in deze eig<strong>en</strong>schap of de knop<br />
mee afgedrukt wordt (True) of niet (False).<br />
Geeft met de waarde True e<strong>en</strong> schaduw onder de knop.<br />
Indi<strong>en</strong> er meer elem<strong>en</strong>t<strong>en</strong> in het werkblad ligg<strong>en</strong>, kan dit elem<strong>en</strong>t de focus krijg<strong>en</strong> als<br />
er op geklikt wordt. E<strong>en</strong> knop die de ’focus‘ heeft is te herk<strong>en</strong>n<strong>en</strong> aan het stippellijntje<br />
rond het opschrift op de knop.E<strong>en</strong> knop met focus kan ook geactiveerd word<strong>en</strong> met de<br />
spatiebalk of de Enter-toets. Hebt u e<strong>en</strong> textbox <strong>en</strong> e<strong>en</strong> knop in het werkblad <strong>en</strong> wilt u<br />
dat de textbox altijd geselecteerd blijft, ook al wordt er op de knop geklikt, dan geeft u<br />
deze property voor de knop de waarde False <strong>en</strong> voor de Textbox de waarde True.<br />
De afstand van de knop tot de bov<strong>en</strong>zijde van het werkblad.<br />
Visible Met Visible = True is de knop zichtbaar in het werkblad, met Visible =<br />
False is de knop er wel, maar niet zichtbaar. E<strong>en</strong> knop die onzichtbaar is, kunt u<br />
vanuit e<strong>en</strong> macro wél b<strong>en</strong>ader<strong>en</strong> om bijvoorbeeld het opschrift te wijzig<strong>en</strong>.<br />
Width<br />
WordWrap<br />
De breedte van de knop uitgedrukt in pixels.<br />
Met de waarde True kunt u meer regels kwijt in e<strong>en</strong> elem<strong>en</strong>t. Voor het opschrift op<br />
e<strong>en</strong> knop wellicht niet zo heel interessant, maar bijvoorbeeld wel voor e<strong>en</strong> textbox als<br />
u de gebruiker de mogelijkheid wilt gev<strong>en</strong> meer regels tekst in te voer<strong>en</strong>.<br />
Oef<strong>en</strong>ing 11.5<br />
Eig<strong>en</strong>schapp<strong>en</strong> van e<strong>en</strong> besturingselem<strong>en</strong>t instell<strong>en</strong><br />
Het instell<strong>en</strong> van de eig<strong>en</strong>schapp<strong>en</strong> is erg e<strong>en</strong>voudig omdat u van de meeste eig<strong>en</strong>schapp<strong>en</strong> direct<br />
het effect ziet. Microsoft stopt soms <strong>en</strong>orm veel cosmetische zak<strong>en</strong> in de software <strong>en</strong> daarvan zi<strong>en</strong><br />
we vooral ook hier het directe resultaat. Enkele eig<strong>en</strong>schapp<strong>en</strong> zijn natuurlijk erg belangrijk.<br />
1 Selecteer de knop indi<strong>en</strong> dit nodig is.<br />
272
11 <strong>Besturingselem<strong>en</strong>t<strong>en</strong></strong> <strong>en</strong> formulier<strong>en</strong><br />
2 Geef als Name-property cmdKnop.<br />
3 De Accelerator wordt f.<br />
4 De Caption wordt Afsluit<strong>en</strong>. U ziet e<strong>en</strong> streepje verschijn<strong>en</strong> onder de letter f; dat is de accelerator<br />
Hierdoor kan de knop ook ingedrukt word<strong>en</strong> met Alt + f. Dit is ook bek<strong>en</strong>d als de sneltoets.<br />
5 Experim<strong>en</strong>teer zelf met verschill<strong>en</strong>de andere eig<strong>en</strong>schapp<strong>en</strong> om er e<strong>en</strong> gevoel voor te krijg<strong>en</strong>.<br />
Van sommige eig<strong>en</strong>schapp<strong>en</strong> zoals Enabled ziet u pas het effect als u in de werkbalk Werkset<br />
<strong>Besturingselem<strong>en</strong>t<strong>en</strong></strong> eerst op de knop Ontwerpmodus afsluit<strong>en</strong> klikt!<br />
6 Bekijk ook de werking van het tabblad Alfabetisch <strong>en</strong> Gecategoriseerd in het v<strong>en</strong>ster Eig<strong>en</strong>schapp<strong>en</strong>.<br />
HONGAARSE NOTATIE<br />
Het is e<strong>en</strong> goede gewoonte besturingselem<strong>en</strong>t<strong>en</strong> e<strong>en</strong> naam te gev<strong>en</strong> die begint met drie letters<br />
waaruit u kunt afleid<strong>en</strong> om welk type besturingselem<strong>en</strong>t het gaat, zoals:<br />
cmd voor CommandButton;<br />
txt voorTextBox;<br />
cmb voor ComboBox;<br />
scr voor ScrollBar.<br />
Elders in het boek hebt u gezi<strong>en</strong> dat ik die gewoonte ook toepas bij nam<strong>en</strong> van variabel<strong>en</strong>:<br />
int: Integer;<br />
lng: Long;<br />
str: String;<br />
var: Variant.<br />
De programmacode wordt daardoor beter leesbaar <strong>en</strong> u weet later als er onderhoud gepleegd<br />
moet word<strong>en</strong> onmiddellijk om welk type object of variabele het gaat. We noem<strong>en</strong> deze notatiewijze<br />
zo omdat naar verluidt e<strong>en</strong> Microsoft-programmeur van Hongaarse afkomst er mee op<br />
de propp<strong>en</strong> kwam.<br />
11.2.3 Gebeurt<strong>en</strong>isprocedures<br />
Als u e<strong>en</strong> besturingselem<strong>en</strong>t aan e<strong>en</strong> werkblad hebt toegevoegd, zal er nog ge<strong>en</strong> actie<br />
aan gekoppeld zijn. Om wel iets te lat<strong>en</strong> gebeur<strong>en</strong>, moet<strong>en</strong> we e<strong>en</strong> macro programmer<strong>en</strong><br />
of verwijz<strong>en</strong> naar e<strong>en</strong> bestaande macro. De vraag is: wanneer will<strong>en</strong> we dat er iets<br />
gebeurt? Daartoe moet<strong>en</strong> we eerst wet<strong>en</strong> wat de mogelijkhed<strong>en</strong> van het besturingselem<strong>en</strong>t<br />
zijn.<br />
273
MACRO’S EN VBA IN EXCEL de basis<br />
Elk besturingselem<strong>en</strong>t is standaard voorzi<strong>en</strong> van e<strong>en</strong> aantal uit te voer<strong>en</strong> gebeurt<strong>en</strong>iss<strong>en</strong>.<br />
Voor e<strong>en</strong> knop is dat bijvoorbeeld de klik op de knop wat tot het Click ev<strong>en</strong>t leidt.<br />
Dat is e<strong>en</strong> gebeurt<strong>en</strong>is waar de knop voor is uitgevond<strong>en</strong> <strong>en</strong> het is dan ook het standaard<br />
ev<strong>en</strong>t van dit besturingselem<strong>en</strong>t. Voor e<strong>en</strong> tekstvak is dat weer het Change ev<strong>en</strong>t,<br />
er verandert iets in het tekstvak. Elk besturingselem<strong>en</strong>t heeft zijn standaard ev<strong>en</strong>t,<br />
maar daarnaast ook nog <strong>en</strong>kele andere mogelijkhed<strong>en</strong>. Hoe kom<strong>en</strong> we bij de ev<strong>en</strong>ts<br />
van e<strong>en</strong> besturingselem<strong>en</strong>t?<br />
Oef<strong>en</strong>ing 11.6<br />
Gebeurt<strong>en</strong>iss<strong>en</strong> van e<strong>en</strong> besturingselem<strong>en</strong>t vind<strong>en</strong><br />
1 Zet Excel in de ontwerpmodus door te klikk<strong>en</strong> op de knop Ontwerpmodus in de werkbalk Werkset<br />
<strong>Besturingselem<strong>en</strong>t<strong>en</strong></strong>.<br />
2 Selecteer de knop.<br />
3 Klik op de werkbalk op de knop Programmacode weergev<strong>en</strong>. Dubbel klikk<strong>en</strong> op de knop mag<br />
ook.<br />
De VBA-editor verschijnt automatisch. Het blad waar de knop aangemaakt is wordt geselecteerd<br />
<strong>en</strong> het standaard ev<strong>en</strong>t wordt klaar gezet. U ziet dan ook de procedure die aangemaakt is:<br />
Private Sub cmdKnop_Click()<br />
End Sub<br />
U herk<strong>en</strong>t de Name property (cmdKnop), de naam van het ev<strong>en</strong>t (Click) <strong>en</strong> de aanduiding voor<br />
e<strong>en</strong> procedure die van het type Private is wat wil zegg<strong>en</strong> dat de procedure alle<strong>en</strong> bek<strong>en</strong>d is binn<strong>en</strong><br />
deze werkmap.<br />
Als u afbeelding 11.8 bekijkt, ziet u dat het vak Procedure geop<strong>en</strong>d is waar alle andere<br />
beschikbare ev<strong>en</strong>ts voor dit besturingselem<strong>en</strong>t te zi<strong>en</strong> zijn. Er zijn er derti<strong>en</strong>. Voor e<strong>en</strong><br />
ander type besturingselem<strong>en</strong>t kunn<strong>en</strong> er andere ev<strong>en</strong>ts zijn, hoewel er bijvoorbeeld<br />
wel bepaalde gebeurt<strong>en</strong>iss<strong>en</strong> door verschill<strong>en</strong>de besturingselem<strong>en</strong>t<strong>en</strong> gedeeld word<strong>en</strong>.<br />
Zo zijn er verschill<strong>en</strong>de besturingselem<strong>en</strong>t<strong>en</strong> waarbij er e<strong>en</strong> Click-ev<strong>en</strong>t optreedt als<br />
er met de muis op geklikt wordt. In tabel 11.5 zijn de ev<strong>en</strong>ts van de command button<br />
gerubriceerd.<br />
274
11 <strong>Besturingselem<strong>en</strong>t<strong>en</strong></strong> <strong>en</strong> formulier<strong>en</strong><br />
Afbeelding 11.8<br />
Ev<strong>en</strong>ts van de command button.<br />
Tabel 11.5<br />
Ev<strong>en</strong>t<br />
BeforeDragOver<br />
Toepassing van ev<strong>en</strong>ts van de commandbutton<br />
Toepassing<br />
Treedt op net op het mom<strong>en</strong>t dat de muis over het object bewog<strong>en</strong> wordt. Dit ev<strong>en</strong>t<br />
heeft e<strong>en</strong> gecompliceerde structuur met verschill<strong>en</strong>de parameters:<br />
Private Sub object_BeforeDragOver( ByVal Cancel As MSForms.ReturnBoolean,<br />
ByVal gegev<strong>en</strong>s As DataObject, ByVal X As Single, ByVal Y As Single, ByVal<br />
DragState As fmDragState, ByVal Effect As MSForms.ReturnEffect, ByVal Shift As<br />
fmShiftState). U herk<strong>en</strong>t onder meer de positiegegev<strong>en</strong>s van de muiscursor in X <strong>en</strong> Y,<br />
<strong>en</strong> Shift waarmee bepaald wordt welke toets (Ctrl, Shift of Alt) er tijd<strong>en</strong>s het slep<strong>en</strong><br />
ingedrukt is. Daarmee krijg<strong>en</strong> we in Windows immers e<strong>en</strong> ander effect. De waarde<br />
in Dragstate bepaalt de positie bov<strong>en</strong> het object <strong>en</strong> gegev<strong>en</strong>s bepaalt het object dat<br />
gesleept wordt.<br />
BeforDropOrPaste<br />
Click<br />
DblClick<br />
Als de gebruiker op het punt staat gegev<strong>en</strong>s met de muis neer te zett<strong>en</strong> of te plakk<strong>en</strong><br />
in e<strong>en</strong> object. Ook hier vind<strong>en</strong> we vele parameters.<br />
Het standaard ev<strong>en</strong>t van de knop; er zijn ge<strong>en</strong> parameters.<br />
Het doubleclick ev<strong>en</strong>t treedt op als de gebruiker binn<strong>en</strong> e<strong>en</strong> halve seconde<br />
tweemaal op de muisknop drukt terwijl de muiscursor zich bov<strong>en</strong> de knop bevindt.<br />
275
MACRO’S EN VBA IN EXCEL de basis<br />
Ev<strong>en</strong>t<br />
Error<br />
GotFocus<br />
KeyDown<br />
KeyPress<br />
KeyUp<br />
LostFocus<br />
MouseDown<br />
MouseMove<br />
MouseUp<br />
Toepassing<br />
Er treedt e<strong>en</strong> fout op bij het besturingselem<strong>en</strong>t <strong>en</strong> er is ge<strong>en</strong> programmacode<br />
beschikbaar om naar terug te ker<strong>en</strong>. We zi<strong>en</strong> dit in elke willekeurige applicatie wel<br />
e<strong>en</strong>s waarbij meestal e<strong>en</strong> foutmelding verschijnt in de trant van ‘Er treedt e<strong>en</strong> fout<br />
op die niet door de applicatie verwerkt kan word<strong>en</strong>, neem contact op met de leverancier’.<br />
Als dit bij e<strong>en</strong> van uw macro’s gebeurt, b<strong>en</strong>t u de leverancier.<br />
Het besturingselem<strong>en</strong>t heeft de focus gekreg<strong>en</strong>. Deze gebeurt<strong>en</strong>is kunt u heel goed<br />
gebruik<strong>en</strong> bij bijvoorbeeld e<strong>en</strong> tekstvak waar e<strong>en</strong> gebruiker iets moet invull<strong>en</strong>. E<strong>en</strong><br />
veel voorkom<strong>en</strong>de waarde of e<strong>en</strong> waarde die e<strong>en</strong> relatie heeft met wat eerder<br />
ingevuld was, kunt u in dit ev<strong>en</strong>t dan alvast invull<strong>en</strong>. D<strong>en</strong>k bijvoorbeeld aan het invull<strong>en</strong><br />
van de plaatsnaam op basis van de eerder ingevulde postcode. Voor e<strong>en</strong> knop<br />
kunt u in dit ev<strong>en</strong>t bijvoorbeeld controler<strong>en</strong> of alle andere elem<strong>en</strong>t<strong>en</strong> wel de juiste<br />
informatie bevatt<strong>en</strong> <strong>en</strong> of er niets verget<strong>en</strong> is.<br />
Dit ev<strong>en</strong>t treedt op als e<strong>en</strong> toets op het toets<strong>en</strong>bord wordt ingedrukt terwijl het<br />
besturingselem<strong>en</strong>t de focus heeft.<br />
In het KeyPress ev<strong>en</strong>t krijg<strong>en</strong> we alle toets<strong>en</strong> binn<strong>en</strong> die word<strong>en</strong> ingedrukt. U kunt<br />
het ev<strong>en</strong>t bijvoorbeeld gebruik<strong>en</strong> om de invoer in e<strong>en</strong> tekstvak te controler<strong>en</strong> op het<br />
niveau van e<strong>en</strong> <strong>en</strong>kel tek<strong>en</strong>.<br />
Dit ev<strong>en</strong>t treedt op als e<strong>en</strong> ingedrukte toets op het toets<strong>en</strong>bord wordt losgelat<strong>en</strong><br />
terwijl het besturingselem<strong>en</strong>t de focus heeft.<br />
Het besturingselem<strong>en</strong>t verliest de focus. Dit ev<strong>en</strong>t is handig om de totale invoer in<br />
e<strong>en</strong> tekstvak te controler<strong>en</strong>.<br />
De muisknop wordt ingedrukt bov<strong>en</strong> het besturingselem<strong>en</strong>t. Ook hier e<strong>en</strong> gecompliceerde<br />
constructie: Private Sub Chart_MouseDown(ByVal Button As<br />
Long, _<br />
ByVal Shift As Long, ByVal X As Long, ByVal Y As Long).<br />
X <strong>en</strong> Y bevatt<strong>en</strong> de coördinat<strong>en</strong> van de muiscursor bov<strong>en</strong><br />
het besturingselem<strong>en</strong>t. Shift de tegelijkertijd ingedrukte<br />
toets op het toets<strong>en</strong>bord <strong>en</strong> Button bevat de ingedrukte<br />
muisknop.<br />
De muis wordt bov<strong>en</strong> het besturingselem<strong>en</strong>t verplaatst. Dit ev<strong>en</strong>t treedt ongeveer<br />
vijfti<strong>en</strong> maal per seconde op <strong>en</strong> de programmacode hierin is dan ook waanzinnig<br />
lastig foutloos te mak<strong>en</strong>…<br />
De muisknop wordt weer losgelat<strong>en</strong>.<br />
U hebt bij de bespreking van de ev<strong>en</strong>ts in de tabel gezi<strong>en</strong> dat er ook gerefereerd werd<br />
aan andere besturingselem<strong>en</strong>t<strong>en</strong>. <strong>Besturingselem<strong>en</strong>t<strong>en</strong></strong> del<strong>en</strong> dan ook vaak verschill<strong>en</strong>de<br />
ev<strong>en</strong>ts.<br />
11.2.4 Gebeurt<strong>en</strong>is programmer<strong>en</strong><br />
Om succesvol e<strong>en</strong> gebeurt<strong>en</strong>isprocedure te kunn<strong>en</strong> programmer<strong>en</strong> is het noodzakelijk<br />
dat u zich eerst afvraagt wat de gebruiker met de besturingselem<strong>en</strong>t<strong>en</strong> zal do<strong>en</strong> die u<br />
in e<strong>en</strong> formulier of in het werkblad getek<strong>en</strong>d hebt. Houd er rek<strong>en</strong>ing mee dat gebrui-<br />
276
11 <strong>Besturingselem<strong>en</strong>t<strong>en</strong></strong> <strong>en</strong> formulier<strong>en</strong><br />
kers zeer onvoorspelbaar zijn <strong>en</strong> dat u dus met zoveel mogelijk ‘gebruikersdwaling<strong>en</strong>’<br />
rek<strong>en</strong>ing moet houd<strong>en</strong>.<br />
In de tweede plaats is het programmer<strong>en</strong> met behulp van ev<strong>en</strong>ts lastig omdat de volgorde<br />
waarin ze optred<strong>en</strong> door het besturingssysteem (Windows) bepaald wordt. Het is<br />
niet aan ú als programmeur om te bepal<strong>en</strong> in welke volgorde ze optred<strong>en</strong>. Het is zelfs<br />
zo dat als u in het <strong>en</strong>e ev<strong>en</strong>t iets programmeert dat van invloed is op e<strong>en</strong> ander besturingselem<strong>en</strong>t<br />
of object, er e<strong>en</strong> ket<strong>en</strong> van nieuwe ev<strong>en</strong>ts getriggerd kunn<strong>en</strong> word<strong>en</strong> die<br />
op hun beurt nieuwe ev<strong>en</strong>ts trigger<strong>en</strong>. Dit maakt het debugg<strong>en</strong>, het zoek<strong>en</strong> van fout<strong>en</strong><br />
e<strong>en</strong> ware uitdaging.<br />
Indi<strong>en</strong> u voor e<strong>en</strong> bepaald besturingselem<strong>en</strong>t wilt wet<strong>en</strong> welke ev<strong>en</strong>ts in welke volgorde<br />
optred<strong>en</strong>, kunt u dat het beste met de volg<strong>en</strong>de truc achterhal<strong>en</strong>. We nem<strong>en</strong> hierbij<br />
weer de knop als voorbeeld.<br />
Oef<strong>en</strong>ing 11.6<br />
Volgorde van gebeurt<strong>en</strong>iss<strong>en</strong><br />
1 Dubbelklik op de knop. Het Click ev<strong>en</strong>t wordt klaargezet.<br />
2 Typ in dit ev<strong>en</strong>t MsgBox "klik".<br />
3 Laat via het vak Procedure e<strong>en</strong> aantal andere ev<strong>en</strong>ts klaarzett<strong>en</strong> die u wilt onderzoek<strong>en</strong>.<br />
4 Typ hierin dezelfde coderegel waarbij u de tekst natuurlijk aanpast; zie afbeelding 11.9.<br />
5 Ga naar Excel <strong>en</strong> voeg e<strong>en</strong> extra knop toe zodat de focus verschov<strong>en</strong> kan word<strong>en</strong>.<br />
6 Voer allerlei handeling<strong>en</strong> uit; u ziet nu de ev<strong>en</strong>ts langskom<strong>en</strong>.<br />
7 Schakel ev<strong>en</strong>ts ook e<strong>en</strong>s uit door er e<strong>en</strong> quote-tek<strong>en</strong> voor te zett<strong>en</strong>.<br />
Oef<strong>en</strong>ing 11.7<br />
E<strong>en</strong> ev<strong>en</strong>t programmer<strong>en</strong><br />
Voor de knop in het formulier programmer<strong>en</strong> we e<strong>en</strong> mogelijkheid om de werkmap af te sluit<strong>en</strong> <strong>en</strong><br />
de inhoud al dan niet op te slaan.<br />
1 Ga naar de VBA-editor.<br />
2 Selecteer in het Projectv<strong>en</strong>ster het blad waar de knop in getek<strong>en</strong>d is.<br />
3 Neem de volg<strong>en</strong>de macro over in het Click ev<strong>en</strong>t van de knop:<br />
C Private Sub cmdKnop_Click()<br />
Dim intR As Integer<br />
277
MACRO’S EN VBA IN EXCEL de basis<br />
Afbeelding 11.9<br />
Ev<strong>en</strong>ts op e<strong>en</strong> rij.<br />
Dim strN As String<br />
strN = ThisWorkbook.Name<br />
intR = MsgBox("Wilt u deze werkmap opslaan?", vbYesNo _<br />
Or vbQuestion)<br />
If intR = vbOK Th<strong>en</strong><br />
Workbooks(strN).Close savechanges:=True<br />
Else<br />
Workbooks(strN).Close savechanges:=False<br />
End If<br />
End Sub<br />
4 Sla eerst zelf de macro op.<br />
5 Test de macro.<br />
278
11 <strong>Besturingselem<strong>en</strong>t<strong>en</strong></strong> <strong>en</strong> formulier<strong>en</strong><br />
Afbeelding 11.10<br />
Melding<strong>en</strong> van optred<strong>en</strong>de ev<strong>en</strong>ts.<br />
U ziet hier hoe e<strong>en</strong> reactie van de gebruiker aan de hand van de knop die in e<strong>en</strong> messagebox<br />
wordt ingedrukt, opgevraagd <strong>en</strong> verwerkt kan word<strong>en</strong>. Tabel 11.6 geeft e<strong>en</strong><br />
overzicht van alle knopp<strong>en</strong> <strong>en</strong> pictogramm<strong>en</strong> die in e<strong>en</strong> messagebox toegepast kunn<strong>en</strong><br />
word<strong>en</strong>. U kunt met behulp van de Or-functie elke knop, pictogram, focusaanduiding<strong>en</strong><br />
of systeeminstelling toevoeg<strong>en</strong>. Met de volg<strong>en</strong>de regel heeft de box naast de bood-<br />
Afbeelding 11.11<br />
E<strong>en</strong> compleet uitgevoerde messagebox.<br />
279
MACRO’S EN VBA IN EXCEL de basis<br />
schap (de prompt) ook e<strong>en</strong> Ja, Nee <strong>en</strong> e<strong>en</strong> Annuler<strong>en</strong>-knop, de laatste heeft de focus<br />
<strong>en</strong> kan dus met de spatiebalk ’ingedrukt‘ word<strong>en</strong>. De knop die de focus heeft, is voorzi<strong>en</strong><br />
van e<strong>en</strong> stippellijntje; zie afbeelding 11.11 Tev<strong>en</strong>s is er e<strong>en</strong> vraagtek<strong>en</strong>pictogram.<br />
Als u de knop test, zult u merk<strong>en</strong> dat u in ge<strong>en</strong> <strong>en</strong>kele andere applicatie kunt werk<strong>en</strong>,<br />
totdat e<strong>en</strong> knop van de box is ingedrukt. Pas dan zal deze verdwijn<strong>en</strong>. Dit is e<strong>en</strong> effect<br />
van de toevoeging van de constante vbSystemModal.<br />
MsgBox "Mededeling aan de gebruiker", _<br />
vbYesNoCancel Or vbDefaultButton3 _<br />
Or vbQuestion Or vbSystemModal<br />
Tabel 11.6<br />
Constante<br />
Alle knopp<strong>en</strong>, pictogramm<strong>en</strong> <strong>en</strong> instelling<strong>en</strong> voor de messagebox<br />
Betek<strong>en</strong>is<br />
Knopp<strong>en</strong><br />
vbOKOnly<br />
vbOKCancel<br />
vbAbortRetryIgnore<br />
vbYesNoCancel<br />
vbYesNo<br />
vbRetryCancel<br />
OK-knop.<br />
De knopp<strong>en</strong> OK <strong>en</strong> Annuler<strong>en</strong>.<br />
Afbrek<strong>en</strong>, Opnieuw <strong>en</strong> Neger<strong>en</strong>.<br />
De knopp<strong>en</strong> Ja, Nee <strong>en</strong> Annuler<strong>en</strong>.<br />
Ja <strong>en</strong> Nee.<br />
De knopp<strong>en</strong> Opnieuw <strong>en</strong> Annuler<strong>en</strong>.<br />
Pictogramm<strong>en</strong><br />
vbCritical<br />
vbQuestion<br />
vbExclamation<br />
vbInformation<br />
- Ernstige boodschapp<strong>en</strong>.<br />
- Aanduiding voor e<strong>en</strong> vraag.<br />
– Waarschuwing.<br />
– Informatie.<br />
Knopfocus<br />
vbDefaultButton1<br />
vbDefaultButton2<br />
vbDefaultButton3<br />
vbDefaultButton4<br />
De eerste knop heeft de focus.<br />
De tweede knop heeft de focus.<br />
De derde knop heeft de focus.<br />
De vierde knop heeft de focus.<br />
280
11 <strong>Besturingselem<strong>en</strong>t<strong>en</strong></strong> <strong>en</strong> formulier<strong>en</strong><br />
Constante<br />
Betek<strong>en</strong>is<br />
Systeeminstelling<strong>en</strong><br />
vbApplicationModal<br />
vbSystemModal<br />
vbMsgBoxHelpButton<br />
VbMsgBoxSetForeground<br />
vbMsgBoxRight<br />
vbMsgBoxRtlReading<br />
De gebruiker moet op het berichtv<strong>en</strong>ster reager<strong>en</strong> voordat er in Excel<br />
verder gewerkt kan word<strong>en</strong>.<br />
Alle toepassing<strong>en</strong> word<strong>en</strong> onderbrok<strong>en</strong> totdat de gebruiker op het<br />
berichtv<strong>en</strong>ster heeft gereageerd. Dit geldt dus ook voor andere programma’s<br />
dan Excel!<br />
Voegt de knop Help aan het berichtv<strong>en</strong>ster toe.<br />
Het berichtv<strong>en</strong>ster wordt op de voorgrond getoond.<br />
Tekst wordt rechts uitgelijnd.<br />
Geeft op dat tekst op Hebreeuwse <strong>en</strong> Arabische system<strong>en</strong> van rechts<br />
naar links moet word<strong>en</strong> weergegev<strong>en</strong>.<br />
Retourwaard<strong>en</strong><br />
Constante Waarde Beschrijving<br />
vbOK 1 OK is ingedrukt.<br />
vbCancel 2 Annuler<strong>en</strong> is ingedrukt.<br />
vbAbort 3 Afbrek<strong>en</strong> is ingedrukt.<br />
vbRetry 4 Opnieuw is ingedrukt.<br />
vbIgnore 5 Neger<strong>en</strong> is ingedrukt.<br />
vbYes 6 Ja is ingedrukt.<br />
vbNo 7 Nee is ingedrukt<br />
11.2.5 Gebeurt<strong>en</strong>iss<strong>en</strong> van andere object<strong>en</strong><br />
Niet alle<strong>en</strong> besturingselem<strong>en</strong>t<strong>en</strong> k<strong>en</strong>n<strong>en</strong> ev<strong>en</strong>ts, ook andere object<strong>en</strong> kunn<strong>en</strong> ev<strong>en</strong>ts<br />
hebb<strong>en</strong>. In dit voorbeeld gebruik<strong>en</strong> we e<strong>en</strong> ev<strong>en</strong>t van het werkblad. Het werkblad<br />
k<strong>en</strong>t neg<strong>en</strong> ev<strong>en</strong>ts. We gebruiker er e<strong>en</strong>: het Change ev<strong>en</strong>t. Dit treedt op telk<strong>en</strong>s wanneer<br />
er iets aangepast wordt in het werkblad. U kunt deze gebeurt<strong>en</strong>is b<strong>en</strong>utt<strong>en</strong> om<br />
e<strong>en</strong> controle uit te voer<strong>en</strong> op datg<strong>en</strong>e wat ingevoerd wordt. Om nu te voorkom<strong>en</strong> dat<br />
de programmacode telk<strong>en</strong>s maar uitgevoerd wordt, wordt in e<strong>en</strong> parameter het bereik<br />
meegegev<strong>en</strong> dat gewijzigd werd. Op dat bereik kunt u nu e<strong>en</strong> test uitvoer<strong>en</strong> om te zi<strong>en</strong><br />
of er e<strong>en</strong> wijziging is geweest waarvoor de programmacode geldig is.<br />
Oef<strong>en</strong>ing 11.8<br />
Ev<strong>en</strong>ts van andere object<strong>en</strong><br />
1 Voeg e<strong>en</strong> leeg werkblad toe.<br />
281
MACRO’S EN VBA IN EXCEL de basis<br />
2 Noem het werkblad op de werkbladtab Gebeurt<strong>en</strong>iss<strong>en</strong>.<br />
3 Zet in cel B3 de tekst Postcode.<br />
4 Geef cel B4 de naam Postcode.<br />
5 Ga naar de VBA-editor.<br />
6 Zoek in de Projectverk<strong>en</strong>ner het blad Gebeurt<strong>en</strong>iss<strong>en</strong> op <strong>en</strong> dubbelklik erop.<br />
7 Selecteer in het vak Object in plaats van (Algeme<strong>en</strong>) het blad, Worksheet; zie afbeelding 11.12.<br />
8 Selecteer in het vak Procedures het ev<strong>en</strong>t Change; zie afbeelding 11.13.<br />
Afbeelding 11.12<br />
Selecteer het werkblad.<br />
Afbeelding 11.13<br />
En de juiste ev<strong>en</strong>tprocedure.<br />
9 De procedure wordt klaargezet <strong>en</strong> u ziet de parameter Target in het argum<strong>en</strong>t van de procedure<br />
gedefinieerd. Neem de volg<strong>en</strong>de programmacode over:<br />
C 'Declaraties<br />
Dim intT As Integer<br />
Dim blnFout As Boolean<br />
blnFout = False<br />
'Alle<strong>en</strong> als het e<strong>en</strong> cel betreft<br />
If Target.Rows.Count = 1 And Target.Columns.Count = 1 Th<strong>en</strong><br />
'Ga na of het de cel is met de postcode<br />
If Target = Range("Postcode") Th<strong>en</strong><br />
'Zo ja, test de postcode<br />
If L<strong>en</strong>(Target.Value) 7 Th<strong>en</strong><br />
blnFout = True<br />
Else<br />
'Ga na of de eerste vier cijfers zijn<br />
282
11 <strong>Besturingselem<strong>en</strong>t<strong>en</strong></strong> <strong>en</strong> formulier<strong>en</strong><br />
For intT = 1 To 4<br />
If Mid(Target.Value, intT, 1) < 0 _<br />
Or Mid(Target.Value, intT, 1) > 9 Th<strong>en</strong><br />
blnFout = True<br />
End If<br />
Next<br />
'Dan e<strong>en</strong> spatie<br />
If Mid(Target.Value, 5, 1) " " Th<strong>en</strong><br />
blnFout = True<br />
End If<br />
'Rechter twee moet<strong>en</strong> letters zijn<br />
For intT = 6 To 7<br />
If Mid(Target.Value, intT, 1) < A _<br />
And Mid(Target.Value, intT, 1) > Z Th<strong>en</strong><br />
blnFout = True<br />
End If<br />
Next<br />
End If<br />
End If<br />
If blnFout Th<strong>en</strong><br />
MsgBox "E<strong>en</strong> postcode bestaat uit 4 cijfers, " _<br />
& "e<strong>en</strong> spatie <strong>en</strong> twee letters!", _<br />
vbCritical Or vbOKOnly<br />
Target.Font.Color = vbRed<br />
Else<br />
'Alle<strong>en</strong> postcodecel mag gro<strong>en</strong> word<strong>en</strong><br />
If Target = Range("Postcode") Th<strong>en</strong><br />
Target.Font.Color = vbGre<strong>en</strong><br />
End If<br />
End If<br />
End If<br />
End Sub<br />
De verklar<strong>en</strong>de tekst in de code moet wel g<strong>en</strong>oeg zijn om de werking te begrijp<strong>en</strong>. U ziet dat de<br />
parameter Target eig<strong>en</strong>lijk e<strong>en</strong> Range object mee krijgt vanuit het werkblad <strong>en</strong> dat dit object<br />
dezelfde method<strong>en</strong> <strong>en</strong> eig<strong>en</strong>schapp<strong>en</strong> heeft als het normale object Range.<br />
Met e<strong>en</strong> eerste If clausule wordt gecontroleerd of het om slechts e<strong>en</strong> cel gaat <strong>en</strong> met de tweede<br />
If-clause wordt er gekek<strong>en</strong> of het range object in Target gelijk is aan de cel met de naam<br />
Postcode. Alle<strong>en</strong> dan wordt de rest van de procedure uitgevoerd.<br />
10 Ga terug naar het werkblad <strong>en</strong> voer e<strong>en</strong> correcte postcode in. De tekst in de cel wordt onmiddellijk<br />
in gro<strong>en</strong> weergegev<strong>en</strong> als de invoer bevestigd wordt met Enter.<br />
11 Voer in e<strong>en</strong> andere cel iets in. Er gebeurt niets.<br />
283
MACRO’S EN VBA IN EXCEL de basis<br />
12 Voer in B4 e<strong>en</strong> foutieve postcode in. De<br />
procedure reageert met e<strong>en</strong> messagebox;<br />
zie afbeelding 11.14.<br />
13 Klik de messagebox weg <strong>en</strong> merk op dat<br />
de tekst in de cel in rood wordt weergegev<strong>en</strong>.<br />
OPMERKING<br />
Wees erop verdacht dat als de knop Ontwerpmodus<br />
op de werkbalk is ingedrukt, de ev<strong>en</strong>ts<br />
van het werkblad onderdrukt word<strong>en</strong> <strong>en</strong> er<br />
niets zal gebeur<strong>en</strong>!<br />
Afbeelding 11.14<br />
Het ev<strong>en</strong>t is getriggerd <strong>en</strong> de procedure is in werking.<br />
11.2.6 Combobox<br />
E<strong>en</strong> laatste voorbeeld van ev<strong>en</strong>ts van andere object<strong>en</strong> gebruik<strong>en</strong> we om e<strong>en</strong> keuzelijst<br />
met invoervak (combobox) van inhoud te voorzi<strong>en</strong>. U zou ook e<strong>en</strong> gewone keuzelijst<br />
(listbox) op dezelfde manier kunn<strong>en</strong> gebruik<strong>en</strong>, maar het aardige van e<strong>en</strong> combobox<br />
is dat de gebruiker de lijst kan uitbreid<strong>en</strong>. De uitgebreide lijst blijft echter alle<strong>en</strong> maar<br />
bestaan zolang de werkmap geop<strong>en</strong>d is. Bij het afsluit<strong>en</strong> van de werkmap of ev<strong>en</strong>tueel<br />
zelfs bij het activer<strong>en</strong> van e<strong>en</strong> ander werkblad in de map, moet de inhoud van de combobox<br />
erg<strong>en</strong>s word<strong>en</strong> vastgelegd.<br />
Dat kunt u overal do<strong>en</strong>: in e<strong>en</strong> bestand op de vaste schijf, in e<strong>en</strong> andere werkmap, e<strong>en</strong><br />
ander werkblad of om het simpel te houd<strong>en</strong> - zoals we hier zull<strong>en</strong> do<strong>en</strong> - in hetzelfde<br />
werkblad.<br />
284
11 <strong>Besturingselem<strong>en</strong>t<strong>en</strong></strong> <strong>en</strong> formulier<strong>en</strong><br />
Afbeelding 11.15<br />
Uitbreiding in het werkblad.<br />
Oef<strong>en</strong>ing 11.9<br />
Ev<strong>en</strong>ts van andere object<strong>en</strong><br />
1 Breidt het werkblad uit met hetge<strong>en</strong> u in afbeelding 11.15 ziet.<br />
2 I3 heeft de naam Plaatsnam<strong>en</strong>.<br />
3 De (Name) property van de combobox is cmdPlaatsnam<strong>en</strong>. Stel deze eig<strong>en</strong>schap in door de<br />
combobox te selecter<strong>en</strong> <strong>en</strong> in het snelm<strong>en</strong>u voor Eig<strong>en</strong>schapp<strong>en</strong> te kiez<strong>en</strong>.<br />
4 Ga naar de VBA-editor <strong>en</strong> selecteer in het Projectv<strong>en</strong>ster het werkblad waar de combobox in<br />
getek<strong>en</strong>d is.<br />
5 Kies in het v<strong>en</strong>ster Object het werkblad, Worksheet.<br />
6 Kies in het vak Procedure het Activate ev<strong>en</strong>t <strong>en</strong> neem de volg<strong>en</strong>de macro over:<br />
C Private Sub Worksheet_Activate()<br />
'Declaraties<br />
Dim intAR As Integer 'Aantal rij<strong>en</strong><br />
285
MACRO’S EN VBA IN EXCEL de basis<br />
'Zoek het aantal rij<strong>en</strong> onder plaatsnam<strong>en</strong><br />
Range("Plaatsnam<strong>en</strong>").Select<br />
intAR = ActiveCell.Curr<strong>en</strong>tRegion.Rows.Count<br />
'Maak de combobox leeg<br />
cmbPlaatsnam<strong>en</strong>.Clear<br />
For intT = 1 To intAR - 1<br />
cmbPlaatsnam<strong>en</strong>.AddItem Range("Plaatsnam<strong>en</strong>").Offset(intT, 0).Value<br />
Next<br />
cmbPlaatsnam<strong>en</strong>.Text = "Kies de plaats"<br />
End Sub<br />
De cel met de naam Plaatsnam<strong>en</strong> wordt in de macro geselecteerd. Vervolg<strong>en</strong>s wordt het aantal<br />
rij<strong>en</strong> in het huidige gebied opgevraagd. In e<strong>en</strong> For… Next-lus wordt elke plaatsnaam toegevoegd<br />
aan de combobox met de methode AddItem. Tot slot wordt e<strong>en</strong> tekst met e<strong>en</strong> aanwijzing<br />
voor de gebruiker toegevoegd aan het tekstvak in de box. Het toevoeg<strong>en</strong> van items aan e<strong>en</strong><br />
listbox werkt net zo.<br />
7 Selecteer e<strong>en</strong> ander werkblad <strong>en</strong> selecteer vervolg<strong>en</strong>s dit werkblad weer. Hierdoor wordt de<br />
lijst gevuld met de plaatsnam<strong>en</strong> die in het werkblad staan.<br />
8 Selecteer in het vak Object in de VBA-editor cmbPlaatsnam<strong>en</strong>.<br />
9 Selecteer in vak Procedures het ev<strong>en</strong>t Keydown. Neem daarin de volg<strong>en</strong>de procedure over:<br />
C Private Sub cmbPlaatsnam<strong>en</strong>_KeyDown(ByVal KeyCode _<br />
As MSForms.ReturnInteger, ByVal Shift As Integer)<br />
If KeyCode = vbKeyReturn Th<strong>en</strong><br />
cmbPlaatsnam<strong>en</strong>.AddItem cmbPlaatsnam<strong>en</strong>.Text<br />
Range("Plaatsnam<strong>en</strong>").Select<br />
Selection.End(xlDown).Select<br />
ActiveCell.Offset(1, 0).Select<br />
ActiveCell.Value = cmbPlaatsnam<strong>en</strong>.Text<br />
cmbPlaatsnam<strong>en</strong>.Text = ""<br />
End If<br />
End Sub<br />
VBA heeft e<strong>en</strong> groot aantal Keycode constants. Deze constant<strong>en</strong> waarvan u er hier één ziet, kunt u<br />
in dit ev<strong>en</strong>t gebruik<strong>en</strong> om toets<strong>en</strong> te detecter<strong>en</strong> zoals Backspace, Enter, functietoets<strong>en</strong> of bijvoorbeeld<br />
Shift, Alt, etcetera. Als u iets met de normale letter <strong>en</strong> cijfertoets<strong>en</strong> van het toets<strong>en</strong>bord wilt<br />
do<strong>en</strong>, kunt u beter het Keypress-ev<strong>en</strong>t daarvoor gebruik<strong>en</strong>.<br />
Wat will<strong>en</strong> we hier? We will<strong>en</strong> dat als de gebruiker in het tekstvak van de combobox e<strong>en</strong> naam typt<br />
<strong>en</strong> op de Enter-toets drukt, deze wordt toegevoegd aan de lijst in de combobox <strong>en</strong> óók aan de lijst<br />
in het werkblad. De combobox heeft als eig<strong>en</strong>schap dat de lijst uitgebreid kan word<strong>en</strong>, maar dan<br />
moet die lijst wel erg<strong>en</strong>s vastgelegd kunn<strong>en</strong> word<strong>en</strong>.<br />
286
11 <strong>Besturingselem<strong>en</strong>t<strong>en</strong></strong> <strong>en</strong> formulier<strong>en</strong><br />
NUMMER ÉÉN IS SOMS NUMMER NUL<br />
Het is in VBA soms verwarr<strong>en</strong>d welk nummer het eerste item eig<strong>en</strong>lijk heeft. Vanuit onze<br />
m<strong>en</strong>selijke optiek is het eerste item altijd nummer één. Bij lijst<strong>en</strong> is dat niet zo. Het eerste<br />
item heeft in dat geval volgnummer nul. ComboBox.Item(0) is dus het eerste nummer uit de<br />
lijst. Wanneer we echter vrag<strong>en</strong> hoeveel items er in e<strong>en</strong> lijst staan met de Count methode,<br />
dan krijg<strong>en</strong> we bijvoorbeeld als antwoord ti<strong>en</strong>. Dat betek<strong>en</strong>t echter dat het laatste nummer<br />
volgnummer neg<strong>en</strong> heeft <strong>en</strong> niet ti<strong>en</strong> omdat er immers bij nul wordt begonn<strong>en</strong> met tell<strong>en</strong>. Met<br />
de Offset-methode in VBA is net zoiets aan de hand. OffSet(0, 0) is de huidige cel. Om die<br />
red<strong>en</strong> begint de lus in de voorgaande procedure bij 1 (omdat de tekst Plaatsnam<strong>en</strong> op de nulpositie<br />
staat <strong>en</strong> dat will<strong>en</strong> we niet in de combobox hebb<strong>en</strong>. De lus loopt derhalve ook tot AR<br />
– 1 in de Curr<strong>en</strong>tRegion.<br />
Als u programmeert in VBA is het mogelijk bov<strong>en</strong>aan in e<strong>en</strong> module nog voor de eerste procedure<br />
Option Base 1 op te nem<strong>en</strong>. Dat betek<strong>en</strong>t dat VBA standaard zal gaan tell<strong>en</strong> vanaf<br />
e<strong>en</strong> <strong>en</strong> niet vanaf nul. Dit is vooral van belang bij het werk<strong>en</strong> met arrays. Dit zijn tabell<strong>en</strong> met<br />
gegev<strong>en</strong>s in het geheug<strong>en</strong> van de pc, waarbij standaard ook het eerste elem<strong>en</strong>t in zo’n tabel<br />
volgnummer nul krijgt, maar met Option Base 1 e<strong>en</strong> ’m<strong>en</strong>selijke‘ één. Helaas heeft dat ge<strong>en</strong><br />
<strong>en</strong>kele invloed op lijst<strong>en</strong> <strong>en</strong> andere elem<strong>en</strong>t<strong>en</strong>. Option Base of niet; daarbinn<strong>en</strong> wordt gewoon<br />
geteld vanaf nul. Daarom lat<strong>en</strong> we het meestal maar achterwege omdat het de verwarring<br />
vaak alle<strong>en</strong> maar groter maakt <strong>en</strong> daardoor lastig te debugg<strong>en</strong> is. De beste tip die we u kunn<strong>en</strong><br />
gev<strong>en</strong>, is gewoon e<strong>en</strong> macro stap voor stap uitvoer<strong>en</strong> met slechts <strong>en</strong>kele gegev<strong>en</strong>s in<br />
lijst<strong>en</strong>, in het werkblad <strong>en</strong> in comboboxes <strong>en</strong> dergelijke <strong>en</strong> goed controler<strong>en</strong> welke waarde<br />
telvariabel<strong>en</strong> moet<strong>en</strong> hebb<strong>en</strong>.<br />
10 Vervolg<strong>en</strong>s moet e<strong>en</strong> door de gebruiker geselecteerde plaatsnaam erg<strong>en</strong>s in het werkblad geplaatst<br />
word<strong>en</strong>. Hiervoor gebruik<strong>en</strong> we het Click-ev<strong>en</strong>t van de combobox. Zoek dit op <strong>en</strong> neem<br />
de volg<strong>en</strong>de code op:<br />
Private Sub cmbPlaatsnam<strong>en</strong>_Click()<br />
Range("D5").Value = cmbPlaatsnam<strong>en</strong>.Text<br />
End Sub<br />
Dit ziet er erg e<strong>en</strong>voudig uit <strong>en</strong> dat ís het ook.<br />
11 Tot slot moet<strong>en</strong> we er steeds rek<strong>en</strong>ing mee houd<strong>en</strong> dat de gebruiker nam<strong>en</strong> heeft toegevoegd<br />
<strong>en</strong> dat deze nam<strong>en</strong> vastgelegd moet<strong>en</strong> word<strong>en</strong>. We légg<strong>en</strong> ze al vast in het werkblad, maar als<br />
de gebruiker de werkmap niet opslaat, gaan de toegevoegde gegev<strong>en</strong>s alsnog verlor<strong>en</strong>. Wij<br />
slaan de map dus steeds op <strong>en</strong> we zull<strong>en</strong> daarvoor het Deactivate ev<strong>en</strong>t van het Worksheet<br />
gebruik<strong>en</strong>:<br />
Private Sub Worksheet_Deactivate()<br />
Workbooks(ThisWorkbook.Name).Save<br />
End Sub<br />
287
MACRO’S EN VBA IN EXCEL de basis<br />
Dus telk<strong>en</strong>s wanneer e<strong>en</strong> ander werkblad in de map geselecteerd wordt, wordt de hele werkmap<br />
automatisch opgeslag<strong>en</strong>. Als u dit onw<strong>en</strong>selijk vindt, kunt u de gebruiker natuurlijk om<br />
toestemming vrag<strong>en</strong>. Wijs dan wel netjes op de consequ<strong>en</strong>ties als hij of zij ervoor kiez<strong>en</strong> om de<br />
map niet op te slaan.<br />
Opdracht 11.1<br />
Probleem oploss<strong>en</strong><br />
Er zit nog e<strong>en</strong> klein probleempje in deze macro’s. Selecteert u het werkblad waar de combobox<br />
in staat maar e<strong>en</strong>s <strong>en</strong> sla vervolg<strong>en</strong>s de werkmap op via het m<strong>en</strong>u Bestand. Sluit de werkmap <strong>en</strong><br />
op<strong>en</strong> deze opnieuw. De combobox blijft nu leeg <strong>en</strong> wordt pas gevuld als u eerst e<strong>en</strong> ander werkblad<br />
op<strong>en</strong>t <strong>en</strong> vervolg<strong>en</strong>s weer het werkblad met de combobox selecteert. Los dit op! Er zijn <strong>en</strong>kele<br />
oplossing<strong>en</strong> waarvan u er e<strong>en</strong> aan het eind van dit hoofdstuk aantreft.<br />
Opdracht 11.2<br />
Lijst sorter<strong>en</strong><br />
Het zou wel fijn zijn als de lijst met plaatsnam<strong>en</strong> gesorteerd werd, want dan wordt deze ook gesorteerd<br />
in de combobox weergegev<strong>en</strong>. Misschi<strong>en</strong> hebt u e<strong>en</strong> idee hoe dat te do<strong>en</strong>?<br />
11.3 User forms<br />
User forms zijn formulier<strong>en</strong> die door de gebruiker ontworp<strong>en</strong> word<strong>en</strong>. U zou hiervoor<br />
ook de term dialoogv<strong>en</strong>sters kunn<strong>en</strong> gebruik<strong>en</strong>, want e<strong>en</strong> formulier is niets anders dan<br />
e<strong>en</strong> dialoogv<strong>en</strong>ster waar u net zoveel besturingselem<strong>en</strong>t<strong>en</strong> op kwijt kunt als u maar<br />
wilt. Er is natuurlijk wel e<strong>en</strong> praktische gr<strong>en</strong>s aan het aantal, vanwege de beschikbare<br />
ruimte op het beeldscherm. E<strong>en</strong> userform heeft <strong>en</strong>kele belangrijke method<strong>en</strong> <strong>en</strong> eig<strong>en</strong>schapp<strong>en</strong>.<br />
We zett<strong>en</strong> ze op e<strong>en</strong> rijtje in tabel 11.7.<br />
Tabel 11.7<br />
Eig<strong>en</strong>schap<br />
(Name)<br />
Caption<br />
Enabled<br />
Height<br />
Left<br />
Eig<strong>en</strong>schapp<strong>en</strong> <strong>en</strong> method<strong>en</strong> van e<strong>en</strong> userform<br />
Omschrijving<br />
De naam waaronder het userform in de programmacode kan word<strong>en</strong> herk<strong>en</strong>d <strong>en</strong> aangesprok<strong>en</strong>.<br />
De tekst in de titelbalk van het formulier.<br />
De waarde True houdt in dat het formulier actief is <strong>en</strong> gebruikt kan word<strong>en</strong>, bij False is<br />
dat niet het geval. E<strong>en</strong> handige manier om e<strong>en</strong> formulier ev<strong>en</strong> buit<strong>en</strong> werking te stell<strong>en</strong>.<br />
De hoogte van het formulier.<br />
De afstand tot de bov<strong>en</strong>zijde van het scherm.<br />
288
11 <strong>Besturingselem<strong>en</strong>t<strong>en</strong></strong> <strong>en</strong> formulier<strong>en</strong><br />
Eig<strong>en</strong>schap<br />
ShowModal<br />
StartUpPosition<br />
Top<br />
Width<br />
Methode<br />
Load<br />
Hide<br />
PrintForm<br />
Show<br />
Unload<br />
Omschrijving<br />
Deze eig<strong>en</strong>schap kan alle<strong>en</strong> ingesteld word<strong>en</strong> zolang het formulier niet gelad<strong>en</strong> is,<br />
daarna is het e<strong>en</strong> alle<strong>en</strong>-lez<strong>en</strong> eig<strong>en</strong>schap. E<strong>en</strong> modaal formulier (True) moet eerst<br />
ingevuld <strong>en</strong> geslot<strong>en</strong> word<strong>en</strong> voordat de gebruiker verder kan. Voor e<strong>en</strong> non-modaal<br />
formulier (False) geldt dat niet.<br />
Deze eig<strong>en</strong>schap bepaalt waar het formulier op het scherm verschijnt. Met Manual<br />
bepaalt u zelf met behulp van de eig<strong>en</strong>schapp<strong>en</strong> Top <strong>en</strong> Left de positie. C<strong>en</strong>terOwner<br />
betek<strong>en</strong>t gec<strong>en</strong>treerd t<strong>en</strong> opzichte van de eig<strong>en</strong>aar (in dit geval de werkmap waartoe het<br />
formulier behoort), C<strong>en</strong>terScre<strong>en</strong> is midd<strong>en</strong> op het beeldscherm <strong>en</strong> WindowsDefault is<br />
meestal in de linker bov<strong>en</strong>hoek van het scherm.<br />
Zie Left.<br />
De breedte van het formulier.<br />
Omschrijving<br />
Het formulier wordt alle<strong>en</strong> in het geheug<strong>en</strong> gelad<strong>en</strong>, maar wordt niet zichtbaar.<br />
Het formulier wordt verborg<strong>en</strong>, maar blijft wel in het geheug<strong>en</strong>.<br />
E<strong>en</strong> handige methode om de totale inhoud van e<strong>en</strong> formulier af te drukk<strong>en</strong>.<br />
Met deze methode wordt het formulier in het geheug<strong>en</strong> gelad<strong>en</strong> als het nog niet is<br />
gelad<strong>en</strong>. Daarna wordt het op het scherm getoond.<br />
Het formulier wordt uit het geheug<strong>en</strong> verwijderd.<br />
Oef<strong>en</strong>ing 11.10 User form<br />
1 Zorg voor e<strong>en</strong> nieuw werkblad met daarin e<strong>en</strong> e<strong>en</strong>voudige database bestaande uit e<strong>en</strong> kolom<br />
voor nam<strong>en</strong> <strong>en</strong> e<strong>en</strong> kolom voor telefoonnummers.<br />
2 Voeg e<strong>en</strong> knop Naam toevoeg<strong>en</strong> toe.<br />
3 Ga naar de VBA-editor <strong>en</strong> kies in het m<strong>en</strong>u Invoeg<strong>en</strong>, User form.<br />
4 Er wordt e<strong>en</strong> leeg formulier toegevoegd <strong>en</strong> e<strong>en</strong> werkbalk Werkset; zie afbeelding 11.17. Deze<br />
werkset is vergelijkbaar met die u bij het tek<strong>en</strong><strong>en</strong> van besturingselem<strong>en</strong>t<strong>en</strong> in e<strong>en</strong> Excel-werkblad<br />
hebt gezi<strong>en</strong>.<br />
5 Tek<strong>en</strong> twee labels, twee tekstvakk<strong>en</strong> <strong>en</strong> twee knopp<strong>en</strong>; zie afbeelding 11.17.<br />
6 Pas de captions van de beide labels aan, in afbeelding 11.18 ziet u hoe dat voor het tweede<br />
label wordt uitgevoerd.<br />
7 De overige gegev<strong>en</strong>s ziet u in de volg<strong>en</strong>de tabel, terwijl afbeelding 11.19 het aangepaste formulier<br />
toont op het mom<strong>en</strong>t dat net in de eig<strong>en</strong>schapp<strong>en</strong>lijst de Caption van het formulier wordt<br />
ingevuld. Ook e<strong>en</strong> formulier heeft e<strong>en</strong> opschrift; dat is namelijk de tekst in de titelbalk.<br />
289
MACRO’S EN VBA IN EXCEL de basis<br />
Afbeelding 11.16<br />
E<strong>en</strong> userform is toegevoegd.<br />
Tabel 11.8<br />
De eig<strong>en</strong>schapp<strong>en</strong> van het formulier<br />
Besturingselem<strong>en</strong>t Eig<strong>en</strong>schap Instelling<br />
Label1 (Name) Label1<br />
Caption<br />
Naam:<br />
Label2 (Name) Label2<br />
Caption<br />
Telefoonnummer:<br />
Textbox1 (Name) txtNaam<br />
Txtbox2 (Name) txtTelNum<br />
Commandbutton1 (Name) cmdOK<br />
Caption<br />
OK<br />
Commandbutton2 (Name) cmdAnnuler<strong>en</strong><br />
Caption<br />
Annuler<strong>en</strong><br />
UserForm1 (Name) frmNT<br />
Caption<br />
Invoer naam <strong>en</strong> telefoonnummer<br />
290
11 <strong>Besturingselem<strong>en</strong>t<strong>en</strong></strong> <strong>en</strong> formulier<strong>en</strong><br />
Afbeelding 11.17<br />
De besturingselem<strong>en</strong>t<strong>en</strong> word<strong>en</strong> getek<strong>en</strong>d.<br />
Afbeelding 11.18<br />
E<strong>en</strong> userform is toegevoegd.<br />
291
MACRO’S EN VBA IN EXCEL de basis<br />
De niet-g<strong>en</strong>oemde properties houd<strong>en</strong> hun standaard waarde (default).<br />
Afbeelding 11.19<br />
De Caption (=titelbalk) van het formulier wordt ingevuld.<br />
11.3.1 Het formulier ton<strong>en</strong><br />
Er zijn verschill<strong>en</strong>de manier om met het formulier te werk<strong>en</strong>:<br />
U kunt het eerst in het geheug<strong>en</strong> lad<strong>en</strong> met Load frmFormName. Dit heeft als voordeel<br />
dat ingewikkelde formulier<strong>en</strong> of formulier<strong>en</strong> met netwerkkoppeling<strong>en</strong> op de<br />
achtergrond gelad<strong>en</strong> kunn<strong>en</strong> word<strong>en</strong> zonder dat gebruikers hier hinder van ondervind<strong>en</strong>.<br />
Op het mom<strong>en</strong>t dat we het formulier nodig hebb<strong>en</strong>, gebruik<strong>en</strong> we de<br />
Show-methode.<br />
Het is ook mogelijk het formulier direct op het scherm te zett<strong>en</strong> met de Show-methode.<br />
Als het formulier op dat mom<strong>en</strong>t nog niet is gelad<strong>en</strong>, zal het alsnog automatisch<br />
in het geheug<strong>en</strong> word<strong>en</strong> gelad<strong>en</strong>. Met e<strong>en</strong> e<strong>en</strong>voudig formulier zoals we hier<br />
hebb<strong>en</strong> behandeld is dat de aanbevol<strong>en</strong> methode.<br />
Als het formulier ev<strong>en</strong> niet nodig is, kunt u het verberg<strong>en</strong> met de Hide-methode.<br />
Het blijft dan wél in het geheug<strong>en</strong> gelad<strong>en</strong>.<br />
Met Unload frmFormName kunt u het hele formulier uit het geheug<strong>en</strong> verwijder<strong>en</strong>.<br />
Als het vaak nodig is <strong>en</strong> e<strong>en</strong> ingewikkeld formulier betreft, is dit niet aan te rad<strong>en</strong>.<br />
E<strong>en</strong> verborg<strong>en</strong> formulier is wel toegankelijk vanuit de programmacode, ev<strong>en</strong>als alle<br />
besturingselem<strong>en</strong>t<strong>en</strong> daarop. U kunt dus eerst al van alles invull<strong>en</strong> <strong>en</strong> klaarzett<strong>en</strong>,<br />
voordat u het formulier toont.<br />
Het is mogelijk in e<strong>en</strong> van de ’opstartev<strong>en</strong>ts‘ van werkmap of blad het formulier te<br />
292
11 <strong>Besturingselem<strong>en</strong>t<strong>en</strong></strong> <strong>en</strong> formulier<strong>en</strong><br />
lad<strong>en</strong>, maar u kunt het ook gewoon aan e<strong>en</strong> macro koppel<strong>en</strong> die met e<strong>en</strong> toets of<br />
e<strong>en</strong> knop of m<strong>en</strong>uopdracht wordt gestart.<br />
11.3.2 Programmacode voor het formulier<br />
Als u in de Projectverk<strong>en</strong>ner kijkt, dan ziet u dat het formulier onder e<strong>en</strong> apart kopje<br />
Formulier<strong>en</strong> is toegevoegd aan de werkmap. Dubbelklikk<strong>en</strong> op de vermelding in de<br />
Projectverk<strong>en</strong>ner op<strong>en</strong>t slechts het formulier zelf <strong>en</strong> niet het bijbehor<strong>en</strong>de codev<strong>en</strong>ster.<br />
Daarvoor zijn twee manier<strong>en</strong>:<br />
Kies in het snelm<strong>en</strong>u Programmacode weergev<strong>en</strong>, zoals in afbeelding 11.20 te zi<strong>en</strong><br />
is;<br />
Of dubbelklik erg<strong>en</strong>s in het formulier. Dubbelklikt u op e<strong>en</strong> besturingselem<strong>en</strong>t in<br />
het formulier, dan ziet u ook de code <strong>en</strong> wordt onmiddellijk het standaard ev<strong>en</strong>t<br />
van dat besturingselem<strong>en</strong>t afgehandeld.<br />
Afbeelding 11.20<br />
Programmacode vind<strong>en</strong> bij het formulier.<br />
11.3.3 Programmacode aan het formulier toevoeg<strong>en</strong><br />
U weet inmiddels hoe u de diverse object<strong>en</strong> <strong>en</strong> de bijbehor<strong>en</strong>de ev<strong>en</strong>ts kunt vind<strong>en</strong>.<br />
We behandel<strong>en</strong> nog ev<strong>en</strong> alle programmacode bij de beide knopp<strong>en</strong> in dit formulier.<br />
293
MACRO’S EN VBA IN EXCEL de basis<br />
C Private Sub cmdAnnuler<strong>en</strong>_Click()<br />
If L<strong>en</strong>(txtNaam.Text) > 0 Or L<strong>en</strong>(txtTelNum.Text) > 0 Th<strong>en</strong><br />
If MsgBox("Er staan nog gegev<strong>en</strong>s in het formulier" _<br />
& vbCrLf & "Wilt u deze bewar<strong>en</strong>?", _<br />
vbYesNo Or vbQuestion) = vbYes Th<strong>en</strong><br />
Exit Sub<br />
End If<br />
End If<br />
Unload frmNT<br />
End Sub<br />
Als er op de Annuler<strong>en</strong>-knop wordt geklikt, dan zal eerst word<strong>en</strong> gecontroleerd of er<br />
nog iets in e<strong>en</strong> van beide tekstvakk<strong>en</strong> staat. Is dat het geval, dan wordt de gebruiker de<br />
vraag voorgeschoteld of de inhoud van het formulier moet word<strong>en</strong> bewaard. Klikt de<br />
gebruiker op de Ja-knop, dan wordt de procedure verlat<strong>en</strong>. Bij e<strong>en</strong> Nee moet met Unload<br />
frmNT het formulier uit het geheug<strong>en</strong> word<strong>en</strong> verwijderd.<br />
C Private Sub cmdOK_Click()<br />
'Declaraties<br />
Dim blnFout As Boolean<br />
If L<strong>en</strong>(txtNaam.Text) = 0 Or L<strong>en</strong>(txtTelNum.Text) = 0 Th<strong>en</strong><br />
blnFout = True<br />
End If<br />
'Br<strong>en</strong>g gegev<strong>en</strong>s over naar werkblad<br />
If Not (blnFout) Th<strong>en</strong><br />
Workbooks("v-11.xls").Worksheets("NaamTelNum").Select<br />
Range("A65536").End(xlUp).Select<br />
'Ga e<strong>en</strong> rij omlaag<br />
ActiveCell.Offset(1, 0).Select<br />
'Vul de naam in<br />
ActiveCell.Value = txtNaam.Text<br />
'Ga e<strong>en</strong> kolom naar rechts<br />
ActiveCell.Offset(0, 1).Select<br />
'Vul het telefoonnummer in<br />
ActiveCell.Value = txtTelNum.Text<br />
Range("NaamTelNum").Select<br />
txtNaam.Text = ""<br />
txtTelNum.Text = ""<br />
txtNaam.SetFocus<br />
End If<br />
End Sub<br />
Wordt op de OK-knop geklikt, dan wordt ook weer gecontroleerd of er wel iets in de<br />
tekstvakk<strong>en</strong> staat. Als deze leeg zoud<strong>en</strong> zijn, dan zou de integriteit van onze ’database‘<br />
in het gevaar kom<strong>en</strong>, omdat er dan e<strong>en</strong> leeg veld zou word<strong>en</strong> toegevoegd. U kunt<br />
natuurlijk veel uitgebreidere controles inbouw<strong>en</strong>! Staat er iets in e<strong>en</strong> van beide tekst-<br />
294
11 <strong>Besturingselem<strong>en</strong>t<strong>en</strong></strong> <strong>en</strong> formulier<strong>en</strong><br />
vakk<strong>en</strong>, dan wordt de informatie aan de lijst toegevoegd op dezelfde manier zoals in<br />
hoofdstuk 9 al uitgebreid is doorg<strong>en</strong>om<strong>en</strong>. U ziet dat aan het eind van de procedure de<br />
beide tekstvakk<strong>en</strong> leeg gemaakt word<strong>en</strong> <strong>en</strong> de cursor weer in het naamvak geplaatst<br />
wordt met txtNaam.SetFocus.<br />
C Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)<br />
If CloseMode = vbFormControlM<strong>en</strong>u Th<strong>en</strong><br />
MsgBox "U kunt dit formulier alle<strong>en</strong> sluit<strong>en</strong> met de Annuler<strong>en</strong>-knop",<br />
_<br />
vbOKOnly Or vbInformation<br />
Cancel = True<br />
End If<br />
End Sub<br />
Elk formulier heeft net zoals alle andere Windows-v<strong>en</strong>sters e<strong>en</strong> pictogram Sluit<strong>en</strong> in<br />
de rechter bov<strong>en</strong>hoek. Als u niet wilt dat de gebruiker hiermee het v<strong>en</strong>ster kan sluit<strong>en</strong>,<br />
kunt u dat verhinder<strong>en</strong> door de Cancel-parameter op True te zett<strong>en</strong>. Hiermee geeft u<br />
het besturingssysteem e<strong>en</strong> seintje dat het formulier niet opgeruimd mag word<strong>en</strong>.<br />
Opdracht 11.3<br />
1 Waar zou u e<strong>en</strong> controle inbouw<strong>en</strong> op e<strong>en</strong> correcte invoer van e<strong>en</strong> tekstvak? U kunt bij het telefoonnummer<br />
d<strong>en</strong>k<strong>en</strong> aan e<strong>en</strong> beperking van de invoer tot cijfers <strong>en</strong> e<strong>en</strong> ligg<strong>en</strong>d streepje.<br />
2 Bouw zo’n controle in.<br />
11.4 Oplossing opdracht 11.1<br />
Hoewel u in het ev<strong>en</strong>t Workbook_Op<strong>en</strong> natuurlijk de combobox net zo kunt vull<strong>en</strong><br />
als dat in het ev<strong>en</strong>t Worksheet_Activate gebeurde waarbij wel de naam van het werkblad<br />
toegevoegd moet word<strong>en</strong>, kan het ook op e<strong>en</strong> elegante manier zonder twee keer<br />
hetzelfde te moet<strong>en</strong> programmer<strong>en</strong>. We wet<strong>en</strong> dat als e<strong>en</strong> procedure b<strong>en</strong>oemd wordt<br />
met het woord Private, dat die procedure alle<strong>en</strong> herk<strong>en</strong>baar is binn<strong>en</strong> het werkblad of<br />
de module waar ze in is opgeslag<strong>en</strong>. Als u in het blad Gebeurt<strong>en</strong>iss<strong>en</strong> Private Sub<br />
Worksheet_Activate() wijzigt in Public Sub Worksheet_Activate(), is de procedure<br />
ine<strong>en</strong>s in alle werkblad<strong>en</strong> <strong>en</strong> -mapp<strong>en</strong> herk<strong>en</strong>baar.<br />
Het Workbook_Op<strong>en</strong> ev<strong>en</strong>t wordt dan:<br />
C Private Sub Workbook_Op<strong>en</strong>()<br />
With Worksheets("Gebeurt<strong>en</strong>iss<strong>en</strong>")<br />
.Select<br />
.Worksheet_Activate<br />
End With<br />
End Sub<br />
295