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

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.




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