You are on page 1of 193

Programmeren in Excel VBA

beginners
Karel Nijs
2010/09

Leswijze
Eerst wat theorie
Begeleid met (korte) oefeningen
Ms Excel 2003

Online hulp:

http://www.ozgrid.com/VBA/
http://msdn.microsoft.com/en-us/library/sh9ywfdk(vs.80).aspx
http://www.microsoft.com/technet/scriptcenter/topics/office/vba.mspx
http://www.kbcopenleren.be/

Offline hulp (op CD-ROM):


Boek "VBA voor Word, Excel en Access"
VBA-handleiding - vanuit Excel.doc

Korte pauze rond 20u

Doel van deze cursus

VBA leren gebruiken


zodat je bepaalde
repetitieve handelingen
in Ms Excel 2003
kan automatiseren

Wat heb je hiervoor nodig?

Weten hoe Excel werkt


Weten hoe Excel intern werkt
Macros kunnen opnemen
Beperkte programmeerkennis
Referentie: online of offline
Vermogen om te interpreteren en af te leiden
Gezond verstand

Programmeren in Excel VBA beginners

Visual Basic Intro


De Visual Basic Editor (VBE)
Debuggen in VBA
Macros
Programmeren in VBA
Het object Range
User Defined Functions
Werkmappen en werkbladen
Het object Application
Event macro's
Excel 2003 vs. 2007

Variabelen
Constanten
Operatoren
Selecties en iteraties
Arrays
Functies en subroutines

Programmeren in Excel VBA beginners les 1

Visual Basic Intro


De Visual Basic Editor (VBE)
Debuggen in VBA
Macros
Programmeren in VBA

Variabelen
Constanten
Operatoren
Selecties en iteraties

Visual Basic intro


Visual Basic for Applications (VBA)
Afgeleide van VB
Gn standalone taal, leeft bij host-applicatie
Voorbeeld hosts: Ms Office, Visio, AutoCAD, ...

Laat toe de host-applicatie aan te passen


Gebruiksgemak: codegeneratie mbv. macro's
Script-taal (gn compilatie)

Visual Basic intro

Visual Basic

Visual Basic for Applications

VBscript

Visual Basic intro


Source Code (HLL)
VB

VB

COMPILER

VBA

Native Code

INTERPRETER
HARDWARE

slide van Peter Demasure

Visual Basic intro


Subsets
VBA is een gelaagde programmeertaal
Basisfunctionaliteit is hetzelfde voor elke toepassing
Elke toepassing heeft deelverzameling van instructies en
mogelijkheden
Programmeren binnen de basislaag werkt in elke subset
Subset A code werkt niet automatisch in Subset B

Visual Basic intro


Subsets

Subset
Ms
Word

Subset
Ms
Excel
Subset
Ms
Access
VBA Basisfunctionaliteit
(Microsoft en anderen)

tekening uit boek "VBA voor Word, Excel en Access"

Subset
Subset
Product
Product
Y
X

subset
specifieke
code

uniforme
code

Visual Basic intro


Visual Basic for Applications: voordelen

Gebruiksgemak (tov. VB): code generatie mbv. macro's


Host-applicatie uitbreiden met niet-standaard mogelijkheden
Repetitief werk automatiseren
Vanuit n applicatie de andere besturen
Bv. Ms Word documenten aanmaken vanuit Ms Excel

Programmeren in Excel VBA beginners les 1

Visual Basic Intro


De Visual Basic Editor (VBE)
Debuggen in VBA
Macros
Programmeren in VBA

Variabelen
Constanten
Operatoren
Selecties en iteraties

De Visual Basic Editor (VBE)


Ontwikkelingsomgeving beschikbaar in elke subset
~ editor voor Visual Basic
De programmacode wordt opgeslagen bij je document
 net zoals bij macro's!
De VBE bevat alle hulpmiddelen voor programmatie

Objecten browser
Immediate window
Debugger
...

De Visual Basic Editor (VBE)

Demo - opstarten van de VBE:


1. Start Ms Excel
2. Toon de "Visual Basic" werkbalk

3. Docent geeft basisuitleg

Demo opstarten van de object browser

Demo het immediate window

De Visual Basic Editor (VBE)


Scopes:
Project
Bundeling van code
Scope = Werkblad
Bundeling van code
Scope = Werkboek
Bundeling van code
Scope = Project
Bv. module voor aansturing MindStorms

Functies en subroutines

Procedure
Procedures steken altijd in modules

ThisWorkBook en Bladx zijn eigenlijk ook modules!

Scope of toegang of aanroepbaarheid of

Public
Toegankelijk voor andere procedures buiten de module
Bv. procedure om robot te besturen

Private
Enkel toegankelijk voor andere procedures binnen de module
Code hiding
Bv. (interne) procedure om de snelheid te berekenen

De Visual Basic Editor (VBE)

De code:

Option Explicit

declaratie van variabelen vereist


procedure wordt opgeroepen bij elke save

Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, _


Cancel As Boolean)

variabele declaratie

Dim a As Boolean
a = MsgBox("Wil je cht opslaan?", vbYesNo)
If a = vbNo Then
Cancel = True
End If
End Sub

functie met terugkeerwaarde


conditie die de variabele "a" test
terugkeerwaarde opslaan

Programmeren in Excel VBA beginners les 1

Visual Basic Intro


De Visual Basic Editor (VBE)
Debuggen in VBA
Macros
Programmeren in VBA

Variabelen
Constanten
Operatoren
Selecties en iteraties

Debuggen in VBA
Verschillende methodes:
Immediate window
Debug.Print ...
Debug.Assert( statement )

Breakpoints
Door code stappen
Locals window
Watch window

Uitgebreide uitleg: http://www.cpearson.com/excel/Debug.htm

Debuggen in VBA
Het immediate window

Of ook het venster direct


Opstarten via Beeld > Venster direct
Rechtstreeks uitvoeren van commandos at design time
Tutorial: http://www.lynda.com/home/TutorialLanding.aspx?lpk4=68857

Debuggen in VBA
Debug.Print
Tekst afdrukken naar het Debug window
Enkel zichtbaar bij debuggen
Hindert verdere programmatie niet
Bv.
Debug.Print We beginnen met de lus

Debug.Assert( statement )
Evalueren van een statement
Code stopt met uitvoeren als statement niet klopt
Bv.
Dim X As Long
X = 123
Debug.Assert (X < 100)

Debuggen in VBA
Breakpoints
Uitvoeren code pauzeert wanneer breakpoint bereikt wordt
Vanaf dan kan je inspecteren en verder door de code stappen

Door code stappen


Vanaf een breakpoint
Gebruik van werkbalk: Beeld > Werkbalken > Foutopsporing

Debuggen in VBA
Locals window
Geeft alle variabelen van de huidige procedure + de globale
variabelen weer

Watch window
Inspecteren en opvolgen van variabelen

Programmeren in Excel VBA beginners les 1

Visual Basic Intro


De Visual Basic Editor (VBE)
Debuggen in VBA
Macros
Programmeren in VBA

Variabelen
Constanten
Operatoren
Selecties en iteraties

Macros
If you perform a task repeatedly in Microsoft Excel, you
can automate the task with a macro.
A macro is a series of commands and functions that are
stored in a Microsoft Visual Basic module and can be
run whenever you need to perform the task.
For example, if you often enter long text strings in cells,
you can create a macro to format those cells so that
the text wraps.

Macros
Waarom:
Opnemen van acties in Excel
Ideaal voor als je niet weet hoe je iets moet programmeren

Wat:
Een macro is net zoals een publieke procedure (Public Sub):
iedereen kan ze uitvoeren

Voordelen
Eenvoudig
Hergebruik

Nadelen:
Code is niet generisch: vaak wordt er bv. gewerkt met Selection
Nog steeds herwerk/tuning nodig

Macros
Uitleg:
http://office.microsoft.com/en-gb/excel-help/aboutmacros-in-excel-HP005201201.aspx

Tutorial:
http://www.helpwithpcs.com/tipsandtricks/microsoftexcel-macro-tutorial.htm

Oefening 1
Maak een nieuw werkboek aan les1_oef1_oplossing.xls
Voer de stappen op de volgende slide uit
Bestudeer de macro

Hoe wordt commentaar aangeduid?


Wat betekent: Application.CutCopyMode = False?
Wordt er enkel het Font en het Pattern gewijzigd?
Welke regels zouden er weg mogen?
In welke gevallen zou je deze laten staan?
Welke instellingen worden gemaakt met
Selection.Interior?
Zorg dat je de With ... End With structuur begrijpt.
Pas de code aan zodat je een With in een With gebruikt:
With ...
With ...
End With
End With

Slide op basis van cursus Het gebruik van VBA in Ms Excel van Theo Peek

Oefening 1

Zet tien willekeurige waarden in de cellen A1:A10, bijvoorbeeld de


getallen 1, ..., 10;
Start de Macro recorder met Tools > Macro > Record New Macro, geef
de macro de naam ErgSimpel en
Bevestig met OK;
In beeld verschijnt de Stop Recording Toolbar, zie Figuur 2.1;
Figuur 2.1: Stop Recording Toolbar.
Selecteer de cellen A1:A10;
Copy deze (Ctrl-C);
Selecteer cel C1;
Paste (Ctrl-V);
De selectie is nu C1:C10. Kies Format Cells (Ctrl-1) en kies op het
tabblad Font een blauwe kleur uit voor de letters;
Kies het tabblad Patterns en kies een gele kleur uit als celachtergrond;
Klik OK;
Selecteer cel A1;
Stop de macro recorder door op de Stopknop op de Stop Recording
Toolbar te klikken;
Start de Visual Basic Editor (VBE) (ALT-F11).

Slide op basis van cursus Het gebruik van VBA in Ms Excel van Theo Peek

Programmeren in Excel VBA beginners les 1

Visual Basic Intro


De Visual Basic Editor (VBE)
Debuggen in VBA
Macros
Programmeren in VBA

Variabelen
Constanten
Operatoren
Selecties en iteraties

Programmeren in VBA > Variabelen

Variabelen
Gegevens opslaan in geheugen
Slechts geldig tijdens uitvoeren van het programma
Verschillende gegevenstypes mogelijk:

Boolean

Integer

Long

Double

Date

Object

String

Variant

...

true or false
16 bits -> van - 2^15 tot 2^15 -1
32 bits -> van - 2^31 tot 2^31 -1
64 bits -> van - 2^63 tot 2^63 -1
bestemd voor datums
verwijzing naar object (bv. WorkSheet)
tekengegevens (bv. "appel")
kan alle types bevatten

Programmeren in VBA > Variabelen

Variabelen
Elke variabele heeft een unieke naam

Conventies:

Eerste teken moet letter zijn


Spaties, punten en komma's zijn niet toegelaten
Leestekens #, %, !, &, $ zijn niet toegelaten
Max lengte = 254 karakters

CamelCase + Hungarian notation:


Bv. strElkWoordEenNieuweHoofdletter

Voorbeeld:
strNaamKlant
iAantalJaren

Programmeren in VBA > Variabelen

Declaraties
Compiler informeren van bestaan: naam + gegevenstype
Keywoord = Dim

Dim <naam> As <type>

Bv. Dim strMijnNaam As String

Niet verplicht om variabelen an sich te declareren

Veroorzaakt errors bij ontbreken


Afdwingen door Option Explicit boven elke code te zetten
Enmalig bovenaan in het bestand dat de code bevat

Zie ook oefening 1

Programmeren in VBA > Variabelen

Declaraties
Niet verplicht om type te declareren

In plaats van:
Dim strMijnNaam As String

schrijven:
Dim strMijnNaam

Gevolgen:
Wordt achterliggend als Variant gedeclareerd:
Dim strMijnNaam As Variant
Variant kan lle types bevatten

Nadelen:
Trager
Meer geheugengebruik (te vermijden)

Programmeren in VBA > Variabelen

Declaraties
Afspraken:

Naamgeving volgens combinatie CamelCase en Hungarian notation


Bv. strElkWoordEenNieuweHoofdletter

Altijd Option Explicit bovenaan elke code bestand


Altijd een gegevenstype declareren
Bv. Dim strMijnNaam As String

Programmeren in VBA > Variabelen

Oefening 2:
Pas de Workbook_BeforeSave methode aan zodat:

Aan de gebruiker een eerste getal gevraagd wordt.


Aan de gebruiker een tweede getal gevraagd wordt.
Aan de gebruiker de som getoond wordt.

Tips:

Een waarde aan de gebruiker kan je opvragen met de


functie InputBox
Om een bericht te tonen: zie oefening 1

Programmeren in VBA > Variabelen

Oefening 2:

Programmeren in VBA > Variabelen

Oefening 2 - uitbreiding:
Pas oefening 2 aan zodat:

Wanneer je een getal ingeeft het programma een


foutmelding toont en stopt

Tips:

De Information module in de VBA bibliotheek

Programmeren in VBA > Variabelen


Varia:
String concatenatie:
Bv. Mijnheer

& strVoorNaam & strNaam

Waardes tonen aan de gebruiker:


Bv. MsgBox

Dit is het bericht, , Titel

Waardes vragen aan de gebruiker:


Bv. strWaarde

= InputBox(Geef iets, Titel )

Meerdere declaraties op n regel:


Bv. Dim

iGetal1 As Integer, iGetal2 As Integer

Commentaar met een enkele quote:


Bv.

dit is commentaar en wordt genegeerd

Programmeren in VBA > Variabelen

Declaratie scope:

Public:

Declaratie op module niveau


Beschikbaar binnen alle procedures in het project
Bv.
Public strNaam as String

Private:

Declaratie op module niveau


Enkel beschikbaar binnen alle procedures in de module
Bv.
Private strNaam as String

Programmeren in Excel VBA beginners les 1

Visual Basic Intro


De Visual Basic Editor (VBE)
Debuggen in VBA
Macros
Programmeren in VBA

Variabelen
Constanten
Operatoren
Selectiestructuren: If ... Then ... ElseIf ... End If

Programmeren in VBA > Constanten

Declaratie scope:

Const:

Constante  Waarde is niet wijzigbaar


Afspraak: naam in HOOFDLETTERS
Bv.
Const NAAM as String = "karel"
Voorbeeld:

Private Sub Demo()


Const NAAM As String = "karel"

Declaratie als constante

MsgBox NAAM
MessageBox toont "karel"
NAAM = "nijs"
End Sub

Programmeren in Excel VBA beginners les 1

Visual Basic Intro


De Visual Basic Editor (VBE)
Debuggen in VBA
Macros
Programmeren in VBA

Variabelen
Constanten
Operatoren
Selecties en iteraties

Programmeren in VBA > Operatoren


Expressies
= waarde of groep waarden die gevalueerd wordt
Resultaat = waarde van de expressie
Bv.
Waarde = 4 + 5

Kunnen opgebouwd worden uit:

Constanten, variabelen
Operatoren
Arrays en hun elementen (zie verder)
Functies

Programmeren in VBA > Operatoren


Expressies
Kunnen opgebouwd worden uit:
Constanten, variabelen:
Bv. dPrijsInclusief = iPrijsExclusief * BTW

Operatoren (zie volgende slide):


Rekenkundige, vergelijkings, logische en samenvoegings

Arrays en hun elementen (zie later):


Bv. dPrijsInclusief = aPrijzenLijst(1) * BTW

Functies:
Bv. sNaam = InputBox(Geef je naam in:)

Programmeren in VBA > Operatoren


Operatoren:
Vergelijking:
waarde
Bv.
prijs
Soorten:

= operand operator operand


= prijs

Rekenkundig:
+, -, *, /, \, ^ en Mod
Bv. a + 5

Vergelijking:
=, <, <=, >, >=, <>, is en like
Bv. If( 5 < prijs )

BTW

Programmeren in VBA > Operatoren


Operatoren:
Soorten:
Logisch:
And, Or, Not, Xor, Eqv en Imp
Bv. If( 5 < prijs

And

prijs < 10 )

Samenvoeging:
&
Bv. MsgBox "Mijnheer " & naam

Programmeren in Excel VBA beginners les 1

Visual Basic Intro


De Visual Basic Editor (VBE)
Debuggen in VBA
Macros
Programmeren in VBA

Variabelen
Constanten
Operatoren
Selecties en iteraties

Programmeren in VBA > Selecties en iteraties


Niet bij elk scenario moet elke code uitgevoerd
worden
Bv. als de prijs 0 is, moet je geen factuur sturen
Bv. als de prijs < 0 is, moet je een rode tekst tonen

Sommige code moet meermaals achter elkaar


uitgevoerd worden
Bv. het overlopen van alle orders op een factuur om het
totaal te berekenen

Programmeren in VBA > Selecties en iteraties


Beslissen met besluitsvormingsstructuren

If ... Then ... End If


If ... Then ... Else ... End If
If ... Then ... ElseIf ... Else ... End If
Select Case

Code herhalen met lusstructuren

For ... Next


For Each ... Next
Do While ... Loop
Do Until ... Loop

Programmeren in VBA > Selecties en iteraties


If ... Then ... End If
Conditie
Als ... dan ...
Bv.
begin
van de
conditie

expressie moet valideren als "waar" -> true

If ( tegoed < 0 ) Then


MsgBox "Gelieve te betalen!"
End If
einde van de conditie

wordt enkel uitgevoerd


 expressie voldaan

Programmeren in VBA > Selecties en iteraties


If ... Then ... Else ... End If
Probleem: we willen ook iets (een alternatief) laten uitvoeren als niet
aan de voorwaarde voldaan is
If ( tegoed < 0 ) Then
MsgBox "Gelieve te betalen!"
End If
If ( tegoed > 0 ) Then
MsgBox "Correcte betaler!"
End If

Nadelen:
Veel typwerk
Niet duidelijk dat code bij elkaar hoort

Programmeren in VBA > Selecties en iteraties


If ... Then ... Else ... End If
Conditie
Als ... dan ..., anders ...
Bv.
expressie moet valideren als "waar"  true
If ( tegoed < 0 ) Then
MsgBox "Gelieve te betalen!"
begin
van de
andere
optie

wordt enkel uitgevoerd


 expressie voldaan

Else
MsgBox "Correcte betaler!"
End If

wordt enkel uitgevoerd


 expressie niet voldaan

Programmeren in VBA > Selecties en iteraties


If ... Then ... ElseIf ... Else ... End If
Wat met meerdere (> 2) alternatieven?
Als ... dan ..., anders dan ..., ..., anders ...
Structuur:
If ( voorwaarde1 = True ) Then
...

ElseIf ( voorwaarde2 = True ) Then


...

ElseIf ( voorwaarde3 = True ) Then


...

...
Else
...
End If

nog meer voorwaarden?


geen enkele voorwaarde voldaan

Programmeren in VBA > Selecties en iteraties


If ... Then ... ElseIf ... Else ... End If
Bv.

If ( tijd < 12u ) Then


MsgBox "Goedemorgen!"
ElseIf ( tijd < 15u ) Then
MsgBox "Goedemiddag!"
ElseIf ( tijd < 18u ) Then
MsgBox "Goede namiddag!"
ElseIf ( tijd < 22u ) Then
MsgBox "Goede avond!"
Else
MsgBox "Goedenacht!"
End If

Programmeren in VBA > Selecties en

iteraties
Debuggen
= zoeken naar fouten in een programma
Starten door een break point te plaatsen

Vanaf dan: F8 voor elke volgende stap

In VBE: View > Toolbars > Debug

Programmeren in VBA > Selecties en


iteraties
Oefening 3:
Maak een applicatie die:

Een eerste getal vraagt aan de gebruiker


Een tweede getal vraagt aan de gebruiker
Een constante variabele met waarde 55 heeft
Volgende berekening uitvoert:
(getal1 + constant getal) modulo getal2

Programmeren in VBA > Selecties


en iteraties
Oefening 1:

Bv. (10 + 55) % 7 = 2 Kleine afwijking

Maak een applicatie die:


Volgend bericht toont aan de gebruiker:
Als het resultaat = 0:
"(<getal1>+<cte>) % <getal2> = <modulo> Perfecte deling"
Als het resultaat < 3:
"(<getal1>+<cte>) % <getal2> = <modulo> Kleine afwijking"
Als het resultaat < 5:
"(<getal1>+<cte>) % <getal2> = <modulo> Grotere afwijking"
Alle andere gevallen:
"<modulo> is een te grote afwijking!"

Testdata:

5 en 3
10 en 7
12 en 7
841 en 711

Programmeren in Excel VBA beginners les 2

Korte herhaling les 1


Programmeren in Excel VBA
Select Case
Lussen

Bedankt voor jullie aandacht!

Programmeren in Excel VBA


beginners
Karel Nijs
2010/09

Leswijze
Eerst wat theorie
Begeleid met (korte) oefeningen
Ms Excel 2003

Online hulp:

http://www.ozgrid.com/VBA/
http://msdn.microsoft.com/en-us/library/sh9ywfdk(vs.80).aspx
http://www.microsoft.com/technet/scriptcenter/topics/office/vba.mspx
http://www.kbcopenleren.be/

Offline hulp (op CD-ROM):


Boek "VBA voor Word, Excel en Access"
VBA-handleiding - vanuit Excel.doc

Korte pauze rond 20u

Programmeren in Excel VBA beginners les 2

Herhaling les 1
Programmeren in VBA:
Select Case
Selecties en iteraties (vervolg)

Het object Range


Range > Verwijzen naar het juiste cellenbereik
Programmeren in VBA:
Selecties en iteraties (vervolg)
Arrays

Range > Opvullen en bewerken

Herhaling les 1

Visual Basic Editor:


Opstarten van de Visual Basic Editor (VBE):
1. Start Ms Excel
2. Toon de "Visual Basic" werkbalk

Opstarten van de object browser:

Code hinting met: CTRL+spatie

Herhaling les 1

Variabelen:
Variabele dient om gegevens op te slaan in het (vluchtige)
werkgeheugen
Slechts geldig tijdens uitvoeren van het programma
Verschillende gegevenstypes mogelijk:

Boolean, Integer , Long, Double, Date, Object, String,


Variant, ...

Beperkingen qua naamgeving

Herhaling les 1

Variabelen:
Declaratie afspraken:

Naamgeving volgens combinatie CamelCase en Hungarian notation


Bv. strElkWoordEenNieuweHoofdletter

Altijd Option Explicit bovenaan elke code bestand


Altijd een gegevenstype declareren
Bv. Dim strMijnNaam As String

Herhaling les 1
Varia:
String concatenatie:
Bv. Mijnheer

& strVoorNaam & strNaam

Waardes tonen aan de gebruiker:


Bv. MsgBox

Dit is het bericht, , Titel

Waardes vragen aan de gebruiker:


Bv. strWaarde

= InputBox(Geef iets, Titel )

Meerdere declaraties op n regel:


Bv. Dim

iGetal1 As Integer, iGetal2 As Integer

Commentaar met een enkele quote:


Bv.

dit is commentaar en wordt genegeerd

Herhaling les 1
Besluitvormingsstructuren:
If Then End If
If Then Else End If
If Then ElsIf Else End If
If ( tijd < 12u ) Then
MsgBox "Goedemorgen!"
ElseIf ( tijd < 15u ) Then
MsgBox "Goedemiddag!"
ElseIf ( tijd < 18u ) Then
MsgBox "Goede namiddag!"
ElseIf ( tijd < 22u ) Then
MsgBox "Goede avond!"
Else
MsgBox "Goedenacht!"
End If

Programmeren in Excel VBA beginners les 2

Herhaling les 1
Programmeren in VBA:
Select Case
Selecties en iteraties (vervolg)

Het object Range


Range > Verwijzen naar het juiste cellenbereik
Programmeren in VBA:
Selecties en iteraties (vervolg)
Arrays

Range > Opvullen en bewerken

Programmeren in VBA > Selecties en iteraties

Beslissen met besluitsvormingsstructuren

If ... Then ... End If


If ... Then ... Else ... End If
If ... Then ... ElseIf ... Else ... End If
Select Case

Code herhalen met lusstructuren

For ... Next


For Each ... Next
Do While ... Loop
Do Until ... Loop

Programmeren in VBA > Selecties en iteraties

Select case
If ... Then ... ElseIf ... Else ... End If
Toch niet zo overzichtelijk...
Moeilijk onderhoudbaar

Select case:
Wanneer een voorwaarde (vele) verschillende opties
kan zijn
Select Case  n statussen
If Else  2 statussen

Programmeren in VBA > Selecties en iteraties

Select case
Structuur:
Select Case voorwaarde
Case mogelijkheid1
...
Case mogelijkheid2
...
Case mogelijkheid3
...
Case Else
...
End Select

Programmeren in VBA > Selecties en iteraties


Select case
Voorbeeld:
Dim iUur as Integer
iUur = InputBox("Welk uur is het?")
Select Case iUur
Case 8
MsgBox "Goedemorgen!"
Case 12
MsgBox "Goedemiddag!"
Case 16

slechts n van deze


mogelijkheden is geldig

MsgBox "Goede namiddag!"


Case Else
MsgBox "Hallo!"
End Select

als alle andere


mogelijkheden niet
geldig zijn

Programmeren in VBA > Selecties


en iteraties
Oefening 1: (kort)
Hermaak oefening 3 van les 1 met een Select
Case

Testdata:
58 en 4

Oefening 1 - uitbreiding:
Wat met de modulo's 1, 2 en 4?
Meer informatie: http://www.ozgrid.com/VBA/selectcase.htm

Programmeren in VBA > Selecties en iteraties

Select case
Opmerkingen:
Meerdere cases tegelijk behandelen:
Bv.

Case 5, 3, 10

Een bereik behandelen:


Bv.
Bv.

Case 1 To 3
Case Is < 3

Ook andere types mogelijk:


Bv.

Select Case strSport


Case "voetbal"
...
End Select

Programmeren in VBA > Selecties en iteraties


Select case
Opmerkingen:
Als meerdere cases geldig zijn, dan wordt enkel de
eerste die aan de voorwaarde voldoet, uitgevoerd!
Bv.
Dim i as integer
i = 2
Select Case
Case Is < 5
MsgBox "< 5"
Case Is < 3
MsgBox "< 3"
End Select

eerste case die voldoet

Programmeren in VBA > Selecties en iteraties

Beslissen met besluitsvormingsstructuren

If ... Then ... End If


If ... Then ... Else ... End If
If ... Then ... ElseIf ... Else ... End If
Select Case

Code herhalen met lusstructuren

For ... Next


For Each ... Next
Do While ... Loop
Do Until ... Loop

Programmeren in VBA > Selecties en iteraties

Lusstructuren:
Om een stuk code meerdere malen uit te voeren
Omdat je ooit moet eindigen  grenzen instellen
Start
Einde

Soorten:
For ... Next
Do While ... Loop
Do Until ... Loop

Programmeren in VBA > Selecties en iteraties


For ... Next
Van ... tot ...
Structuur:
For teller = beginpunt To eindpunt
...
Next

wordt bij elke iteratie


uitgevoerd

Eindgrens is inclusief
Teller verhoogt standaard telkens met 1
Stap is instelbaar (natuurlijke getallen):
For teller = beginpunt To eindpunt Step 2
...
Next
Andere voorbeelden: 100, -5, 7, -1, ...

Programmeren in VBA > Selecties en iteraties

For ... Next


Voorbeeld:
Dim beginpunt As Integer, eindpunt As Integer
Dim teller As Integer
beginpunt = 5
eindpunt = 10
teller = 0

geen step  standaard = 1

For teller = beginpunt To eindpunt


MsgBox teller
Next
Toont: 5, 6, 7, 8, 9 n 10

Programmeren in VBA > Selecties en iteraties


For ... Next
Stap vergroten:
Dim beginpunt As Integer, eindpunt As Integer
Dim teller As Integer, stapGrootte As Integer
beginpunt = 5
eindpunt = 10
teller = 0
stapGrootte = 2
For teller = beginpunt To eindpunt Step stapGrootte
MsgBox teller
Next
Toont enkel: 5, 7 en 9

Programmeren in VBA > Selecties en iteraties


For ... Next
Uitbreken:
Vroegtijdig de lus afbreken
Kan soms nuttig zijn

Statement: Exit

For

Voorbeeld:
For teller = beginpunt To eindpunt
If( ... ) Then
Exit For
End If
Next

Programmeren in Excel VBA beginners les 2

Herhaling les 1
Programmeren in VBA:
Select Case
Selecties en iteraties (vervolg)

Het object Range


Range > Verwijzen naar het juiste cellenbereik
Programmeren in VBA:
Selecties en iteraties (vervolg)
Arrays

Range > Opvullen en bewerken

Het object Range


Range = bereik van cellen

En cel
Rij of kolom van cellen
Tabel
Willekeurige selectie van cellen

Cel is basissteen van Ms Excel


Data, draaitabellen, grafieken, ...

Slide op basis van cursus Programmeren in Excel 2007 VBA van Peter Demasure

Het object Range


Objectstructuur:
Een Range zit in een Worksheet dat in een Workbook zit:
Range Worksheet Workbook

Workbook

Range van 1 cel


Worksheet

Het object Range


Voorbeeld:
Range("A1") = 50

beter!
Workbooks("Kalender.xls").Worksheets("Januari").Range("A1") = 50

nog beter!

Dim WB As Workbook
Dim WS As WorkSheet
Dim rngCel As Range
Set WB = ActiveWorkbook
Set WS = ActiveSheet
Set rngCel = WS.Range("A1")
rngCel = 50
perfect!

Slide op basis van cursus Programmeren in Excel 2007 VBA van Peter Demasure

Het object Range


Voorbeeld:
Dim WB As Workbook
Dim WS As WorkSheet
Dim rngCel As Range
Set WB = ActiveWorkbook
Set WS = ActiveSheet
Set rngCel = WS.Range("A1")
rngCel = 50
Dim WB As Workbook
perfect! Dim WS As WorkSheet
Dim rngCel As Range
Set WB = Workbooks("Kalender.xls")
Set WS = WB.Worksheets("Januari")
Set rngCel = WS.Range("A1")
rngCel = 50
Slide op basis van cursus Programmeren in Excel 2007 VBA van Peter Demasure

Het object Range


Uitleg bij voorbeeld:
Standaard verwijst Range(A1) naar de cel A1 van het toevallig
actieve werkblad in het toevallig actieve werkboek
Niet handig!

Daarom:
Altijd Workbook specifiren
Altijd Worksheet specifiren

Het object Range


For Each ... Next:
Met VBA kan je collecties eenvoudig overlopen
Bijvoorbeeld:
collectie
type Variant
For Each cell in ActiveSheet.Cells
...
Next

Programmeren in Excel VBA beginners les 2

Herhaling les 1
Programmeren in VBA:
Select Case
Selecties en iteraties (vervolg)

Het object Range


Range > Verwijzen naar het juiste cellenbereik
Programmeren in VBA:
Selecties en iteraties (vervolg)
Arrays

Range > Opvullen en bewerken

Range > Verwijzen naar het juiste


cellenbereik
Verwijzen naar vast bereik via celadres
Range( celadres )
Rows( celadres )
Columns( celadres )

Slide op basis van cursus Programmeren in Excel 2007 VBA van Peter Demasure

Range > Verwijzen naar het juiste


cellenbereik
Het cijfermatig resultaat in cel C1

Range("A1") = 5
Range("B1") = 3
Range("C1")=Range("A1")+Range("B1")

De formule in cel C1 (eerste mogelijkheid)


De formule in cel C1 (tweede mogelijkheid)

Range("C1")= "=A1 + B1"


Range("C1").Formula= "=Sum(A1:B1)"

Vaste tabel van cel B4 tot en met cel E20

Range("B4:E20") of
Range("B4","E20")

Vijfde kolom

Columns("E") of Columns("E:E") of
Range("E3").EntireColumn

Vijfde rij

Rows("5") of Rows("5:5") of
Range("F5").EntireRow

Kolom vijf tot acht

Columns("E:H")

Rij vijf tot acht

Rows("5:8")

Cellen B4 en E20, los van elkaar

Range("B4,E20")

Kolommen vijf en acht, los van elkaar

Range("E:E,H:H")

Rij vijf en acht los van elkaar

Range("5:5,8:8")

Slide op basis van cursus Programmeren in Excel 2007 VBA van Peter Demasure

Range > Verwijzen naar het juiste


cellenbereik
Verwijzen naar dynamisch bereik via celadres
Getallen zijn makkelijker te manipuleren dan letters
Verwijzen naar cel via: Cells( rij, kolom )
Bijvoorbeeld:
Vast:
Dynamisch:

Range( C5 )
Cells( 5, 3 )

Alle cellen binnen een bereik overlopen:


Cells( index )

Slide op basis van cursus Programmeren in Excel 2007 VBA van Peter Demasure

Range > Verwijzen naar het juiste


cellenbereik
De cel met adres D5

Cells(5,4)

Dynamische celverwijzing

Cells(lngRij, lngKolom)

Tabel opgemaakt in VBA met


variabel aantal cellen en vaste bovenhoek

Range(Cells(1,1), Cells(lngRij,lngKolom)) of
Cells(1,1).Resize(lngRij,lngKolom)

Tabel opgemaakt in VBA met


variabel aantal cellen en vlottende bovenhoek

Cells(lngRs,lngKs).Resize(lngRij,lngKolom)

Dynamische tabel opgemaakt in Excel


met vaste linkerbovenhoek en
met een dynamische linkerbovenhoek.
CurrentRegion verwijst naar het gebied dat
begrensd is door lege rijen en lege kolommen.

Range("A1").CurrentRegion
Cells(lngRij, lngKolom).CurrentRegion

Vijfde kolom
Dynamische kolom

Columns(5) of Cells(lngRij,5).EntireColumn
Columns (lngIndex) of
Cells(lngIndex).EntireColumn

Vijfde rij
Dynamische rij

Rows(5) of Cells(5,lngKolom).EntireRow
Rows(lngIndex) of Cells(lngRij,lngKolom).EntireRow

Kolom vijf tot acht

Columns(5).Resize(0,3)

Rij vijf tot acht

Rows(5).Resize(3,0)

De veldnamenrij van een dynamische tabel


beginnend in de linkerbovenhoek van het werkblad

Range("A1").CurrentRegion.Rows(1)

Slide op basis van cursus Programmeren in Excel 2007 VBA van Peter Demasure

Range > Verwijzen naar het juiste


cellenbereik
Cellen en tabellen
Vast bereik:
Set rngTabel = WS.Range("A1:E20")

Dynamisch bereik
Set rngTabel = WS.Cells(1,1).Resize(lngRij, lngKolom)

Dynamisch in Excel
Set rngTabel = WS.Range("A1").CurrentRegion

Slide op basis van cursus Programmeren in Excel 2007 VBA van Peter Demasure

Oefening 2
Open opgave les2_oef2_opgave.xls
Maak een functie die de faculteit berekent
Tip: Google: wiki faculteit

Input getal:
Mag niet hoger 15 zijn

Output:
Kolom B (vanaf B3) bevat de faculteit iteratie
Kolom C (vanaf C3) bevat de n-de faculteit

Gebruik named ranges en niet B1 en B3


Tip: http://www.cpearson.com/excel/DefinedNames.aspx

Koppel de macro aan een knop


Tip: http://www.mrexcel.com/tip068.shtml

Oefening 2
Oplossing:

Uitbreiding:
Bereken eerst de faculteit van 15 en dan van 5
Wat gebeurt er (niet)?
Los dit probleem op

Vang alle speciale gevallen van de faculteit functie op

Range > Verwijzen naar het juiste


cellenbereik
Cellen en tabellen
Dynamisch in Excel
Dim rngTabel as Range
Set rngTabel = WS.Range(C6").CurrentRegion
Range(C6)

rngTabel

Range > Verwijzen naar het juiste


cellenbereik
De eerste cel (linkerbovenhoek) van een werkblad (dit is steeds cel A1)
Set rngCel = WS.Cells(1)
De eerste cel (linkerbovenhoek) van een tabel (dit kan een der welke cel zijn!)
Set rngCel = rngTabel.Cells(1)
De laatste cel van een tabel
Set rngCel = rngTabel.Cells(rngTabel.Cells.Count)
De laatste kolom van een tabel
Set rngCel = rngTabel.Columns(rngTabel.Columns.Count)
De eerste rij onder de tabel (waar bijv. de som terecht komt)
Set rngRij = rngTabel.Rows(rngTabel.Rows.Count).Offset(1)
Het datablok van de tabel
rngTabel.Resize(rngTabel.Rows.Count - 1).Offset(1)
De eerste kolom van datablok van de tabel
rngTabel.Resize(rngTabel.Rows.Count - 1).Offset(1).Columns(1)
Een kolom toevoegen van de tabel
rngTabel.Resize(,rngTabel.Columns.Count + 1)

Slide op basis van cursus Programmeren in Excel 2007 VBA van Peter Demasure

Programmeren in Excel VBA beginners les 2

Herhaling les 1
Programmeren in VBA:
Select Case
Selecties en iteraties (vervolg)

Het object Range


Range > Verwijzen naar het juiste cellenbereik
Programmeren in VBA:
Selecties en iteraties (vervolg)
Arrays

Range > Opvullen en bewerken

Programmeren in VBA > Selecties en iteraties

Beslissen met besluitsvormingsstructuren

If ... Then ... End If


If ... Then ... Else ... End If
If ... Then ... ElseIf ... Else ... End If
Select Case

Code herhalen met lusstructuren

For ... Next


For Each ... Next
Do While ... Loop
Do Until ... Loop

Programmeren in VBA > Selecties en iteraties

Do While ... Loop


Doe zolang ...
Structuur:
Do While (voorwaarde = True)
...
Loop

wordt bij elke iteratie


uitgevoerd

Verschil met If Else:


Geen ingebouwde grenzen
Teller zelf te implementeren

Voorwaarde zelf in te stellen in de body

Programmeren in VBA > Selecties en iteraties

Do While ... Loop


Voorbeeld:
Zoek het grootste getal
Getal -1 dient om te stoppen
Dim iGrootste As Integer, iIngave As Integer
iIngave = InputBox("Geef een getal in: ")
Do While ( iIngave <> -1 )
If( iIngave > iGrootste ) Then
iGrootste = iIngave
End If
iIngave = InputBox("Geef een getal in: ")
Loop

Programmeren in VBA > Selecties en iteraties


Do While ... Loop
Voorbeeld:
Opmerking:
Dubbele code!

Dim iGrootste As Integer, iIngave As Integer


iIngave = InputBox("Geef een getal in: ")
Do While ( iIngave <> -1 )
If( iIngave > iGrootste ) Then
iGrootste = iIngave
End If
iIngave = InputBox("Geef een getal in: ")
Loop

Programmeren in VBA > Selecties en iteraties


Do ... Loop While
Voorbeeld:
Opmerking:
Dubbele code!

Oplossing: Do ... Loop While

Dim iGrootste As Integer, iIngave As Integer


Do
iIngave = InputBox("Geef een getal in: ")
If( iIngave > iGrootste And iIngave <> -1 ) Then
iGrootste = iIngave
End If
Loop While ( iIngave <> -1 )

Programmeren in VBA > Selecties en iteraties

Do ... Loop While ...


Doe zolang ...
Structuur:
Do
...
Loop While (voorwaarde = True)

Verschil met Do While ... Loop:


Minstens n doorgang

wordt bij elke iteratie


uitgevoerd

Programmeren in VBA > Selecties en iteraties

Beslissen met besluitsvormingsstructuren

If ... Then ... End If


If ... Then ... Else ... End If
If ... Then ... ElseIf ... Else ... End If
Select Case

Code herhalen met lusstructuren

For ... Next


For Each ... Next
Do While ... Loop
Do Until ... Loop

Programmeren in VBA > Selecties en iteraties

Do Until ... Loop


Doe totdat ...
Structuur:
Do Until (voorwaarde = True)
...
Loop

wordt bij elke iteratie


uitgevoerd

Verschil met Do While ... Loop:


Andere stopvoorwaarde: 'zolang' 'totdat'

Programmeren in VBA > Selecties en iteraties


Do Until ... Loop
Equivalenten:
For iTeller = 0 To 5
...
Loop

For iTeller = 0 To 5 Step 1


...
Loop

iTeller = 0
Do While ( iTeller < 6)
...
iTeller = iTeller + 1
Loop

iTeller = 0
Do
...
iTeller = iTeller + 1
Loop While ( iTeller < 6)

iTeller = 0
Do Until ( iTeller >= 6)
...
iTeller = iTeller + 1
Loop

Programmeren in VBA > Selecties


en iteraties
Oefening 3: (kort)
Hermaak oefening 2 met een
Do While ... Loop

Testdata:
58 en 4

Tip: oplossing in drie regels!


Debug tip: als je PC hangt: CTRL+Break

Programmeren in Excel VBA beginners les 2

Herhaling les 1
Programmeren in VBA:
Select Case
Selecties en iteraties (vervolg)

Het object Range


Range > Verwijzen naar het juiste cellenbereik
Programmeren in VBA:
Selecties en iteraties (vervolg)
Arrays

Range > Opvullen en bewerken

Programmeren in VBA > Arrays

Arrays:

= verzameling van dezelfde gegevens


Bv. verzameling van Integers, Strings, Dates, Objects,
Elk element apart raadpleegbaar mbv. indexering
~ gewone variabelen:

Moet gedeclareerd worden


Unieke naam met beperkingen
Afspraak: CamelCase en Hungarian notation

Scope te bepalen:
Private, Public of Dim

Geen constanten mogelijk!


http://www.ozgrid.com/forum/showthread.php?t=34314

Programmeren in VBA > Arrays

Arrays:

startpositie

eindpositie

Voorbeeld:
Dim arrLeden(1 To 5) As String

Maakt een array aan van Strings

arrLeden

arrLeden(1)

arrLeden(3)

arrLeden(2)

arrLeden(4)

arrLeden(5)

Programmeren in VBA > Arrays

Arrays:
Voorbeeld:
Dim arrLeden(1 To 5) As String
arrLeden(1) = "joris"

Maakt een array aan van Strings

joris
arrLeden

arrLeden(1)

Programmeren in VBA > Arrays

Arrays:
Startpositie is instelbaar

Dim arrLeden(1 To 100) As String


Start vanaf 1
Gaat van 1 t/m 100

Dim arrLeden(100) As String

Start vanaf 0
Gaat van 0 t/m 100

Opgelet: staat fout in boek!

Programmeren in VBA > Arrays

Arrays multi-dimensionaal:
Voorbeeld:
Dim arrLeden(1 To 5, 1 To 3) As String

Maakt een array aan van arrays van Strings

arrLeden
arrLeden(3)
arrLeden(5)

arrLeden(1)
arrLeden(2)

arrLeden(4)

Programmeren in VBA > Arrays

Arrays:
Voorbeeld:
Dim arrLeden(1 To 5, 1 To 3) As String
arrLeden(1,2) = "joris"

Maakt een array aan van Strings

arrLeden

joris

arrLeden(1,2)

Programmeren in VBA > Arrays

Arrays:
Grootte later pas declareren:
Dim arrLeden() As String
ReDim arrLeden(20) As String

Nuttig wanneer je de grootte op voorhand niet kent


Grootte heraanpassen lukt niet:
Dim arrLeden(1 To 5) As String
ReDim arrLeden(20) As String

Programmeren in VBA > Arrays

Arrays:
Opvragen van de grenzen:

Ondergrens: LBound( array )


Bovengrens: UBound( array )
Voorbeeld:

Dim arrLeden(4) As String


Dim arrWerknemers(0 To 4) As String
MsgBox LBound( arrLeden )
MsgBox LBound( arrWerknemers )
MsgBox UBound( arrLeden )
MsgBox UBound( arrWerknemers )

Programmeren in VBA > Arrays

For Each Next:


Overlopen van een collectie
Variant type verplicht

Dim vItem As Variant

Collectie; bv. array

For Each vItem In arrLeden


...
Next

wordt uitgevoerd voor elk


element in de collectie

Programmeren in VBA > Arrays

For Each Next:


Voorbeeld
Dim vItem As Variant
Dim saOrdersInFactuur(3) As String
saOrdersInFactuur(0)
saOrdersInFactuur(1)
saOrdersInFactuur(2)
saOrdersInFactuur(3)

=
=
=
=

beer
Lego
bal
GI Joe

For Each vItem In saOrdersInFactuur


MsgBox vItem
Next

Toont in deze volgorde:


beer, Lego, bal en GI Joe

Programmeren in Excel VBA beginners les 2

Herhaling les 1
Programmeren in VBA:
Select Case
Selecties en iteraties (vervolg)

Het object Range


Range > Verwijzen naar het juiste cellenbereik
Programmeren in VBA:
Selecties en iteraties (vervolg)
Arrays

Range > Opvullen en bewerken

Oefening 4a
Maak een nieuw werkboek aan: les1_oef4_oplossing.xls
Maak onderstaand Lotto formulier aan
Gebruik een aparte, herbruikbare procedure:
MaakLottoFormulier()
Private toegang
Parameters: startcel, aantal kolommen en aantal rijen
Deze procedure roep je op via een publieke procedure
procMain()

Oplossing:

Oefening 4b
Zorg ervoor dat de gebruiker via een knop getallen kan
aankruisen
Maak hiervoor volgende procedures aan:
public VoerGetalIn() toont de InputBox
private KruisAan()
kruist het getal aan
Oplossing:

Oefening 4c
Uitbreiding:
Zorg dat je procedure MaakLottoFormulier() meerdere
formulieren kan aanmaken
Wanneer je nu op de knop Kies getal klikt, kan je ook het
formulier kiezen

Oefening 4c
Oplossing:

Range > Opvullen & bewerken


Opmerkingen bij de oplossing:
Automatisch opvullen van groot bereik met For lus is niet efficint
Beter: formule gebruiken
Zie les1_oef3d_oplossing.xls
6 kolommen
kolomindex

formule = (rij-index * aantal_kolommen)


+ kolomindex
Bijvoorbeeld: (1 * 6) + 1 = 7

rij-index

Opgelet: rekening houden met offset: je


start niet altijd op rij 1, kolom 1!

Slide op basis van cursus Programmeren in Excel 2007 VBA van Peter Demasure

Range > Opvullen & bewerken


Opmerkingen bij de oplossing:
Code herbruikbaar maken door ze in aparte procedures te steken
Parameters:
Optionele:
Private Sub test( param1 as Long, Optional param2 as Variant)

Controleren of meegegeven is:


If ( IsMissing(param2) ) Then
param2 = ...
End If

Slide op basis van cursus Programmeren in Excel 2007 VBA van Peter Demasure

Programmeren in Excel VBA beginners les 3

Herhaling les 1 + 2
Range > Rijen verwijderen
Werkmappen en werkbladen
Het object Application
Event macro's
Excel 2003 vs. 2007

Bedankt voor jullie aandacht!

Programmeren in Excel VBA


Karel Nijs
2010/09

Leswijze
Eerst wat theorie
Begeleid met (korte) oefeningen
Ms Excel 2003

Online hulp:

http://www.ozgrid.com/VBA/
http://msdn.microsoft.com/en-us/library/sh9ywfdk(vs.80).aspx
http://www.microsoft.com/technet/scriptcenter/topics/office/vba.mspx
http://www.kbcopenleren.be/

Offline hulp (op CD-ROM):


Boek "VBA voor Word, Excel en Access"
VBA-handleiding - vanuit Excel.doc

Korte pauze rond 20u

Programmeren in Excel VBA beginners les 3

Herhaling les 1 + 2
Range > Rijen verwijderen
Programmeren in VBA
Functies en subroutines

User Defined Functions


Werkmappen en werkbladen
Het object Application
Event macro's
Excel 2003 vs. 2007

Herhaling les 1 + 2
Herhaling les 1 varia:
String concatenatie:
Bv. Mijnheer

& strVoorNaam & strNaam

Waardes tonen aan de gebruiker:


Bv. MsgBox

Dit is het bericht, , Titel

Waardes vragen aan de gebruiker:


Bv. strWaarde

= InputBox(Geef iets, Titel )

Meerdere declaraties op n regel:


Bv. Dim

iGetal1 As Integer, iGetal2 As Integer

Commentaar met een enkele quote:


Bv.

dit is commentaar en wordt genegeerd

Herhaling les 1 + 2
Herhaling les 2:
Besluitvormingsstructuren:
If Then End If
If Then Else End If
If Then ElsIf Else End If
If ( tijd < 12u ) Then
MsgBox "Goedemorgen!"
ElseIf ( tijd < 15u ) Then
MsgBox "Goedemiddag!"
ElseIf ( tijd < 18u ) Then
MsgBox "Goede namiddag!"
ElseIf ( tijd < 22u ) Then
MsgBox "Goede avond!"
Else
MsgBox "Goedenacht!"
End If

Herhaling les 1 + 2
Herhaling les 2:
Besluitvormingsstructuren:
Select Case
Dim iUur as Integer
iUur = InputBox("Welk uur is het?")
Select Case iUur
Case 8
MsgBox "Goedemorgen!"
Case 12
MsgBox "Goedemiddag!"
Case 16
MsgBox "Goede namiddag!"
Case Else
MsgBox "Hallo!"
End Select

Herhaling les 1 + 2
Herhaling les 2:
Lusstructuren:
For iTeller = 0 To 5
...
Loop

For iTeller = 0 To 5 Step 1


...
Loop

iTeller = 0
Do While ( iTeller < 6)
...
iTeller = iTeller + 1
Loop

iTeller = 0
Do
...
iTeller = iTeller + 1
Loop While ( iTeller < 6)

iTeller = 0
Do Until ( iTeller >= 6)
...
iTeller = iTeller + 1
Loop

Herhaling les 1 + 2
Objectstructuur het object Range:
Range = bereik van cellen
Een Range zit in een Worksheet dat in een Workbook zit:
Range Worksheet Workbook
Ranges stel je in met Set
Ranges overloop je met For Each ... Next
Verwijzingen kunnen statisch of dynamisch zijn:
Statisch voorbeeld:
Dynamisch voorbeeld:

Range("A1")
Cells(3,4)

Herhaling les 1 + 2
Objectstructuur het object Range:
Standaard verwijst Range(A1) naar de cel A1 van het toevallig
actieve werkblad in het toevallig actieve werkboek
Niet handig!

Daarom:
Altijd Workbook specifiren
Altijd Worksheet specifiren

Verwijzen naar een Range:


Dim WB As Workbook
Dim WS As WorkSheet
Dim rngCel As Range
Set WB = Workbooks("Kalender.xls")
Set WS = WB.Worksheets("Januari")
Set rngCel = WS.Range("A1")
rngCel = 50

Programmeren in Excel VBA beginners les 3

Herhaling les 1
Range > Rijen verwijderen
Programmeren in VBA
Functies en subroutines

User Defined Functions


Werkmappen en werkbladen
Het object Application
Event macro's
Excel 2003 vs. 2007

Range > Rijen verwijderen


For ... Each is handig, ... maar niet voor het verwijderen

van cellen

For Each rngCel In rngKolom.Cells


If UCase(rngCel) = "JAN" Then
rngCel.EntireRow.Delete
End If
Next rngCel

?
Slide op basis van cursus Programmeren in Excel 2007 VBA van Peter Demasure

Range > Rijen verwijderen


Reden:
Wanneer je een hoger gelegen rij verwijdert, springen alle onderliggende
rijen steeds een hoger
Hierdoor ontsnappen sommige rijen aan onze controle op JAN
For Each rngCel In rngKolom.Cells
If (UCase(rngCel) = "JAN) Then
rngCel.EntireRow.Delete
End If
Next rngCel

aha!
Slide op basis van cursus Programmeren in Excel 2007 VBA van Peter Demasure

Oefening 1a
Maak een werkboek aan: les3_oef1a_oplossing.xls
Los het probleem van de vorige slide op door de rijen van
onder naar boven te overlopen
Tip:
Via de knop Maak test sheet aan op sheet BRON_DATA
kan je telkens een volledig nieuwe versie van sheet
Verwijder_Jan_Fout aanmaken

Oefening 1b
Maak een werkboek aan: les3_oef1b_oplossing.xls
Uitbreiding:
Verwijder enkel de rijen met Jan als naam n de datum in
oktober

Slide op basis van cursus Programmeren in Excel 2007 VBA van Peter Demasure

Programmeren in Excel VBA beginners les 3

Herhaling les 1
Range > Rijen verwijderen
Programmeren in VBA
Functies en subroutines

User Defined Functions


Werkmappen en werkbladen
Het object Application
Event macro's
Excel 2003 vs. 2007

Programmeren in VBA > Functies en subroutines

Procedure
= stuk code omsloten door

Sub

End Sub

Function

End Function

of

Procedures steken altijd in modules

Programmeren in VBA > Functies en


subroutines

Procedure
Procedures steken altijd in modules

ThisWorkBook en Bladx zijn eigenlijk ook modules!

Scope of toegang of aanroepbaarheid of

Public
Toegankelijk voor andere procedures buiten de module
Bv. procedure om robot te besturen

Private
Enkel toegankelijk voor andere procedures binnen de module
Code hiding
Bv. (interne) procedure om de snelheid te berekenen

Programmeren in VBA > Functies en subroutines

Sub ... End Sub

Subroutine
Gn terugkeerwaarde
Uitbreken met: Exit Sub
Voorbeeld:

naam

begin

publieke toegang

parameters

Public Sub RijVooruit( )


...
If( ... ) Then Exit Sub
...
End Sub
einde

uitbreken

Programmeren in VBA > Functies en subroutines

Function ... End Function


Functie
Met n terugkeerwaarde

Type te specifiren in functiebeschrijving


Toekenning terugkeer- of functiewaarde door:

<functienaam> = <waarde>
Uitbreken met: Exit Function

Programmeren in VBA > Functies en subroutines

Function End Function:


Voorbeeld:
naam
parameters
begin

publieke toegang

terugkeertype

Public Function GeefSnelheid( ) As Double


...
If( ... ) Then Exit Function
...

uitbreken

GeefSnelheid = 25.3
End Function
einde

terugkeerwaarde toekennen

Programmeren in VBA > Functies en subroutines

Parameters
Soorten: geen, optionele en normale
Bij zowel subroutines als functies
Type zelf mee te geven

Als ontbreekt  Variant

~ variabelen:

Moeten gedeclareerd worden


Unieke naam met beperkingen
Afspraak: CamelCase en Hungarian notation

Scope = procedure zelf (na procedure is geheugen vrij)


Dim keyword niet nodig
Geen constanten

Programmeren in VBA > Functies en subroutines

Procedure
Parameters voorbeelden:

Geen parameters:
Sub Demo()

Wel, met type:


Sub Demo( s1 As String, s2 As String )

Wel, zonder type:


Beide worden gedeclareerd als Variant

Sub Demo( s1, s2 )

Programmeren in VBA > Functies en subroutines

Procedure
Parameters voorbeelden:

Optionele, zonder standaardwaarde


Als niet meegegeven  standaardwaarde van type wordt gebruikt
Bv. Integer  0

Sub Demo( Optional s1 As String )

Optionele, mt standaardwaarde
Als niet meegegeven  standaardwaarde van declaratie wordt
gebruikt

Sub Demo( Optional s1 As String = blah )

Programmeren in VBA > Functies en subroutines

Procedure
Parameters voorbeelden:

MsgBox functie

MsgBox "Dit is het bericht", , "Titel"

MsgBox "Dit is het bericht", vbCritical + vbOKCancel, "Titel"

Programmeren in VBA > Functies en subroutines

Parameters
Doorgeven:

Voorbeeld:

Public Sub RijVooruit( iAfstand As Integer)


...
End Sub

Call RijVooruit( 20 )
Call RijVooruit()
Call RijVooruit( 20, 10 )

Programmeren in VBA > Functies en subroutines

Oproepen
Verschillende manieren:

Bv. BerekenAfstand
Bv. BerekenAfstand()
Bv. Call BerekenAfstand
Bv. Call BerekenAfstand()
Bv. Call ZetSnelheid( 20 )

Met Call:

Duidelijker dat je procedure oproept


Haakjes () niet verplicht wanneer parameters ontbreken
Enkel bruikbaar als je gn terugkeerwaarde verwacht!

Programmeren in VBA > Functies en subroutines

Oproepen
Als je een terugkeerwaarde hebt:

Haakjes gebruiken!
Call niet gebruiken bij oproepen
Bv. waarde = InputBox( Geef getal )

Zonder terugkeerwaarde:

Haakjes niet verplicht


Bv. MsgBox Geef getal
Bv. Call MsgBox("Dit is het bericht", , "Titel")

Optionele parameters weglaten

Bv. MsgBox Geef getal, , Titel

Programmeren in VBA > Functies en subroutines

Oproepen
Ook mogelijk om de parameters zelf te specifiren
Voorbeeld:
MsgBox prompt:="Dit is het bericht", _
title:="Titel"
het nieuwe regel teken

Waarom

Leesbaarder in sommige gevallen


Geen kommas nodig bij het ontbreken van optionele parameters
Bv. MsgBox Bericht, , Titel

Programmeren in VBA > Functies en


subroutines

Parameters - geavanceerd

ByVal

ByRef

Optional. Specifies that the procedure can modify the underlying variable element in
the calling code the same way the calling code itself can.
Bv. Public Sub Demo( ByVal sParam1 As String )

Optional. Specifies that the procedure cannot replace or reassign the variable
element underlying the corresponding argument in the calling code.
Bv. Public Sub Demo( ByRef sParam1 As String )

ParamArray

Optional. Specifies that the last parameter in the parameter list is an optional array
of elements of the specified data type. This lets the calling code pass an arbitrary
number of arguments to the procedure.
Bv. Public Sub Demo( ParamArray saParams() As Variant )
Call Demo( "a", "b", 5, Date )

http://msdn.microsoft.com/en-us/library/cbs7z96t.aspx

Programmeren in VBA > Functies en subroutines

Samenvatting

Procedures kunnen parameters hebben


Procedures hebben een scope
Er zijn twee soorten procedures: Sub en Function
Functies hebben een terugkeerwaarde
Procedure parameters:

Hebben een type


Kunnen optioneel zijn

Procedures kunnen op verschillende manieren opgeroepen


worden

Programmeren in Excel VBA beginners les 3

Herhaling les 1
Range > Rijen verwijderen
Programmeren in VBA
Functies en subroutines

User Defined Functions


Werkmappen en werkbladen
Het object Application
Event macro's
Excel 2003 vs. 2007

User Defined Functions

Functies die je zlf definieert


Beschikbaar als functie in elke cel
Voordelen:

Je kan een complexe of eigen (wiskundige) functie maken.


Vereenvoudigen van mega formules
Diagnostiek: controleren van cel formaat
Tekstmanipulatie
Geavanceerde array en matrix functies

Opslaan in module

User Defined Functions

Beperkingen:
Niet opneembaar zoals een macro
Formaat of de structuur van een cel/werkblad niet
veranderbaar
Moeten gebruikt worden zoals formules, niet zoals macros
Trager
Bij gebruik krijg je altijd de beveiligingswaarschuwing als je
de XLS opent

Bron: http://www.vertex42.com/ExcelArticles/user-defined-functions.html

User Defined Functions

Voorbeeld:

Programmeren in Excel VBA beginners les 3

Herhaling les 1
Range > Rijen verwijderen
Programmeren in VBA
Functies en subroutines

User Defined Functions


Werkmappen en werkbladen
Het object Application
Event macro's
Excel 2003 vs. 2007

Werkmappen en werkbladen
Werkmap
Aka. Workbook
Huidige werkboek:
ActiveWorkbook

Werkboek waarin je VBA procedure in uitgevoerd wordt:


ThisWorkbook

Als je met meerdere werkboeken werkt, een werkboek activeren:


ThisWorkbook.Activate
Windows(boek.xls).Activate

Werkmappen en werkbladen
Werkmap
Opslaan:
Workbook.Save
Workbook.SaveAs

Sluiten:
Workbook.Quit

Sluiten zonder op te slaan:


Workbook.Saved = True
Workbook.Quit

Werkmappen en werkbladen
Werkblad
Aka. Worksheet
Huidige werkblad:
ActiveSheet

Werkblad waarin je VBA procedure in uitgevoerd wordt:


ThisWorkbook.ActiveSheet

Als je met meerdere werkboeken werkt, een werkboek activeren:


ThisWorkbook.Sheets(blad1).Activate
Windows(boek.xls).Sheets(blad1).Activate

Werkmappen en werkbladen
Werkblad
Werkblad selecteren:
Worksheets(blad2).Select

Je kan niet van op n werkblad een cel op een andere selecteren:


Stel we zitten op sheet Opgave
Sheets("Results").Range("A1").Select

Beter:
Stel we zitten op sheet Opgave
Sheets("Results").Select
Range("A1").Select

Werkmappen en werkbladen
Werkblad
Werkblad verbergen:
Worksheets(blad2).Visible = False

Verborgen werkblad selecteren:


Worksheets(blad2).Visible = True
Worksheets(blad2).Select
//...
Worksheets(blad2).Visible = False

Werkmappen en werkbladen
Werkblad
Werkblad cht verbergen:
Worksheets(blad2).Visible =
xlSheetVeryHidden

Wordt enkel terug zichtbaar na volgende statement:


Worksheets(blad2).Visible = True

Oefening 2
Open werkboek: les3_oef2_opgave.xls
Maak een functie CloseOtherWorkbooks() die:
Alle geopende werkboeken sluit, behalve de huidige
Een optionele parameter bOpslaan heeft
Deze parameter bepaald of je de andere werkboeken opslaat
of niet
Standaard waarde = True

Tip: bekijk het Application object


Maak een procedure procMain() die deze functie
oproept

Slide op basis van cursus Programmeren in Excel 2007 VBA van Peter Demasure

Oefening 2
Hoe testen?
Maak een nieuwe werkboek aan zonder wijzigingen
Maak een nieuwe werkboek aan met wijzigingen
Voer de procedure procMain() uit

Vragen
Welk gedrag neem je waar voor de verschillende
nieuwe workbooks?
Wat gebeurt er als je op Cancel drukt bij opslaan?
Werkt de optionele boolean?

Slide op basis van cursus Programmeren in Excel 2007 VBA van Peter Demasure

Werkmappen en werkbladen
Optionele parameters:
Optionele booleans zijn altijd False!
Private Sub CloseOtherWorkbooks(Optional bOpslaan As Boolean)
If ( IsMissing(bOpslaan) ) Then
bOpslaan = True
End If
'...
End Sub

bOpslaan krijgt standaard de waarde False,


dus methode IsMissing(bOpslaan) geeft ook altijd False terug,
want bOpslaan is niet meer leeg!

Werkmappen en werkbladen
Optionele parameters:
Oplossing:
Ofwel als type Variant meegeven
Private Sub CloseOtherWorkbooks(Optional bOpslaan As Variant)

Ofwel als type Boolean meegeven, maar met standaardwaarde in


functiedefinitie
Private Sub CloseOtherWorkbooks(Optional bOpslaan As Boolean = True)

Meer info: http://allenbrowne.com/ser-30.html

Oefening 3 (huiswerk)
Open werkboek: les3_oef3_opgave.xls
Maak een functie CreateWorkbook() die:
Een nieuw werkboek aanmaakt
De template sheet kopieert + hernoemt naar de maand (en
dit voor elke maand van het jaar)
De titel van de gekopieerde sheet wijzigt

De maanden steek je in een Array


Tip: ook arrays kan je overlopen met For Each ... Next
http://www.cpearson.com/excel/VBAArrays.htm

Oefening 3 (huiswerk)
Oplossing:

Oefening 4
Open werkboek: les3_oef4_opgave.xls
Maak een private functie CheckIfWorksheetExists()
die:
Controleert in de huidige werkboek of sheet met een
bepaalde naam al bestaat
Een ja/nee waarde (boolean) als resultaat teruggeeft
Parameters: WB en sheetnaam
Maak een procedure procMain() die deze functie oproept

Als de sheet nog niet bestaat:


Maak een nieuwe aan met de gekozen naam
De nieuwe sheet komt helemaal achteraan in de werkboek

Programmeren in Excel VBA beginners les 3

Herhaling les 1
Range > Rijen verwijderen
Programmeren in VBA
Functies en subroutines

User Defined Functions


Werkmappen en werkbladen
Het object Application
Event macro's
Excel 2003 vs. 2007

Het object Application


"Hoogste" object in Excel
Bv.
Application.WorkBooks(2).WorkSheest(3).Cell(2.1).select

Applicatie afsluiten:
Application.Quit

Applicatie afsluiten zonder opmerking van opslaan:


ActiveWorkbook.Saved = True
Application.Quit

Het object Application


Voortgangsacties van macro verbergen
Bv. opvullen van tabel bij exporteren uit HP Service Center
Application.ScreenUpdating = False

Voordeel: geen zichtbaar geknipper voor de eindgebruiker


Nadeel: programma lijkt te hangen tijdens uitvoering
Demo: les2_demo_screenupdating.xls

Programmeren in Excel VBA beginners les 3

Herhaling les 1
Range > Rijen verwijderen
Programmeren in VBA
Functies en subroutines

User Defined Functions


Werkmappen en werkbladen
Het object Application
Event macro's
Excel 2003 vs. 2007

Event macro's
Procedures gekoppeld aan gebeurtenissen in Excel
Werkboek

Nieuw werkboek
Werkboek openen
Werkboek opslaan
...

Werkblad:

Activeren
Aanklikken
Wijzigen
...

Alle events: http://www.mvps.org/dmcritchie/excel/event.htm

Event macro's
Werkboek
Private Sub Workbook_BeforeClose(Cancel As Boolean)
Private Sub Workbook_BeforePrint(Cancel As Boolean)
Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As
Boolean)
Private Sub Workbook_NewSheet(ByVal Sh As Object)
Private Sub Workbook_Open()
Private Sub Workbook_SheetActivate(ByVal Sh As Object)
Private Sub Workbook_SheetCalculate(ByVal Sh As Object)
Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)

Event macro's
Werkblad
Private Sub Worksheet_Activate()
Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As
Boolean)
Private Sub Worksheet_BeforeRightClick(ByVal Target As Range, Cancel As
Boolean)
Private Sub Worksheet_Calculate()
Private Sub Worksheet_Change(ByVal Target As Range)
Private Sub Worksheet_Deactivate()
Private Sub Worksheet_FollowHyperlink(ByVal Target As Hyperlink)
Private Sub Worksheet_SelectionChange(ByVal Target As Range)

Oefening 5
Open werkboek: les3_oef5_opgave.xls
Zorg ervoor dat:
Elke keer als je het werkboek opent,
De sheet "LEGENDE" geselecteerd wordt
Een welkomstbericht getoond wordt:

Bij opslaan op tabblad "log" een loglijn aangevuld


wordt
Deze loglijn mag maar nmaal per minuut geschreven
worden
Tip: format()

Oefening 5
Zorg ervoor dat:
Bij sluiten een afscheidsbericht getoond wordt
Als de gebruiker op "Nee" klikt, wordt het werkboek
niet afgesloten
Tip: Cancel parameter instellen

Programmeren in Excel VBA beginners les 3

Herhaling les 1
Range > Rijen verwijderen
Programmeren in VBA
Functies en subroutines

User Defined Functions


Werkmappen en werkbladen
Het object Application
Event macro's
Excel 2003 vs. 2007

Excel 2003 vs. 2007


Overview:
http://technet.microsoft.com/en-us/library/cc179188(office.12).aspx

Demo
http://mshelp.be/wat-zijn-de-verschillen-tussen-office-2003-en-office-200776.htm

Excel 2003 vs. 2007


Verschillen voor VBA:
The previously problematic FileSearch has been dropped
Dealing with shapes requires care
See Shapes and VBA code in Excel 2007
http://www.rondebruin.nl/shape.htm

Toolbar customisation changes with the advent of the Ribbon


See Change the ribbon in Excel 2007
http://www.rondebruin.nl/ribbon.htm

Graphics handling is reportedly very slow


Perform a Google search for: graphics 2007

Bron: http://www.eggheadcafe.com/software/aspnet/32278035/excel-2007-vbaversus-excel-2003.aspx

Excel 2003 vs. 2007


The easiest way to find this information is to follow
these steps in Excel 2007:

Press Alt+F11 to display the VBA Editor.


Press F1. The VBA Help system starts.
Click What's New.
Click Object Model Changes Since Microsoft Office 2003.

Bron: http://excel.tips.net/Pages/T006767_Excel_2007_VBA_Differences.html

Programmeren in Excel VBA beginners

Visual Basic Intro


De Visual Basic Editor (VBE)
Debuggen in VBA
Macros
Programmeren in VBA
Het object Range
User Defined Functions
Werkmappen en werkbladen
Het object Application
Event macro's
Excel 2003 vs. 2007

Variabelen
Constanten
Operatoren
Selecties en iteraties
Arrays
Functies en subroutines

Bedankt voor jullie aandacht!