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 > Invoegtoepassing bouwen > Ribbon Callbacks
This page in English

Bouwen van een invoegtoepassing voor Excel, ribbon callbacks

Ribbon load

Zodra het lint wordt vernieuwd wordt als eerste de callback aangeroepen die een verwijzing geeft naar het lint object. We gebruiken een object variabele op module niveau en wijzen het Ribbon object eraan toe:

Option Explicit

Dim moRibbon As IRibbonUI

Sub rxJKPSheetToolscustomUI_onLoad(ribbon As IRibbonUI)
    Set moRibbon = ribbon
End Sub

Zo. VBA onthoudt nu het ribbon object zodat we het lint vanuit onze code kunnen laten vernieuwen. Zodra het Excel bestand wordt geopened, wordt onLoad aangeroepen.

De dropdown voorzien van de tabnamen

Als het lint moet worden vernieuwd wordt als eerste de routine “rxJKPSheetToolsbtnSheets getItemCount” aangeroepen. In die routine moet worden doorgegeven aan het lint hoeveel werkbladen er in de lijst moeten worden geladen:

'Callback for rxJKPSheetToolsbtnSheets getItemCount
Sub rxJKPSheetToolsbtnSheets_Count(control As IRibbonControl, ByRef returnedVal)
    Dim lCt As Long
    Dim oSh As Object
    For Each oSh In Sheets
        If oSh.Visible = xlSheetVisible Then lCt = lCt + 1
    Next
    returnedVal = lCt
End Sub

De getoonde routine telt simpelweg het aantal zichtbare werkbladen in het huidige Excel bestand en geeft dat getal door aan de variabele returnedVal.

Vervolgens zal de routine “rxJKPSheetToolsbtnSheets getItemLabel” vanzelf dat aantal keer worden aangeroepen om de naam van ieder werkblad op te vragen, dus als er drie werkbladen zijn, wordt die routine drie keer aangeroepen om de naam van dat werkblad op te vragen:

Public Sub rxJKPSheetToolsbtnSheets_getItemLabel(control As IRibbonControl, Index As Integer, ByRef returnedVal)
    Dim lCt As Long
    Dim oSh As Object
    For Each oSh In Sheets
        If oSh.Visible = xlSheetVisible Then lCt = lCt + 1
        If lCt = Index + 1 Then
            returnedVal = oSh.Name
            Exit For
        End If
    Next
End Sub

Dus iedere keer dat deze routine wordt aangeroepen moet deze één tabnaam teruggeven.

Ik zou het zeer op prijs hebben gesteld als de makers van Excel slim genoeg waren geweest om vooraf te bedenken of tellers van lijstjes (collections) met het getal 0 of het getal 1 moeten beginnen. Maar dat hebben ze helaas niet gedaan, met als gevolg dat tellers dan weer bij 0, dan weer bij 1 beginnen in VBA.

Nadat de dropdown de tabnamen heeft opgehaald willen we de naam van het huidige tabblad tonen in die dropdown. Dat wordt gedaan door onderstaande callback:

'Callback for rxJKPSheetToolsbtnSheets getSelectedItemIndex
Sub rxJKPSheetToolsbtnSheets_getSelectedItemIndex(control As IRibbonControl, ByRef returnedVal)
    returnedVal = ActiveSheet.Index - 1
End Sub

En dan willen we natuurlijk ook nog naar eeh tab gaan als die uit de keuzelijst wordt gekozen:

Sub rxJKPSheetToolsbtnSheets_Click(control As IRibbonControl, id As String, Index As Integer)
    Dim lCt As Long
    Dim oSh As Object
    For Each oSh In Sheets
        If oSh.Visible = xlSheetVisible Then lCt = lCt + 1
        If lCt = Index + 1 Then
            oSh.Activate
            Exit Sub
        End If
    Next
End Sub

Weet je nog dat ik zei dat de index van de dropdown bij 0 begint? Nou, de index van Excel's tabbladen begint bij 1.

De knop de inhoudsopgave laten vernieuwen

O wacht, wezijn er nog niet; de knop om de inhoudsopgave te vernieuwen doet het nog niet. We hadden er al een lege Sub ... End Sub voor, dus laten we die gebruiken::

Sub rxJKPSheetToolsbtnInsertTOC(control As IRibbonControl)
    UpdateTOC
End Sub

Zo, dat was niet zo moelijk, wel?

Volgende: Zorgen dat het lint wordt bijgewerkt bij het wisselen van werkbladen


 


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: 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].