Home Artikelen Index Links Nieuwsbrief

This page in EnglishHome > Artikelen Index > Invoegtoepassing bouwen >

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)
    Dim lCt As Long
    Dim oSh As Object
    For Each oSh In Sheets
        If oSh.Visible = xlSheetVisible Then lCt = lCt + 1
        If oSh.Name = ActiveSheet.Name Then
            returnedVal = lCt - 1
            Exit Sub
        End If
    Next
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: excelexperts.nl/forum/index.php.

Uw naam (verplicht veld):

Uw e-mail adres (Niet verplicht, dit adres wordt alleen gebruikt om u te informeren wanneer uw commentaar geplaatst wordt)

Uw verzoek of commentaar (max 2000 karakters):

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

Ik geef toestemming voor de verwerking van deze gegevens en voor de weergave van mijn naam en commentaar op deze website conform ons privacy beleid.