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

'-----------------------------------------------------------------------------------------------------------------------
' Auteur        : pascalterheege.nl
' Datum         : 31-12-2015
' Object        : modPersoon
' Doel          : persoonsgegevens lezen en schrijven
' Verwijzing    : zie klasse
' Bron          :
'-----------------------------------------------------------------------------------------------------------------------
Option Explicit

Dim Persoon As clsPersoon
'-----------------------------------------------------------------------------------------------------------------------
' Datum         : 31-12-2015
' Type          : Subroutine
' Opmerking     : klassenmodule initialiseren, procedures uitvoeren en klassenmodule sluiten
'-----------------------------------------------------------------------------------------------------------------------
Sub Plaatsen()
    
    Set Persoon = New clsPersoon
    
    Lezen
    Schrijven
    
    Set Persoon = Nothing
    
End Sub

'-----------------------------------------------------------------------------------------------------------------------
' Datum         : 31-12-2015
' Type          : Subroutine
' Opmerking     : persoonsgegevens laden a.d.h.v. ID (invoeren door gebruiker)
'-----------------------------------------------------------------------------------------------------------------------
Sub Lezen()

    Dim intID
    
    Do
        intID = InputBox("Geef het persoons-id op")
    Loop Until IsNumeric(intID)
            
    Persoon.ID = intID

End Sub
'-----------------------------------------------------------------------------------------------------------------------
' Datum         : 31-12-2015
' Type          : Subroutine
' Opmerking     : persoonsgegevens plaatsen in het actieve werkblad
'-----------------------------------------------------------------------------------------------------------------------
Sub Schrijven()

    [B1] = Persoon.ID
    [B2] = Persoon.Voorletter
    [B3] = Persoon.Voornaam
    [B4] = Persoon.Achternaam
    [B5] = Persoon.Geboortedatum

End Sub

Klassenmodule

'-----------------------------------------------------------------------------------------------------------------------
' Auteur        : pascalterheege.nl
' Datum         : 31-12-2015
' Object        : clsPersoon
' Doel          : persoonsgegevens uit een Access database halen a.d.h.v. ID
' Verwijzing    : activeX Data Objects 2.8
' Bron          :
'-----------------------------------------------------------------------------------------------------------------------
Option Explicit

Dim cn As ADODB.Connection
Dim rs As ADODB.Recordset

Private pID As Integer
Private pVoorletter As String
Private pVoornaam As String
Private pAchternaam As String
Private pGeboortedatum As Date
'-----------------------------------------------------------------------------------------------------------------------
' Datum         : 31-12-2015
' Type          : Constructor
' Opmerking     : database en recordset initialiseren
'-----------------------------------------------------------------------------------------------------------------------
Private Sub Class_Initialize()
    
    Set cn = New ADODB.Connection
    Set rs = New ADODB.Recordset
    
    With cn
       .ConnectionString = "Provider = Microsoft.ACE.OLEDB.12.0; Data Source = " & ActiveWorkbook.Path & "\Persoon.accdb"
       .Open
    End With

End Sub
'-----------------------------------------------------------------------------------------------------------------------
' Datum         : 31-12-2015
' Type          : Property
' Parameter     : Waarde
' Opmerking     : persoonsgegevens inlezen a.d.h.v. ID
'-----------------------------------------------------------------------------------------------------------------------
Public Property Let ID(Waarde)

    pID = Waarde
    
    With rs
        
        .Open "Select * from tblPersoon where ID = " & ID, cn
    
        If rs.EOF = False Then
    
            pVoorletter = .Fields("Voorletter").Value
            pVoornaam = .Fields("Voornaam").Value
            pAchternaam = .Fields("Achternaam").Value
            pGeboortedatum = .Fields("Geboortedatum").Value
        
        Else
        
            MsgBox "Persoon met ID " & ID & " is niet gevonden!", vbCritical
            End
        
        End If
    
    End With

End Property
'-----------------------------------------------------------------------------------------------------------------------
' Datum         : 31-12-2015
' Type          : Property
' Opmerking     : waarden teruggeven
'-----------------------------------------------------------------------------------------------------------------------
Public Property Get ID()

    ID = pID
    
End Property
Public Property Get Voorletter()

    Voorletter = pVoorletter
    
End Property
Public Property Get Voornaam()
    
    Voornaam = pVoornaam

End Property
Public Property Get Achternaam()

    Achternaam = pAchternaam

End Property
Public Property Get Geboortedatum()

    Geboortedatum = pGeboortedatum

End Property
'-----------------------------------------------------------------------------------------------------------------------
' Datum         : 31-12-2015
' Type          : Destructor
' Opmerking     : recordset en database sluiten
'-----------------------------------------------------------------------------------------------------------------------
Private Sub Class_Terminate()
       
    rs.Close
    cn.Close
    
    Set rs = Nothing
    Set cn = Nothing

End Sub

Download hier het oefenbestand.