Koppelingen naar UDFs in Addins herstellen
Pagina's in dit artikel
- #Naam! fouten oplossen
- Bestand openen detecteren
- Geopende bestanden aanpassen
- 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.
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:
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.