Koppelingen naar UDFs in Addins herstellen
Pagina's in dit artikel
- #Naam! fouten oplossen
- Bestand openen detecteren
- Geopende bestanden aanpassen
- Werkmappen geopend via verkenner
Werkmappen die geopend worden vanuit verkenner aanpassen
Om te zorgen dat de invoegtoepassing ook bestanden controleert die mogelijk al geopend zijn voordat de invoegtoepassing opgestart is, laat ik de invoegtoepassing ook een controle routine uitvoeren nadat deze volledig is gestart.Hiervoor gebruik ik de volgende code in het Workbook_Open event van de invoegtoepassing:
modProcessWBOpen.TimesLooped = 0
'Schedule macro to run after initialisation of Excel has
fully been done.
'Sometimes, the addin hasn't fully been initialised and the
'workbook we want checked is opened BEFORE we have fully
initialised the
'addin.
'This may happen when one double clicks a file in explorer
Application.OnTime Now + TimeValue("00:00:03"),
"CheckIfBookOpened"
Dus 3 seconden nadat de invoegtoepassing volledig geladen is, wordt de routine "CheckIfBookOpened" gestart. Na 20 keer stopt de code met controleren op nieuwe bestanden, aannemende dat er geen meer zijn en laten we dit proces volledig over aan de applicatie events in de klasse module die ik in de vorige bladzijden heb getoond.
Hieronder staat alle code in checkIfBookOpened (geplaatst in dezelfde module "modProcessWBOpen"). Merk op dat er twee module variabelen bovenaan de module zijn gedeclareerd:
Option Explicit
'Teller die bijhoudt hoeveel mappen er open zijn
Dim mlBookCount As Long
'Teller die het aantal keren bijhoudt dat gecontroleerd is
Private mlTimesLooped As Long
De rest van de code is:
Sub CheckIfBookOpened()
'-------------------------------------------------------------------------
' Procedure : CheckIfBookOpened
' Company : JKP Application Development Services (c) 2005
' Author : Jan Karel Pieterse
' Created : 6-6-2008
' Purpose : Controleert of een nieuwe werkmap is geopend.
'-------------------------------------------------------------------------
'Eerst checken of het aantal mappen is veranderd
If BookAdded Then
If ActiveWorkbook Is Nothing Then
mlBookCount =
0
'Verhoog het
aantal keren dat we de controle hebben uitgevoerd
TimesLooped =
TimesLooped + 1
'Is soms
nodig als Excel geopend wordt via Internet explorer
Application.Visible = True
If
TimesLooped < 20 Then
'Nog geen 20 keer gedaan, stel een nieuwe in om over 1 sec
'te laten uitvoeren
Application.OnTime Now + TimeValue("00:00:01"), "CheckIfBookOpened"
Else
'Al 20 keer uitgevoerd, we stoppen ermee
'en resetten de teller
TimesLooped = 0
End If
Else
ProcessNewBookOpened ActiveWorkbook
End If
End If
End Sub
Public Property Get TimesLooped() As Long
TimesLooped = mlTimesLooped
End Property
Public Property Let TimesLooped(ByVal lTimesLooped As Long)
mlTimesLooped = lTimesLooped
End Property
Function BookAdded() As Boolean
If mlBookCount <> Workbooks.Count Then
BookAdded = True
CountBooks
End If
End Function
Wat hier gebeurt is het volgende:
- Zodra de invoegtoepassing opent, tellen we het aantal open werkmappen
- We stellen in dat de macro CheckIfBookOpened moet worden uitgevoerd na enkele seconden zodat Excel de kans krijgt alle bestanden te openen en te initialiseren. Intussen krijgt Excel dan ook de kans het bestand te openen waarop gedubbelklikt is.
- CheckIfBookOpened controleert vervolgens of het aantal open mappen is veranderd. Zo ja, dan wordt "ProcessNewBookOpened" uitgevoerd.
Download het voorbeeld bestand
of
download de huidige broncode van github
Conclusie
Dat is het dan. Ik geef toe, deze methode is tamelijk ingewikkeld. Het kan goed zijn dat de twee alternatieve mogelijkheden die ik in het begin van dit artikel noemde eenvoudiger zijn en daarom beter bij jouw situatie passen.
Mocht je een alternatieve methode weten, aarzel dan niet om commentaar te geven!
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.