Personalizzare il Ribbon con VBA
Questo esempio risponde ad una specifica richiesta ad un post precedente e mi permette di affrontare un argomento leggermente diverso da quelli visti finora: la personalizzazione del Ribbon a livello di documento (document-level) e non a livello di applicazione.
Il quesito era: "Come posso personalizzare il Ribbon di un file di Excel facendo in modo che ci siano solo le mie schede, che per gli altri file il Ribbon torni ad essere quello standard e utilizzando VBA?".
Ecco la risposta.
Creazione del file xml con la struttura del Ribbon
Il nostro esercizio prevede una scheda personalizzata con due gruppi di funzionalità; nel primo gruppo ci sono due comandi per l'ordinamento di un elenco; nel secondo gruppo un comando per la trasformazione di formule in valori. Il file di esempio si chiama ExcelCustomRibbonVBA.xlsm e lo trovate in allegato.
La struttura del ribbon deve essere contenuta in un file xml che potete scrivere con un normale editor di testi o con un apposito editor XML. In alternativa, se avete fatto delle prove con Visual studio o avete scaricato gli allegati ai post precedenti, potete utilizzare un file Ribbon.xlm e modificarlo.
Dopo aver creato il file:
- assegnarvi il nome customUI.xml;
- salvarlo all'interno di una cartella di nome customUI, da posizionare, ad esempio, sul desktop.
il contenuto del file xml è il seguente:
------------------------------------------------------------------------------------------------------------------------------
<customUI xmlns="http://schemas.microsoft.com/office/2006/01/customui" >
<ribbon startFromScratch ="true">
<tabs>
<tab id="FunctionsTab"
label="Funzioni personalizzate">
<group id="RangeFunctionsGroup"
label="Funzioni di intervallo">
<button id="OrdinaPerProdotto"
size="large"
label="Ordina per prodotto"
screentip="Seleziona l'intervallo a partire dalla cella corrente e ordina per prodotto"
onAction="ThisWorkbook.MyFunctions"
imageMso="AddressBook"/>
<button id="OrdinaPerAgente"
label="Ordina per agente"
size ="large"
screentip="Seleziona l'intervallo a partire dalla cella corrente e ordina per agente"
onAction="ThisWorkbook.MyFunctions"
imageMso="PropertySheet" />
</group>
<group id="GeneralFunctionsGroup"
label="Funzioni del foglio">
<button id="TrasformaInValori"
size="large"
label="Trasforma formule in valori"
screentip="Trasforma in valori le formule contenute nell'intervallo selezionato"
onAction="ThisWorkbook.MyFunctions"
imageMso="Paste" />
</group>
</tab>
</tabs>
</ribbon>
</customUI>
------------------------------------------------------------------------------------------------------------------------------
Nascondere le schede standard del Ribbon
L'attributo del ribbon startFromScratch ="true" fa sì che le schede predefinite del Ribbon vengano nascoste per lasciare posto solo a quelle personalizzate.
Callback VBA
In questo caso, le callback del del ribbon puntano alla subroutine MyFuncions contenuta nella cartella di lavoro, nel modulo ThisWorkbook: onAction="ThisWorkbook.MyFunctions"
Subroutine MyFunction
- Creare un file di excel con l'estensione xlsm, che abilita il salvataggio delle macro;
- aprire il foglio di codice ThisWorkbook e creare la sub MyFunction che eseguirà le diverse operazioni in corrispondenza dell'ID del comando chiamato dal ribbon:
Sub MyFunctions(ByVal myControl As IRibbonControl)
Dim myRng As Range
Select Case myControl.ID
Case "OrdinaPerProdotto"
Set myRng = Range("A1").CurrentRegion
myRng.Sort Range("B:B"), , , , , , , xlYes
Case "OrdinaPerAgente"
Set myRng = Range("A1").CurrentRegion
myRng.Sort Range("A:A"), , , , , , , xlYes
Case "TrasformaInValori"
Set myRng = Selection
myRng.Copy
myRng.PasteSpecial xlPasteValues
End Select
End Sub
Collegare il file customUI.xml al file di Excel
Per far sì che il file di Excel applichi la struttura personalizzata del nuovo ribbon, è necessario eseguire le seguenti operazioni:
- modificare l'estensione del file di excel con .zip;
- aprire il pacchetto e trascinarvi la cartella customUI contenente il file xml;
- aprire la cartella _rels e trascinare il file .rels sul desktop per apportare la modifica necessaria al collegamento tra il file di excel e il nuovo ribbon;
- nel file .rels, prima della chiusura delle Relationship, inserire la riga in grassetto:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<Relationships xmlns="http://schemas.openxmlformats.org/package/2006/relationships">
<Relationship Id="rId3" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/extended-properties" Target="docProps/app.xml"/>
<Relationship Id="rId2" Type="http://schemas.openxmlformats.org/package/2006/relationships/metadata/core-properties" Target="docProps/core.xml"/>
<Relationship Id="rId1" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/officeDocument" Target="xl/workbook.xml"/>
<Relationship Id="customUIRelID" Type="http://schemas.microsoft.com/office/2006/relationships/ui/extensibility" Target="customUI/customUI.xml"/>
</Relationships>
Osservazione.
L'attributo Target è uguale al nome del file xml preceduto dalla cartella che lo contiene.
- salvare e chiudere il file.rels;
- trascinare nuovamente il file.rels nella cartella di orginie;
- chiudere il pacchetto zip e ripristinare l'estensione xlsm;
- aprire il file di excel così modificato ed ecco il risultato:

Come sempre, in allegato trovate il file completo e il file customUI.xml
Ciao a tutti
Laura