Koppelingen naar UDFs in Addins herstellen

Pagina's in dit artikel

  1. #Naam! fouten oplossen
  2. Bestand openen detecteren
  3. Geopende bestanden aanpassen
  4. Werkmappen geopend via verkenner

Detecteren van het openen van een bestand

Allereerst moeten we kunnen opmerken dat er een werkmap wordt geopend. Dit kan middels een Klasse module. Deze klasse module zal een Workbook_Open event routine bevatten die gestart wordt zodra een bestand in Excel wordt geopend. Het maken van een dergelijke "event listener" omvat een paar stappen.

De klasse module maken

Voeg een nieuwe klasse module in in je project (Invoegen, Klasse Module). Verander in het venster eigenschappen de naam van de klasse module zoals hieronder aangegeven.

Een klasse module een naam geven via het eigenschappen venster

Voeg in deze nieuwe klasse module de volgende programmacode in:

'-------------------------------------------------------------------------
' Module    : cAppEvents
' Company   : JKP Application Development Services (c) 2008
' Author    : Jan Karel Pieterse
' Created   : 2-6-2008
' Purpose   : Handles Excel Application events
'-------------------------------------------------------------------------
Option Explicit

'This object variable will hold the object who's events we want to respond to
'Note the "WithEvents" keyword, which is what we need to tell VBA it is an object
'with events.
Public WithEvents App As Application

Private Sub App_WorkbookOpen(ByVal Wb As Workbook)
'-------------------------------------------------------------------------
' Procedure : App_WorkbookOpen Created by Jan Karel Pieterse
' Company   : JKP Application Development Services (c) 2008
' Author    : Jan Karel Pieterse
' Created   : 2-6-2008
' Purpose   : Runs code to redirect UDFs to this workbook
'-------------------------------------------------------------------------
    ProcessNewBookOpened Wb
End Sub

Private Sub Class_Terminate()
    Set App = Nothing
End Sub

Laten we dit in stukken hakken om te zien hoe e.e.a. werkt.

Public WithEvents App As Application

Dit is een declaratie regel. Die declareert een Object variabele genaamd "App" van het type "Application" (dit is Excel). Het WithEvents kenwoord vertelt Visual Basic dat je deze variabele wilt laten "luisteren"naar gebeurtenissen (events, denk aan events als tijden die je op je wekker hebt ingesteld; als een ingestelde tijd bereikt wordt, gaat de wekker af).

Private Sub App_WorkbookOpen(ByVal Wb As Workbook)

Deze regel markeert het begin van de event "luisteraar" voorhet Workbook_Open event.

Tip: Je kan zien welke events er ter beschikking staan door gebruik te maken van de twee dropdowns bovenaan het code venster:

De EVent drop-down bovenaan een code venster in de VBA editor

Zodra je in de rechter dropdown een event kiest, voegt de editor de juiste start en eind code van die routine voor je in, met -belangrijk- de juiste argumenten.

    ProcessNewBookOpened Wb

Deze regel roept de routine "ProcessNewBookOpened" aan om het openen van het bestand verder te verwerken. Handig genoeg heeft VBA al een object variabele doorgegeven aan de event routine waarin het zojuist geopende bestand is vervat: "Wb". Deze variabele wordt doorgegeven aan de verwerkingsroutine zodat deze weet met welk bestand er moet worden gewerkt.

Nu dit klaar staat moet VBA nog worden verteld hoe deze klasse gebruikt dient te worden. Voeg een normale module in en noem deze module modInit (dit is niet noodzakelijk, maar modules een naam geven is een goede gewoonte).

Plaats deze code in die module:

Option Explicit

'Maak een module niveau object variabele die een instantie van de
'event listener in het geheugen houdt (en dus actief)
Dim moAppEventHandler As cAppEvents

Sub InitApp()
    'Maak een neiuwe instantie van de cAppEvents klasse
    Set moAppEventHandler = New cAppEvents
    With moAppEventHandler
        'Vertel de klasse dat het naar de Excel applicatie moet "luisteren"
        Set .App = Application
    End With
End Sub

Wat hier gebeurt is vrijwel helemaal in de commentaar regels uitgelegd hierboven.

Hierna komt: de code die de koppeling verlegd naar onze invoegtoepassing



Vragen, suggesties en opmerkingen

Heeft u vragen, suggesties of opmerkingen? Gebruik dan dit formulier.

Mocht uw vraag niet direct relevant zijn voor deze pagina, maar een algemene Excel vraag betreffen, dan adviseer ik om deze hier te stellen: excelexperts.nl/forum/index.php.




Als u VBA code in uw commentaar plaatst, gebruik dan [VB] tags: [VB]Uw code[/VB].