Programmeren in VBA_Karel Nijs
Transcript of Programmeren in VBA_Karel Nijs
-
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
VBscript
Visual Basic
Visual Basic for Applications
-
Visual Basic intro
HARDWARE
INTERPRETER
Source Code (HLL)
COMPILER
Native Code
VB VB
VBA
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
VBA Basisfunctionaliteit(Microsoft en anderen)
Subset
Ms
Word
Subset
Ms
Excel
Subset
Ms
Access
Subset
Product
Y
Subset
Product
X
subset
specifieke
code
uniforme
code
tekening uit boek "VBA voor Word, Excel en Access"
-
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:
Bundeling van code
Scope = Project
Bv. module voor aansturing MindStorms
Bundeling van code
Scope = Werkboek
Project
Bundeling van code
Scope = Werkblad
-
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
Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, _
Cancel As Boolean)
Dim a As Boolean
a = MsgBox("Wil je cht opslaan?", vbYesNo)
If a = vbNo Then
Cancel = True
End If
End Sub
declaratie van variabelen vereist
procedure wordt opgeroepen bij elke save
variabele declaratie
functie met terugkeerwaarde
terugkeerwaarde opslaan
conditie die de variabele "a" test
-
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.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)
Debug.Print We beginnen met de lus
-
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/about-
macros-in-excel-HP005201201.aspx
Tutorial: http://www.helpwithpcs.com/tipsandtricks/microsoft-
excel-macro-tutorial.htm
-
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:
Oefening 1
Slide op basis van cursus Het gebruik van VBA in Ms Excel van Theo Peek
With ...
With ...
End With
End With
-
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).
Oefening 1
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 true or false
Integer 16 bits -> van - 2^15 tot 2^15 -1
Long 32 bits -> van - 2^31 tot 2^31 -1
Double 64 bits -> van - 2^63 tot 2^63 -1
Date bestemd voor datums
Object verwijzing naar object (bv. WorkSheet)
String tekengegevens (bv. "appel")
Variant 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 As
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
-
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
-
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"
MsgBox NAAM
NAAM = "nijs"
End Sub
MessageBox toont "karel"
Declaratie als constante
-
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 = operand operator operand
Bv. prijs = prijs * BTW
Soorten:
Rekenkundig:
+, -, *, /, \, ^ en Mod
Bv. a + 5
Vergelijking:
=, =, , is en like
Bv. If( 5 < prijs )
-
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.
If ( tegoed < 0 ) Then
MsgBox "Gelieve te betalen!"
End If
expressie moet valideren als "waar" -> true
wordt enkel uitgevoerd
expressie voldaan
einde van de conditie
begin
van de
conditie
-
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
Nadelen:
Veel typwerk
Niet duidelijk dat code bij elkaar hoort
If ( tegoed < 0 ) Then
MsgBox "Gelieve te betalen!"
End If
If ( tegoed > 0 ) Then
MsgBox "Correcte betaler!"
End If
-
Programmeren in VBA > Selecties en iteraties
If ... Then ... Else ... End If
Conditie
Als ... dan ..., anders ...
Bv.
If ( tegoed < 0 ) Then
MsgBox "Gelieve te betalen!"
Else
MsgBox "Correcte betaler!"
End If
expressie moet valideren als "waar" true
wordt enkel uitgevoerd
expressie voldaanbegin
van de
andere
optiewordt 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:
Maak een applicatie die:
Volgend bericht toont aan de gebruiker:
Als het resultaat = 0:
"(+) % = Perfecte deling"
Als het resultaat < 3:
"(+) % = Kleine afwijking"
Als het resultaat < 5:
"(+) % = Grotere afwijking"
Alle andere gevallen:
" is een te grote afwijking!"
Testdata:
5 en 3
10 en 7
12 en 7
841 en 711
Bv. (10 + 55) % 7 = 2 Kleine afwijking
-
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
MsgBox "Goede namiddag!"
Case Else
MsgBox "Hallo!"
End Select
slechts n van deze
mogelijkheden is geldig
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/select-case.htm
-
Programmeren in VBA > Selecties en iteraties
Select case
Opmerkingen:
Meerdere cases tegelijk behandelen:
Bv. Case 5, 3, 10
Een bereik behandelen:
Bv. Case 1 To 3
Bv. Case Is < 3
Ook andere types mogelijk:
Bv. Select Case strSportCase "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:
Eindgrens is inclusief
Teller verhoogt standaard telkens met 1
Stap is instelbaar (natuurlijke getallen):
For teller = beginpunt To eindpunt
...
Next
For teller = beginpunt To eindpunt Step 2
...
NextAndere voorbeelden: 100, -5, 7, -1, ...
wordt bij elke iteratie
uitgevoerd
-
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
For teller = beginpunt To eindpunt
MsgBox teller
Next
Toont: 5, 6, 7, 8, 9 n 10
geen step standaard = 1
-
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
-
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 VBA > Selecties en iteraties
-
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:
Slide op basis van cursus Programmeren in Excel 2007 VBA van Peter Demasure
Range("A1") = 50
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
beter!
Workbooks("Kalender.xls").Worksheets("Januari").Range("A1") = 50
nog beter!
perfect!
-
Het object Range
Voorbeeld:
Slide op basis van cursus Programmeren in Excel 2007 VBA van Peter Demasure
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
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!
-
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:
For Each cell in ActiveSheet.Cells
...
Next
collectietype Variant
-
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
Slide op basis van cursus Programmeren in Excel 2007 VBA van Peter Demasure
Range("5:5,8:8")Rij vijf en acht los van elkaar
Range("E:E,H:H")Kolommen vijf en acht, los van elkaar
Range("B4,E20")Cellen B4 en E20, los van elkaar
Rows("5:8")Rij vijf tot acht
Columns("E:H")Kolom vijf tot acht
Rows("5") of Rows("5:5") of
Range("F5").EntireRow
Vijfde rij
Columns("E") of Columns("E:E") of
Range("E3").EntireColumn
Vijfde kolom
Range("B4:E20") of
Range("B4","E20")
Vaste tabel van cel B4 tot en met cel E20
Range("C1")= "=A1 + B1"
Range("C1").Formula= "=Sum(A1:B1)"
De formule in cel C1 (eerste mogelijkheid)
De formule in cel C1 (tweede mogelijkheid)
Range("A1") = 5
Range("B1") = 3
Range("C1")=Range("A1")+Range("B1")
Het cijfermatig resultaat in cel C1
-
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: Range( C5 )
Dynamisch: 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
Slide op basis van cursus Programmeren in Excel 2007 VBA van Peter Demasure
Range("A1").CurrentRegion.Rows(1)De veldnamenrij van een dynamische tabel
beginnend in de linkerbovenhoek van het werkblad
Rows(5).Resize(3,0)Rij vijf tot acht
Columns(5).Resize(0,3)Kolom vijf tot acht
Rows(5) of Cells(5,lngKolom).EntireRow
Rows(lngIndex) of Cells(lngRij,lngKolom).EntireRow
Vijfde rij
Dynamische rij
Columns(5) of Cells(lngRij,5).EntireColumn
Columns (lngIndex) of
Cells(lngIndex).EntireColumn
Vijfde kolom
Dynamische kolom
Range("A1").CurrentRegion
Cells(lngRij, lngKolom).CurrentRegion
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.
Cells(lngRs,lngKs).Resize(lngRij,lngKolom)Tabel opgemaakt in VBA met
variabel aantal cellen en vlottende bovenhoek
Range(Cells(1,1), Cells(lngRij,lngKolom)) of
Cells(1,1).Resize(lngRij,lngKolom)
Tabel opgemaakt in VBA met
variabel aantal cellen en vaste bovenhoek
Cells(lngRij, lngKolom)Dynamische celverwijzing
Cells(5,4)De cel met adres D5
-
Range > Verwijzen naar het juiste
cellenbereik
Cellen en tabellen
Vast bereik:
Dynamisch bereik
Dynamisch in Excel
Slide op basis van cursus Programmeren in Excel 2007 VBA van Peter Demasure
Set rngTabel = WS.Range("A1:E20")
Set rngTabel = WS.Cells(1,1).Resize(lngRij, lngKolom)
Set rngTabel = WS.Range("A1").CurrentRegion
-
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
Oefening 2
-
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
-
Slide op basis van cursus Programmeren in Excel 2007 VBA van Peter Demasure
Range > Verwijzen naar het juiste
cellenbereik
rngTabel.Resize(,rngTabel.Columns.Count + 1)
Een kolom toevoegen van de tabel
rngTabel.Resize(rngTabel.Rows.Count - 1).Offset(1).Columns(1)
De eerste kolom van datablok van de tabel
rngTabel.Resize(rngTabel.Rows.Count - 1).Offset(1)
Het datablok van de tabel
Set rngRij = rngTabel.Rows(rngTabel.Rows.Count).Offset(1)
De eerste rij onder de tabel (waar bijv. de som terecht komt)
Set rngCel = rngTabel.Columns(rngTabel.Columns.Count)
De laatste kolom van een tabel
Set rngCel = rngTabel.Cells(rngTabel.Cells.Count)
De laatste cel van een tabel
Set rngCel = rngTabel.Cells(1)
De eerste cel (linkerbovenhoek) van een tabel (dit kan een der welke cel zijn!)
Set rngCel = WS.Cells(1)
De eerste cel (linkerbovenhoek) van een werkblad (dit is steeds cel A1)
-
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:
Verschil met If Else:
Geen ingebouwde grenzen
Teller zelf te implementeren
Voorwaarde zelf in te stellen in de body
Do While (voorwaarde = True)
...
Loop
wordt bij elke iteratie
uitgevoerd
-
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:
Verschil met Do While ... Loop:
Minstens n doorgang
Do
...
Loop While (voorwaarde = True)
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:
Verschil met Do While ... Loop:
Andere stopvoorwaarde: 'zolang' 'totdat'
Do Until (voorwaarde = True)
...
Loop
wordt bij elke iteratie
uitgevoerd
-
Programmeren in VBA > Selecties en iteraties
Do Until ... Loop
Equivalenten:
iTeller = 0
Do Until ( iTeller >= 6)
...
iTeller = iTeller + 1
Loop
iTeller = 0
Do While ( iTeller < 6)
...
iTeller = iTeller + 1
Loop
For iTeller = 0 To 5
...
Loop
For iTeller = 0 To 5 Step 1
...
Loop
iTeller = 0
Do
...
iTeller = iTeller + 1
Loop While ( iTeller < 6)
-
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:
Voorbeeld:
Maakt een array aan van Strings
Dim arrLeden(1 To 5) As String
arrLeden
arrLeden(1)
arrLeden(2)
arrLeden(3)
arrLeden(4)arrLeden(5)
startpositie eindpositie
-
Programmeren in VBA > Arrays
Arrays:
Voorbeeld:
Maakt een array aan van Strings
joris
arrLeden
arrLeden(1)
Dim arrLeden(1 To 5) As String
arrLeden(1) = "joris"
-
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:
Maakt een array aan van arrays van Strings
arrLeden
Dim arrLeden(1 To 5, 1 To 3) As String
arrLeden(1)
arrLeden(2)
arrLeden(3)
arrLeden(4)
arrLeden(5)
-
Programmeren in VBA > Arrays
Arrays:
Voorbeeld:
Maakt een array aan van Strings
arrLeden
arrLeden(1,2)
Dim arrLeden(1 To 5, 1 To 3) As String
arrLeden(1,2) = "joris"
joris
-
Programmeren in VBA > Arrays
Arrays:
Grootte later pas declareren:
Nuttig wanneer je de grootte op voorhand niet kent
Grootte heraanpassen lukt niet:
Dim arrLeden() As String
ReDim arrLeden(20) As String
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
Dim vItem As Variant
For Each vItem In arrLeden
...
Next
wordt uitgevoerd voor elk
element in de collectie
Variant type verplicht
Collectie; bv. array
-
Programmeren in VBA > Arrays
For Each Next:
Voorbeeld
Dim vItem As Variant
Dim saOrdersInFactuur(3) As String
saOrdersInFactuur(0) = beer
saOrdersInFactuur(1) = Lego
saOrdersInFactuur(2) = bal
saOrdersInFactuur(3) = 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
-
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 4a
-
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 4b
-
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:
Oefening 4c
-
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
Slide op basis van cursus Programmeren in Excel 2007 VBA van Peter Demasure
formule = (rij-index * aantal_kolommen)
+ kolomindex
Bijvoorbeeld: (1 * 6) + 1 = 7
Opgelet: rekening houden met offset: je
start niet altijd op rij 1, kolom 1!
6 kolommen
kolomindex
rij-index
-
Range > Opvullen & bewerken
Opmerkingen bij de oplossing:
Code herbruikbaar maken door ze in aparte procedures te steken
Parameters:
Optionele:
Controleren of meegegeven is:
Private Sub test( param1 as Long, Optional param2 as Variant)
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:
iTeller = 0
Do Until ( iTeller >= 6)
...
iTeller = iTeller + 1
Loop
iTeller = 0
Do While ( iTeller < 6)
...
iTeller = iTeller + 1
Loop
For iTeller = 0 To 5
...
Loop
For iTeller = 0 To 5 Step 1
...
Loop
iTeller = 0
Do
...
iTeller = iTeller + 1
Loop While ( iTeller < 6)
-
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: Range("A1")
Dynamisch voorbeeld: 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
Slide op basis van cursus Programmeren in Excel 2007 VBA van Peter Demasure
For Each rngCel In rngKolom.Cells
If UCase(rngCel) = "JAN" Then
rngCel.EntireRow.Delete
End If
Next rngCel
?
-
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
Slide op basis van cursus Programmeren in Excel 2007 VBA van Peter Demasure
For Each rngCel In rngKolom.Cells
If (UCase(rngCel) = "JAN) Then
rngCel.EntireRow.Delete
End If
Next rngCel
aha!
-
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 1a
Slide op basis van cursus Programmeren in Excel 2007 VBA van Peter Demasure
Maak een werkboek aan: les3_oef1b_oplossing.xls
Uitbreiding:
Verwijder enkel de rijen met Jan als naam n de datum in
oktober
Oefening 1b
-
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
Procedures steken altijd in modules
of
-
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:
Public Sub RijVooruit( )
...
If( ... ) Then Exit Sub
...
End Sub
naam
publieke toegang
uitbreken
einde
begin parameters
-
Programmeren in VBA > Functies en subroutines
Function ... End Function
Functie
Met n terugkeerwaarde
Type te specifiren in functiebeschrijving
Toekenning terugkeer- of functiewaarde door:
=
Uitbreken met: Exit Function
-
Programmeren in VBA > Functies en subroutines
Function End Function:
Voorbeeld:
Public Function GeefSnelheid( ) As Double
...
If( ... ) Then Exit Function
...
GeefSnelheid = 25.3
End Function
uitbreken
publieke toegang
einde
begin
naam
terugkeertype
terugkeerwaarde toekennen
parameters
-
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:
Waarom
Leesbaarder in sommige gevallen
Geen kommas nodig bij het ontbreken van optionele parameters
Bv. MsgBox Bericht, , Titel
MsgBox prompt:="Dit is het bericht", _
title:="Titel"
het nieuwe regel teken
-
Programmeren in VBA > Functies en
subroutines
Parameters - geavanceerd ByVal
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 )
ByRef
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:
Werkboek waarin je VBA procedure in uitgevoerd wordt:
Als je met meerdere werkboeken werkt, een werkboek activeren:
ActiveWorkbook
ThisWorkbook
ThisWorkbook.Activate
Windows(boek.xls).Activate
-
Werkmappen en werkbladen
Werkmap
Opslaan:
Sluiten:
Sluiten zonder op te slaan:
Workbook.Save
Workbook.SaveAs
Workbook.Quit
Workbook.Saved = True
Workbook.Quit
-
Werkmappen en werkbladen
Werkblad
Aka. Worksheet
Huidige werkblad:
Werkblad waarin je VBA procedure in uitgevoerd wordt:
Als je met meerdere werkboeken werkt, een werkboek activeren:
ActiveSheet
ThisWorkbook.ActiveSheet
ThisWorkbook.Sheets(blad1).Activate
Windows(boek.xls).Sheets(blad1).Activate
-
Werkmappen en werkbladen
Werkblad
Werkblad selecteren:
Je kan niet van op n werkblad een cel op een andere selecteren:
Beter:
Worksheets(blad2).Select
Stel we zitten op sheet Opgave
Sheets("Results").Range("A1").Select
Stel we zitten op sheet Opgave
Sheets("Results").Select
Range("A1").Select
-
Werkmappen en werkbladen
Werkblad
Werkblad verbergen:
Verborgen werkblad selecteren:
Worksheets(blad2).Visible = False
Worksheets(blad2).Visible = True
Worksheets(blad2).Select
//...
Worksheets(blad2).Visible = False
-
Werkmappen en werkbladen
Werkblad
Werkblad cht verbergen:
Wordt enkel terug zichtbaar na volgende statement:
Worksheets(blad2).Visible =
xlSheetVeryHidden
Worksheets(blad2).Visible = True
-
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
Oefening 2
Slide op basis van cursus Programmeren in Excel 2007 VBA van Peter Demasure
-
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?
Oefening 2
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
Ofwel als type Boolean meegeven, maar met standaardwaarde in
functiedefinitie
Meer info: http://allenbrowne.com/ser-30.html
Private Sub CloseOtherWorkbooks(Optional bOpslaan As Boolean = True)
Private Sub CloseOtherWorkbooks(Optional bOpslaan As Variant)
-
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 3 (huiswerk)
-
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
Oefening 4
-
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.
Applicatie afsluiten:
Applicatie afsluiten zonder opmerking van opslaan:
Application.WorkBooks(2).WorkSheest(3).Cell(2.1).select
ActiveWorkbook.Saved = True
Application.Quit
Application.Quit
-
Het object Application
Voortgangsacties van macro verbergen
Bv. opvullen van tabel bij exporteren uit HP Service Center
Voordeel: geen zichtbaar geknipper voor de eindgebruiker
Nadeel: programma lijkt te hangen tijdens uitvoering
Demo: les2_demo_screenupdating.xls
Application.ScreenUpdating = False
-
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)
-
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
Oefening 5
-
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-2007-
76.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-vba-
versus-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!
Programmeren_in_Excel_VBA_beginners_les1Programmeren_in_Excel_VBA_beginners_les2Programmeren_in_Excel_VBA_beginners_les3