Bouwen van een invoegtoepassing voor Excel, De gebruikersinterface
Invoegtoepassingen zijn verborgen bestanden en hebben dus geen werkbladen waar je bijvoorbeeld knoppen op kunt zetten. Er is dus iets nodig zodat de gebruiker ermee kan werken zoals misschien invoerschermen. Of ze moeten werkbladen toevoegen waar de gebruiker data in in kan voeren. Deze invoegtoepassing gebruikt enkele elementen op het lint.
Lint aanpassingen
Onze invoegtoepassing heeft dus slechts een beperkte gebruikersinterface, alles wat er nodig is zal op het lint komen te staan. Lintaanpassingen doen is geen eenvoudige klus. Gelukkig zijn er enkele zeer goede bronnen met informatie te vonden:
- Ron de Bruin's website
- Hét boek over het lint: RibbonX: Customizing the Office 2007 Ribbon
Met hulp van de Custom UI Editor, open ik het bestand waarin we aan het werk zijn (Ik heb dit bestand daarvoor opgeslagen en Excel gesloten om conflicten te voorkomen.
Na openen in de editor voeg ik een "Office 2007 CustomUI part" toe aan het bestand:
Door deze variant te nemen zorgen ik ervoor dat de lintaanpassingen in alle volgende Excel versies werken:Excel 2007, 2010, 2013 en 2016. Vervolgens heb ik onderstaande XML code ingevoegd:
<customUI
xmlns="http://schemas.microsoft.com/office/2006/01/customui"
onLoad="rxJKPSheetToolscustomUI_onLoad">
<ribbon>
<tabs>
<tab
id="rxJKPSheetTools" label="SheetTools">
<group id="rxJKPSheetToolsGeneral" label="Sheet Tools">
<dropDown id="rxJKPSheetToolsbtnSheets"
getItemCount="rxJKPSheetToolsbtnSheets_Count"
getItemLabel="rxJKPSheetToolsbtnSheets_getItemLabel"
onAction="rxJKPSheetToolsbtnSheets_Click"
sizeString="MMMMMMMMMMMMMMMMMMMMMMMM"
label="Sheets"
getSelectedItemIndex="rxJKPSheetToolsbtnSheets_getSelectedItemIndex"
/>
<button id="rxJKPSheetToolsbtnInsertToc"
label="Table Of Contents"
size="large"
onAction="rxJKPSheetToolsbtnInsertToc"
imageMso="CustomTableOfContentsGallery" />
</group>
</tab>
</tabs>
</ribbon>
</customUI>
Na invoegen van die code ziet de Custom UI Editor er zo uit:
Van groot belang zijn de zogeheten callbacks die in de xml staan. Die geven aan dat er voor die acties VBA code in de werkmap in kwestie moeten staan. Door op de meest rechtse knop op de toolbar te klikken laat je de Custom UI editor de lege Sub ... End Sub kapstokken voor je genereren.
De xml bevat deze callbacks:
- onLoad (Aangeroepen wanneer het bestand wordt geopend)
- getItemCount (geeft het aantal elementen in een dropdown)
- getItemLabel (Haalt het n-de element van een dropdown op)
- onAction (Aangeroepen bij het klikken op een knop of het kiezen van een element uit een dropdown)
- getSelectedItemIndex (geeft door welk element in de dropdown moet worden geselecteerd)
Misschien is het je opgevallen wat voor complexe routinenamen ik heb gemaakt (zoals "rxJKPSheetToolsbtnSheets_Click"). Vooral het "rxJKPSheetTools" deel. Callback namen moeten namelijk strikt uniek zijn binnen de contaxt van een lopende instantie van Excel. En dan bedoel ik ook echt uniek. Geen enkel ander openstaand Excel bestand kan een callback hebben met een routinenaam die samenvalt met een andere. Is dat wel het geval, dan loop je de kans dat de routine in de andere werkmap wordt aangeroepen en kunnen dus zeer onverwachte dingen gebeuren. Daarom zet ik altijd een stukje tekst voor iedere routinenaam waardoor ik er zeker van kan zijn dat deze uniek zijn.
Na kopieren van de kapstokjes uit de Custom UI editor sla ik de werkmap op en open deze in Excel. Vervolgens plak ik ze in een module in het VBA project:
Sub rxJKPSheetToolscustomUI_onLoad(ribbon As IRibbonUI)
End Sub
Sub rxJKPSheetToolsbtnInsertTOC(control As IRibbonControl)
End Sub
'Callback for rxJKPSheetToolsbtnSheets getItemCount
Sub rxJKPSheetToolsbtnSheets_Count(control As IRibbonControl, ByRef returnedVal)
End Sub
Public Sub rxJKPSheetToolsbtnSheets_getItemLabel(control As IRibbonControl, Index As Integer, ByRef returnedVal)
End Sub
'Callback for rxJKPSheetToolsbtnSheets getSelectedItemIndex
Sub rxJKPSheetToolsbtnSheets_getSelectedItemIndex(control As IRibbonControl, ByRef returnedVal)
End Sub
Sub rxJKPSheetToolsbtnSheets_Click(control As IRibbonControl, id As String, Index As Integer)
End Sub
Hierna: code toevoegen aan de callbacks
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.