Excel VBA - klassenmodule

Excel VBA bestaat uit meerdere ingebouwde objecten, zoals bijvoorbeeld het object Workbook. Dit object bestaat weer uit eigenschappen, methodes en gebeurtenissen. Voorbeelden van deze elementen zijn respectievelijk 'het aantal werkbladen', 'het sluiten van het werkboek' en het uitvoeren van instructies 'bij het openen van een werkboek'.

In VBA kan de programmeur zelf een object maken met behulp van een klassenmodule.

excel_vba_klassenmoduleIn dit voorbeeld wordt het zelf gedefinieerde object Persoon aangemaakt om aan de hand van een persoons-id de bijbehorende persoonsgegevens (eigenschappen) uit een Access database te halen.

Module

01'-----------------------------------------------------------------------------------------------------------------------
02' Auteur        : pascalterheege.nl
03' Datum         : 31-12-2015
04' Object        : modPersoon
05' Doel          : persoonsgegevens lezen en schrijven
06' Verwijzing    : zie klasse
07' Bron          :
08'-----------------------------------------------------------------------------------------------------------------------
09Option Explicit
10 
11Dim Persoon As clsPersoon
12'-----------------------------------------------------------------------------------------------------------------------
13' Datum         : 31-12-2015
14' Type          : Subroutine
15' Opmerking     : klassenmodule initialiseren, procedures uitvoeren en klassenmodule sluiten
16'-----------------------------------------------------------------------------------------------------------------------
17Sub Plaatsen()
18     
19    Set Persoon = New clsPersoon
20     
21    Lezen
22    Schrijven
23     
24    Set Persoon = Nothing
25     
26End Sub
27 
28'-----------------------------------------------------------------------------------------------------------------------
29' Datum         : 31-12-2015
30' Type          : Subroutine
31' Opmerking     : persoonsgegevens laden a.d.h.v. ID (invoeren door gebruiker)
32'-----------------------------------------------------------------------------------------------------------------------
33Sub Lezen()
34 
35    Dim intID
36     
37    Do
38        intID = InputBox("Geef het persoons-id op")
39    Loop Until IsNumeric(intID)
40             
41    Persoon.ID = intID
42 
43End Sub
44'-----------------------------------------------------------------------------------------------------------------------
45' Datum         : 31-12-2015
46' Type          : Subroutine
47' Opmerking     : persoonsgegevens plaatsen in het actieve werkblad
48'-----------------------------------------------------------------------------------------------------------------------
49Sub Schrijven()
50 
51    [B1] = Persoon.ID
52    [B2] = Persoon.Voorletter
53    [B3] = Persoon.Voornaam
54    [B4] = Persoon.Achternaam
55    [B5] = Persoon.Geboortedatum
56 
57End Sub

Klassenmodule

001'-----------------------------------------------------------------------------------------------------------------------
002' Auteur        : pascalterheege.nl
003' Datum         : 31-12-2015
004' Object        : clsPersoon
005' Doel          : persoonsgegevens uit een Access database halen a.d.h.v. ID
006' Verwijzing    : activeX Data Objects 2.8
007' Bron          :
008'-----------------------------------------------------------------------------------------------------------------------
009Option Explicit
010 
011Dim cn As ADODB.Connection
012Dim rs As ADODB.Recordset
013 
014Private pID As Integer
015Private pVoorletter As String
016Private pVoornaam As String
017Private pAchternaam As String
018Private pGeboortedatum As Date
019'-----------------------------------------------------------------------------------------------------------------------
020' Datum         : 31-12-2015
021' Type          : Constructor
022' Opmerking     : database en recordset initialiseren
023'-----------------------------------------------------------------------------------------------------------------------
024Private Sub Class_Initialize()
025     
026    Set cn = New ADODB.Connection
027    Set rs = New ADODB.Recordset
028     
029    With cn
030       .ConnectionString = "Provider = Microsoft.ACE.OLEDB.12.0; Data Source = " & ActiveWorkbook.Path & "\Persoon.accdb"
031       .Open
032    End With
033 
034End Sub
035'-----------------------------------------------------------------------------------------------------------------------
036' Datum         : 31-12-2015
037' Type          : Property
038' Parameter     : Waarde
039' Opmerking     : persoonsgegevens inlezen a.d.h.v. ID
040'-----------------------------------------------------------------------------------------------------------------------
041Public Property Let ID(Waarde)
042 
043    pID = Waarde
044     
045    With rs
046         
047        .Open "Select * from tblPersoon where ID = " & ID, cn
048     
049        If rs.EOF = False Then
050     
051            pVoorletter = .Fields("Voorletter").Value
052            pVoornaam = .Fields("Voornaam").Value
053            pAchternaam = .Fields("Achternaam").Value
054            pGeboortedatum = .Fields("Geboortedatum").Value
055         
056        Else
057         
058            MsgBox "Persoon met ID " & ID & " is niet gevonden!", vbCritical
059            End
060         
061        End If
062     
063    End With
064 
065End Property
066'-----------------------------------------------------------------------------------------------------------------------
067' Datum         : 31-12-2015
068' Type          : Property
069' Opmerking     : waarden teruggeven
070'-----------------------------------------------------------------------------------------------------------------------
071Public Property Get ID()
072 
073    ID = pID
074     
075End Property
076Public Property Get Voorletter()
077 
078    Voorletter = pVoorletter
079     
080End Property
081Public Property Get Voornaam()
082     
083    Voornaam = pVoornaam
084 
085End Property
086Public Property Get Achternaam()
087 
088    Achternaam = pAchternaam
089 
090End Property
091Public Property Get Geboortedatum()
092 
093    Geboortedatum = pGeboortedatum
094 
095End Property
096'-----------------------------------------------------------------------------------------------------------------------
097' Datum         : 31-12-2015
098' Type          : Destructor
099' Opmerking     : recordset en database sluiten
100'-----------------------------------------------------------------------------------------------------------------------
101Private Sub Class_Terminate()
102        
103    rs.Close
104    cn.Close
105     
106    Set rs = Nothing
107    Set cn = Nothing
108 
109End Sub

Download hier het oefenbestand.