Programmeren in VBA_Karel Nijs

193
Programmeren in Excel VBA beginners Karel Nijs 2010/09

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