Most Valuable Professional


View Jan Karel Pieterse's profile on LinkedIn subscribe to rss feed
Subscribe in a reader

Subscribe to our mailing list

* indicates required

Audit !!!

Probeer onze RefTreeAnalyser
de beste Excel formule auditing tool.

Cursussen

Excel VBA Masterclass (Engels)
Excel VBA voor Financials

Third party tools

Speed up your file

FastExcel
The best tool to optimise your Excel model!

Repair your file

Stellar Phoenix Excel Repair
Best tool to repair corrupt Excel sheets and objects
Home > Nederlandse site > Artikelen > Koppelingen UDFs herstellen > Geopende bestanden aanpassen
This page in English

Koppelingen naar UDFs in Addins herstellen

Het zojuist geopende bestand aanpassen

Zodra de invoegtoepassing detecteert dat de gebruiker een bestand opent moet actie ondernomen worden.

Allereerst checken we alle koppelingen in het bestand om te zien of er één bij is die bij onze invoegtoepassing hoort. Daarna checken we voor de zekerheid (dit is dus normaal gesproken niet nodig!) ook alle formules of deze onze UDF(s) gebruiken en werken deze desnoods apart bij.

De code hieronder staat in een "normale" module genaamd modProcessWBOpen:

Sub ProcessNewBookOpened(oBk As Workbook)
'-------------------------------------------------------------------------
' Procedure : ProcessNewBookOpened
' Company   : JKP Application Development Services (c) 2005
' Author    : Jan Karel Pieterse
' Created   : 2-6-2008
' Purpose   : Deze routine wordt gestart zodra een bestand geopend wordt.
' Aangeroepen vanuit: clsAppEvents.App_Workbook_Open en ThisWorkbook.Workbook_Open
'-------------------------------------------------------------------------
    'Soms is OBk gelijk aan nothing, dan niets doen.
    If oBk Is Nothing Then Exit Sub
    If oBk Is ThisWorkbook Then Exit Sub
    If oBk.IsInplace Then Exit Sub
    CheckAndFixLinks oBk
    ReplaceMyFunctions oBk
    CountBooks
End Sub

Sub CheckAndFixLinks(oBook As Workbook)
'-------------------------------------------------------------------------
' Procedure : CheckAndFixLinks Created by Jan Karel Pieterse
' Company   : JKP Application Development Services (c) 2008
' Author    : Jan Karel Pieterse
' Created   : 2-6-2008
' Purpose   : Checkt koppelingen naar deze invoegtoepassing
'             en fixt deze als ze niet juist zijn
'-------------------------------------------------------------------------
    Dim vLink As Variant
    Dim vLinks As Variant
    'Alle koppelingen ophalen
    vLinks = oBook.LinkSources(xlExcelLinks)
    'Als we geen koppelingen hebben, dan eindigen
    If IsEmpty(vLinks) Then Exit Sub
    For Each vLink In vLinks
        If vLink Like "*" & ThisWorkbook.Name Then
            'Een koppeling gevonden naar onze invoegtoepassing, omleggen
            'naar de huidige lokatie
            Application.DisplayAlerts = False
            oBook.ChangeLink vLink, ThisWorkbook.FullName, xlLinkTypeExcelLinks
            Application.DisplayAlerts = True
        End If
    Next
    On Error GoTo 0
End Sub

Private Sub ReplaceMyFunctions(oBk As Workbook)
'-------------------------------------------------------------------------
' Procedure : ReplaceMyFunctions Created by Jan Karel Pieterse
' Company   : JKP Application Development Services (c) 2008
' Author    : Jan Karel Pieterse
' Created   : 2-6-2008
' Purpose   : Zorgt dat alle functies naar deze invoegtoepassing wijzen
'-------------------------------------------------------------------------
    Dim oSh As Worksheet
    Dim oFirstFound As Range
    Dim oFound As Range

    On Error Resume Next
    'Zoek door alle werkbladen naar de UDF "UDFDemo("
    For Each oSh In oBk.Worksheets
        Set oFirstFound = _
        oSh.UsedRange.Cells.Find(what:="UDFDemo(", after:=oSh.UsedRange.Cells(1, 1), _
                                 LookIn:=xlFormulas, LookAt:=xlPart, _
                                 SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:=False)
        If Not oFirstFound Is Nothing Then
            'Gevonden, pas formule aan met juiste pad
            'We nemen even aan dat de functie NIET genest is!!!
            oFirstFound.Formula = "='" & ThisWorkbook.FullName & "'!" & _
                                  Right(oFirstFound.Formula, _
                                        Len(oFirstFound.Formula) - _
                                        InStr(oFirstFound.Formula, "My(") + 1)
            Set oFound = oFirstFound
            Do
                Set oFound = _
                oSh.UsedRange.Cells.Find(what:="UDFDemo(", after:=oFound, LookIn:=xlFormulas, _
                                         LookAt:=xlPart, SearchOrder:=xlByRows, _
                                         SearchDirection:=xlNext, MatchCase:=False)
                If Not oFound Is Nothing Then
                    'We nemen even aan dat de functie NIET genest is!!!
                    oFound.Formula = "='" & ThisWorkbook.FullName & "'!" & _
                                     Right(oFound.Formula, Len(oFound.Formula) - _
                                                           InStr(oFound.Formula, "My(") + 1)
                End If
            Loop Until oFound Is Nothing Or oFound.Address = oFirstFound.Address
        End If
    Next
End Sub

Lees het commentaar in de code om uit te vinden wat hier gebeurt.

Nou, dat zou het dan moeten zijn zou je denken. Niet helemaal. Soms wanneer je een bestand opent vanuit verkenner, dan heeft Excel dat bestand al open voordat je invoegtoepassing is geladen en geinitialiseerd. De koppelingen van dat bestand worden dan dus niet bijgewerkt.

Volgende pagina:  Werkmappen die geopend worden vanuit verkenner aanpassen.



Vragen, suggesties en opmerkingen

Al het commentaar over deze pagina:


Comment by: Jean-Pierre Degroote (11/9/2013 2:09:13 PM)

Dag Jan Karel,

Er ontgaat me iets in je code.


CheckAndFixLinks oBk
ReplaceMyFunctions oBk


Is ReplaceMyFunctions oBk nodig, voor zover ik kon testen met je file is dit niet nodig. Je geeft ook aan dat de UDF niet genest mag zijn.

1. Wat als je 20 functies in je add-in hebt? Welke moet je dan gaan zoeken en het is zelfs niet zeker dat ze gebruikt worden.
2. Hoe dan met genested functies?

Vriendelijke groeten,

JP

 


Comment by: Jan Karel Pieterse (11/9/2013 7:21:57 PM)

Hoi Jean-Pierre,

In principe is die ReplaceMyFunctions ook niet nodig, alleen CheckAndFixLinks zou afdoende moeten zijn.

Ik heb het echter ooit aan de hand gehad dat CheckAndfixlinks onvoldoende bleek.

 


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: www.eileenslounge.com.

Uw naam (verplicht veld):

Uw e-mail adres (Niet verplicht, dit adres wordt niet getoond)

Uw verzoek of commentaar:

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