Ribbon personale dittatoriale
Grazie infinite a / Many thanks to
Frank Rice - Programmer writer
Microsoft Development Center
for very important helps he gave to me!
HO PUBBLICATO UN ARTICOLO PIU' AMPIO SUL RIBBONX NEL SITO DELLA DUKE ITALIA
:
www.dossier.duke.it (cod. doc. DK5833)
v. anche: www.programming.duke.it e www.dossier.duke.it
Il presente articolo fa seguito alla ricetta introduttiva sul RibbonX ovvero la nuova barra multifunzione modificabile in modo camaleontico mediante un file customUI.xml, secondo modalità che qui non riporto. Morale: i principianti si leggano tale articolo, altrimenti non capiscono un accidente:
http://blog.shareoffice.it/giannigiaccaglini/articles/8999.aspx"
Anche qui, per far contento l’editor di Shareoffice che s’impapocchia con parentesi angolari aperte e chiuse sono ricorso alla pezza oscena consistente nel sostituire “>” con “#”.
L’assoluto rigore sintattico dell’XML è poi un problema se non un incubo, specie all’inizio. I vari membri di Office 2007 che supportano RibbonX forniscono un semplice strumento che verifica la correttezza sintattica del codice XML del Ribbon, come ad esempio l'attributo onAction che venisse digitato come OnAction, più l'indicazione della mancanza o l'inesattezza di un argomento della routine VBA associata a un controllo. Tale funzione dev'essere attivata in ciascun applicativo Office. Le operazioni da compiere in Excel sono le seguenti:
- clic sul pulsante Office, poi scegliere le Opzioni di Excel;
- clic sulle Impostazioni avanzate, e spostarsi in basso fino alla sezione Generale;
- attivare infine la casellina "Mostra errori dell'interfaccia utente dei componenti aggiuntivi".
Ma che cos’è un’applicazione “dictatory”? Gli anglofoni qualificano come tali le applicazioni in genere e i modelli Excel in particolare che impediscono in tutto o in parte i comandi normali, prevedendo magari delle varianti programmatiche (gestite da macro) per alcuni di questi. Modelli chiusi del genere si possono fare anche in Office 2003, agendo sulle Commandbar. Un esempio per tutti:
Application.CommandBars("File").Enabled = False
Che disattiva l’intero menu File.
Un inconveniente di tale metodo è che occorre prevedere il ripristino delle barre disattivate sulla chiusura del modello (con effetti deleteri in caso di mancata chiusura regolare: anche su questo ho scritto un post). Sia come sia, con Office 2007 tutte le Commandbar default esistono solo sulla carta e vengono di fatto ignorate! Pertanto quella del RibbonX è l’unica via possibile.
StartFromScratch, madre di tutti i modelli (più o meno) chiusi
Va subito detto che fissando l’opzione StartFromScratch=”True” nella tag del Ribbon si ha in un sol colpo un’estrema chiusura del modello:
- Tutte le tab spariscono;
- Il (cosiddetto) menu Office, quello attivato con l’omonimo pulsante in alto a sinistra, mantiene tre soli comandi:Nuovo, Apri e Salva.
Una chiusura molto drastica (il massimo che si può fare col RibbonX) corrisponde al file customUI.xml seguente:
#customUI xmlns="http://schemas.microsoft.com/office/2006/01/customui">
#commands>
#!--disabilita i comandi Nuovo, Apri e Salva-->
#command idMso="FileNew" enabled="false" />
#command idMso="FileOpen" enabled="false" />
#command idMso="FileSave" enabled="false" />
#!—NB gli altri comandi sono eliminati da startFromScratch="true"-->
#/commands>
#ribbon startFromScratch="true" />
#/customUI>
Nota – I tre menu detti vengono sì disabilitati, ma non si possono occultare (salvo segreti improbabili, comunque a me ignoti). Infatti le tag non ammettono l’argomento visible, per cui un ipotetico tag seguente verrebbe rigettato:
<command idMso="FileNew" enabled="false" visible="false" />
A questo punto gli amanti della chiusura cum grano salis potrebbero accontentarsi aggiungendo una tab personale? Sì e no, perché potrebbero desiderare la scomparsa di altri comandi del menu Office o, per contro, la riapparizione di alcuni di quelli che StartFromScratch="true" disattiva, magari ridefinendone la funzione.
Uno schema XML ibrido
Quello che vado a proporre è uno schema caratterizzato da un pot pourri di svariate esigenze:
- Mantenere in vita la tab Home (così l’utente, poverino, può almeno modificare i grassetti, cornicette e formati numerici);
- Togliere di mezzo il comando Nuovo (è una cattiveria, ma per fini meramente didattici);
- Resuscitare il pulsante Stampa, però associandolo a una macro particolare “tanto per ridere”;
- In coerenza con il precedente assunto, disabilitare e occultare i pulsanti sottostanti al menu Stampa ossia: Stampa (pulsante, da non confondere col suo omonimo papà), Stampa immediata e Anteprima di stampa.
Nello schema che, finalmente!, espongo quei di seguito ho inserito commenti secondo il formato previsto dalla sintassi XML, ossia !--commento-- entro le fatidiche parentesi angolari. In tal modo è, perlomeno intuitivo per tutti il significato delle varie sezioni.
#customUI xmlns="http://schemas.microsoft.com/office/2006/01/customui">
#commands>
#command idMso="FileSave" />
#!—Disabilita il comando Nuovo-->
#command idMso="FileNew" enabled="false" />
#!—Associa il comando Stampa alla macro StampaCondiz-->
#command idMso="FilePrint" onAction="StampaCondiz" />
#/commands>
#ribbon startFromScratch="true">
#officeMenu>
#!—Abilita e mostra il menu Print-->
#menu idMso="FilePrintMenu" enabled="true" visible ="true">
#!—Disabilita i 3 pulsanti sotto il menu Print-->
#button idMso="FilePrintPreview" enabled="false" visible="false" />
#button idMso="FilePrint" enabled="false" visible="false" />
#button idMso="FilePrintQuick" enabled="false" visible="false" />
#/menu>
#/officeMenu>
#tabs>
#!—visualizza la tab Home-->
#tab idMso="TabHome" visible="true" />
#!—Inserisci una tab personale prima della tab Home-->
#tab id="CustomTab" label="Mia bella Tab" insertBeforeMso="TabHome">
#group id="GruppoEsempio" label="Macro varie">
#button id="Button1" size="large" tag="AggTotali" label="Aggiungi totali" onAction="AggTot"/>
#button id="Button2" size="large" tag="PiccoloTest" label="PiccoloTest" onAction=" PiccoloTest"/>
#/group>
#/tab>
#/tabs>
#/ribbon>
#/customUI>
Per comprendere bene il marchingegno è, in primo luogo, indispensabile esaminare il file ExcelRibbonControls.xls che è possibile scaricare (insieme a numerosi altri che documentano la – terrificante! – varietà del mondo RibbonX) dal link seguente:
http://msdn2.microsoft.com/en-us/office/aa905530.aspx
Per comodità del lettore, riporto solo una piccola parte del file predetto:
|
ControlName |
Control type |
Tab Set Name |
Tab Name |
Group Name |
|
FilePrintMenu |
splitButton |
None (Office Menu) |
Office Menu |
|
|
FilePrint |
Button |
None (Office Menu) |
Office Menu |
FilePrintMenu |
|
FilePrintQuick |
Button |
None (Office Menu) |
Office Menu |
FilePrintMenu |
|
FilePrintPreview |
Button |
None (Office Menu) |
Office Menu |
FilePrintMenu |
Tale sezione rivela che FilePrintMenu costituisce un gruppo facente parte della tab OfficeMenu e, insieme, è –si badi bene! - un menu, comprendente i pulsanti di comando (button) FilePrint, FilePrintQuick (stampa immediata) e FilePrintPreview (anteprima). Da queste notizie dovrebbe facilmente comprendersi il significato delle tag comprese tra #menu … e #/menu..., nonché il fatto che la prima, relativa a FilePrintMenu lo abilita e visualizza a onta della direttiva dittatoriale startFromScratch=”true” che lo vorrebbe defunto. Quanto ai button compresi nel menu Office gli specifici tag li tolgono di mezzo, come anticipato.
A questo punto apprendiamo che oltre che di tab Ribbonx si compone anche di menu!, con Office in testa. Ma non è finita, perché esistono altri componenti, in particolare i tag command incapsulati tra commands e /commands (comandi, ovviamente) , la qual cosa (diciamolo) crea una certa confusione, essendo oltretutto non citati nel fatidico ExcelRibbonControls.xls. In pratica sotto la veste command si ritrovano pulsanti built-in (o standard che dir si voglia) di ogni tipo, ossia non solo quelli facenti parte del menu Office (come inizialmente avevo pensato). Il loro richiamo entro una tag command ha lo scopo di ridefinirne il ruolo, con opportune macro onAction associate la cui azione predomina e sostituisce ( "override", in inglese) quella normale.
Mi fermo qui, perché questa è più che altro è una ricetta non un trattato. Spero soltanto di aver contribuito a chiarire una faccenda non del tutto limpida, ossia come far riapparire e sfruttare oggetti che la direttiva startFromScratch=”true” di per sé disabilita.
Possibili macro associate
La routine seguente, che prevarica (overrides) sul normale funzionamento del comando Stampa impone che la stampa avvenga solo al mattino, dio sa perché:
Sub StampaCondiz(ctrl As IRibbonControl, ByRef cancelDefault)
Dim Msg As String
Msg = "Buogiorno! Puoi Stampare" & vbLf & "solo al mattino! "
If Time > 0.5 Then
MsgBox Msg & " Spiacente..."
Else
MsgBox Msg & " Contento?"
ThisWorkbook.PrintPreview
End If
cancelDefault = False
End Sub
Quest’altra Sub, anch’essa puramente esemplificativa, viene invece scatenata dal primo pulsante della Mia bella tab e aggiunge la funzione =SOMMA() in una zona prede nominata “Totali” posta in fondo a un elenco con intestazioni:
Sub AggiungiTot(ByVal ctrl As IRibbonControl)
Dim RifCol As String
With Range("Totali")(0, 1)
RifCol = Range(.Cells(1), .End(xlUp)(2, 1)).Address(False, False)
End With
Range("Totali").Formula = "=SUM(" & RifCol & ")"
End Sub
Resterebbe la macro associate al secondo pulsante della tab appena detta, ma ognuno può crearsela a suo gusto. Ribadisco infatti che a patto di mantenere i nomi delle macro previste dal ribbon personalizzato il codice relativo può essere sempre modificato.
C’è di più. Un’altra interessante possibilità consiste nel salvare un file Excel (o Word ecc.) dotato di ribbon personalizzato in forma di add-in per richiamarlo con ogni nuovo file xlsm (o docm ecc.). Ecco, in breve, le mosse necessarie nel caso Excel.
- Creare un file del genere e salvarlo come add-in (componente aggiuntivo), ovvero in formato xlam, diciamo MioAddIn.xlam. Questo, si badi bene, verrà salvato nella directory specifica, di regola C:\Documents and settings\...\Microsoft\addins\.
- Creare un nuovo file, diciamo MioFile.xlsm;
- Nel menu Office scegliere Opzioni di Excel > Componenti aggiuntivi quindi nella casella a discesa Gestisci scegliere Componenti aggiuntivi di Excel e dare un clic sul pulsante Vai.... Vedremo un elenco tra cui compare il lupus in fabula MioAddIn.
- Scegliendolo vedremo il Ribbon modificarsi come previsto. Modificare opportuna mente le macro associate ai vari controlli personali e salvare MioFile.xlsm.
Le possibilità del RibbonX sono moltissime altre, ad esempio con controlli complessi (combo box e tantissimi altri) e raffigurati con immagini. Ce n’è per tutti i gusti, ma per questa seconda puntata ci possiamo accontentare.
?>
?>
?>
?>