Istruzione segreta fa Sparire/Riapparire il Ribbon
- Scritto da Gianni Giaccaglini
- Add new comment
- dimensione font riduci dimensione font aumenta la dimensione del font
Istruzione segreta fa Sparire/Riapparire il Ribbon di Microsoft Excel
Si tratta di istruzioni VBA di Excel 2007 (come pure di Excel VSTO) che permettono di occultare e, di fatto, disabilitare la barra multifunzione alias Ribbon, e, rispettivamente, risuscitarla.
E' una notizia, stupefacente per me come per molti, ma che allieta quanti, me incluso, hanno in uggia il troppo invadente Ribbon e/o desiderano implementare modelli applicativi più o meno chiusi per l’utente finale, magari semplicemente con una serie di pulsanti o icone con macro associate incorporate nel foglio (v. più avanti). La fonte di questa informazione è tal Giorgio Villa, ma ho avuto poi modo di verificarla e sperimentarla con successo io stesso.
Per farla breve, senza ulteriori preamboli, propongo subito la macro “toggle” (altalenante o basculante che dir si voglia) che segue così da consentire a chiunque di utilizzarla con estrema facilità:
Public CelaSvela As Boolean ' Definita a livello modulo (Dichiarazioni)
Sub CelaSvelaRibbon()
If Not CelaSvela Then
Application.ExecuteExcel4Macro "SHOW.TOOLBAR(""Ribbon"",False)"
Else
Application.ExecuteExcel4Macro "SHOW.TOOLBAR(""Ribbon"",True)"
End If
CelaSvela = Not CelaSvela
End Sub
Il va-e-vieni funziona a meraviglia, offrendo all’andata la massima visibilità alle celle del foglio.
Nota: L’opzione di riduzione a icona è un compromesso? Sì, ma richiede comunque un click aggiuntivo per l’accesso alle icone dei comandi...
Approfondimento necessario
A questo punto ho pensato di rivitalizzare un vecchio modellino didattico con questa rivelazione. Esso comprendeva codice macro, connesso a pulsanti sul foglio di lavoro, in grado l’uno di creare, l’altro di eliminare una certa barra menu personale temporanea, ovvero creata al volo, dinamicamente.
La speranza (ingenua) è andata subito delusa: purtroppo le barre degli strumenti (menu bar) personalizzate in Excel 2007 vengono imperiosamente inserite nella scheda (tab) Componenti aggiuntivi (add-in) del Ribbon, per cui facendolo sparire se ne va anche la nostra bella barra personale. Che ricompare, col successivo richiamo di CelaSvelaRibbon, che però si dimostra superfluo a questo scopo.
Qui sotto è illustrata, un po’ rozzamente, la situazione del Ribbon con la scheda Componenti aggiuntivi contenente a sua volta una certa barra personale:
HOME Inserisci Layout di pagina . . . . ecc. ecc. Componenti aggiuntivi
Primo menu Secondo menu Terzo menu ecc. ecc.
Barre degli strumenti personalizzate
Qui sorge spontanea una domanda: perché i Soloni di Redmond non hanno pensato di lasciare che le barre strumenti classiche continuassero a fluttuare liberamente sul foglio anziché essere ingabbiate nel Ribbon? Una ragione tecnica ci sarà? Mi astengo dal pronunciarmi, dico solo che è un peccato non abbiano potuto - o voluto? – farlo.
Alternative, discussioni e richiami vari
Tornando all’istruzione segreta, tutti avranno subito notato che si presenta come una funzione macro nata con Excel 4.0 e tuttora supportata negli appositi fogli del tipo Macro1, Macro2 eccetera. Per la cronaca, ho provato a inserirla, doverosamente preceduta da “=” in un foglio del genere ma non è successo nulla. In preda a una sindrome d’ingenuità ho poi pensato di poter eliminare quasi tutte le tab del Ribbon mantenendo in vita solo la predetta degli add-in. Ma istruzioni del tipo ExecuteExcel4Macro relative a tab non ne ho trovate proprio.
Nota: sempre per la cronaca, La Guida alla voce ExecuteExcel4Macro fornisce un solo esempio, ma di SHOW.TOOLBAR non parla proprio.
Al riguardo, il buon Giorgio Villa mi ha ricordato che l’unica possibilità potrebbe essere il ricorso a un Ribbon personalizzato.
Qui confesso di aver ultimamente trascurato se non perso di vista questo tema, comunque ne approfitto per indicare ai più esperti un elementare (sempre per i testé citati esperti) file CustomUI.xml dal contenuto seguente:
">http://schemas.microsoft.com/office/2006/01/customui">
button id="Button1" size="large" tag="NumCas" label="Inser. Numeri cas."
onAction="Foglio1.InserNumCasInSel" />
button id="Button2" size="large" tag="Lancia UserForm" label="Lancia UserForm"
onAction="Foglio1.LanciaUserForm" />
Si tratta per l’appunto di un archivio in format XML che può essere pazientemente creato a mano persino col Notepad o, meglio, con appositi Editor (potente, dicono, quello a corredo di Visual Studio 2005/2008).
L’esempietto sopra crea una sola tab contenente due soli pulsanti Button1 e Button2 cui vengono associate, con onAction, due certe routine VBA. Questa potrebbe essere la via per ottenere l’obiettivo appena sopra enunciato. Qualcuno ha voglia di percorrerla? Auguri e si faccia vivo se ha successo, mentre io dubito...
Infine riporto le macro suggerite dal sullodato Giorgio. In sostanza la sua soluzione, finalizzata alla creazione di un modello applicativo Excel, consiste nelle mosse seguenti:
- Annullare pro tempore il dannato Ribbon (e, inoltre, occultare tab dei fogli, barre di stato e delle applicazioni);
- Inserire in alto nel modello una sfilza di iconcine cui sono associate le sub cui l’utente è “costretto” a utilizzare;
- Ripristinare il Ribbon alla chiusura del modello.
Ma ecco, senza troppi commenti il codice proposto. Dovrebbe essere auto esplicativo, almeno per chi mastica l’ABC il linguaggio VBA:
Sub Auto_Open()
ViaRibbon
End Sub
Sub Auto_Close()
RipristinaRibbon
End Sub
Private Sub Workbook_Activate()
ViaRibbon
End Sub
Private Sub Workbook_Deactivate()
RipristinaRibbon
End Sub
Sub Emergenza() ' Ctrl+a
RipristinaRibbon
End Sub
Sub ViaRibbon()
If Val(Application.Version) 12 Then
'Excel 97-2003
Dim I As Integer
Set Barre = Application.CommandBars
For I = 1 To Application.CommandBars.Count
Barre(I).Enabled = False
Next I
Else
'Excel 2007 e seguenti
Application.ExecuteExcel4Macro "SHOW.TOOLBAR(""Ribbon"",False)"
End If
ActiveWindow.DisplayWorkbookTabs = False '(fogli)
With Application
.DisplayFormulaBar = False 'barra della formula
.DisplayStatusBar = False 'barra di stato
.ShowWindowsInTaskbar = True 'barra delle applicazioni di Windows
End With
End Sub
Sub RipristinaRibbon()
If Val(Application.Version) 12 Then
'Excel 97-2003
Dim I As Integer
Set Barre = Application.CommandBars
For I = 1 To Application.CommandBars.Count
Barre(I).Enabled = True
Next I
Else
'Excel 2007
Application.ExecuteExcel4Macro "SHOW.TOOLBAR(""Ribbon"",True)"
End If
ActiveWindow.DisplayWorkbookTabs = True '(fogli)
With Application
.DisplayFormulaBar = True 'barra della formula
.DisplayStatusBar = True 'barra di stato
.ShowWindowsInTaskbar = True 'barra delle applicazioni di Windows
End With
End Sub
Infine riporto, con scarni commenti, il codice essenziale di un modellino didattico volto a Creare/Eliminare una generica barra menu personale di tipo temporaneo. Si deve pensare a due pulsanti, etichettati con Crea barra menu personale e, rispettivamente, Elimina barra menu personale cui ho aggiunto un terzo pulsante Nascondi/Ripristina il Ribbon.
Public SwMiaBellaBarra As Boolean ' Switch a livello modulo
Public CelaSvela As Boolean ' Switch a livello modulo
Sub CelaSvelaRibbon()
If Not CelaSvela Then
Application.ExecuteExcel4Macro "SHOW.TOOLBAR(""Ribbon"",False)"
Else
Application.ExecuteExcel4Macro "SHOW.TOOLBAR(""Ribbon"",True)"
End If
CelaSvela = Not CelaSvela
End Sub
' Sub base per creare una barra temporanea personale
Sub CreaMenu(PBarra, VettMenu) ' VettMenu = vettore dei menu
Dim i As Integer
Set Bar = CommandBars.Add(Name:=PBarra, temporary:=True)
Bar.Visible = True
For i = 0 To UBound(VettMenu)
Bar.Controls.Add Type:=msoControlPopup
With Bar.Controls(i + 1)
.Caption = VettMenu(i)
End With
Next
End Sub
' Sub per creare una barra personale, con menu, voci e macro “On Action”
Sub CreaMenuSint(PBarra, VettMenu, VettVettVoci, VettVettMacro)
Dim i As Integer, j As Integer
Set Bar = CommandBars.Add(Name:=PBarra, temporary:=True)
Bar.Visible = True
For i = 0 To UBound(VettMenu)
Bar.Controls.Add Type:=msoControlPopup
With Bar.Controls(i + 1)
.Caption = VettMenu(i)
End With
Next
For i = 0 To UBound(VettVettVoci)
With CommandBars(PBarra).Controls(i + 1)
For j = 0 To UBound(VettVettVoci(i))
With .Controls
.Add
.Item(j + 1).Caption = VettVettVoci(i)(j)
.Item(j + 1).OnAction = VettVettMacro(i)(j)
End With
Next
End With
Next
End Sub
Questa è infine la Macro del pulsante Crea barra menu personale:
Sub provaCreaMenuSint()
If SwMiaBellaBarra Then
MsgBox "La barra c'è già", vbExclamation
Exit Sub
End If
Pbar = "Mia bella barra menu"
Vmenu = Array("Primo menu", "Secondo menu", _
"Terzo menu", "Quarto menu", "Quinto menu")
VVVoci = Array(Array("Voce 1", "Voce 2", "Voce 3"), _
Array("Voce 1", "Voce 2"), _
Array("Voce 1", "Voce 2", "Voce 3", "Voce 4"), _
Array("Voce 1", "Voce 2"), _
Array("Voce 1", "Voce 2", "Voce 3"))
VVMacro = Array(Array("Miamacro1_1", "Miamacro1_2", "Miamacro1_3"), _
Array("Miamacro2_1", "Miamacro2_2"), _
Array("Miamacro3_1", "Miamacro3_2", "Miamacro3_3", "Miamacro3_4"), _
Array("Miamacro4_1", "Miamacro4_2"), _
Array("Miamacro5_1", "Miamacro5_2", "Miamacro5_3"))
CreaMenuSint Pbar, Vmenu, VVVoci, VVMacro
SwMiaBellaBarra = True
End Sub
Macro del pulsante Elimina barra menu personale
Sub EliminaMiaBellaBarra()
If SwMiaBellaBarra Then
CommandBars("Mia bella barra menu").Delete
SwMiaBellaBarra = False
End If
End Sub
Ribbon vs. Barre personali: un bel dilemma…
Come s’è visto il Ribbon si presenta troppo barocco e invasivo agli occhi di chi progetta applicativi Excel più o meno chiusi per l’utente finale – al punto di fargli adottare la soluzione con pulsanti e/o icone che richiamano macro, previa scomparsa della vista del Ribbon grazie all’istruzione segreta qui illustrata.
Per restare al confronto fra il nuovo e il vecchio mondo, ossia Ribbon rispetto alle classiche barre personalizzate, i pro e i contro sono diversi (tanto per cambiare).
- Mi limito a considerazioni essenziali:
- In entrambi i casi non si scherza quanto a complicazioni;
- Il Ribbon consente risultati ergonomici più brillanti, né va trascurata la possibilità di modificarlo anche radicalmente, benché con procedimenti macchinosi che è facile scordare;
Essendo esterno al modello ha l’inconveniente che ci obbliga a crearlo PRIMA, inoltre sembra proprio che non ci sia verso di modificarlo dinamicamente tramite codice VBA (come avviene con le classiche menu bar); anche l’obbligo di definire a priori macro On Action è un fattore di ambiguità, se si riflette.
L’ultima cosa, tra l’altro, veicola confusione su come “arruolare” un Ribbon personale e su come ripristinare il Ribbon standard. Una cosa che si dimentica regolarmente, se non si progettano Ribbon mattino e sera.