[ Segnalo inoltre ORARIO SCOLASTICO RIVISITATO, nella Sezione Articoli ]
Istruzione segreta per far sparire/riapparire il Ribbon
By G.G. & Giorgio Villa
Questa notizia, stupefacente per me come pure per molti!, mi proviene da Giorgio Villa un valido visitatore. Le seguenti istruzioni in VBA Excel 2007, come pure negli Excel VSTO, permettono di togliere dalla vista e, di fatto, disabilitare la barra multifunzione alias Ribbon, e, rispettivamente, risuscitarla:
Application.ExecuteExcel4Macro "SHOW.TOOLBAR(""Ribbon"",False)" 'Occulta Ribbon
Application.ExecuteExcel4Macro "SHOW.TOOLBAR(""Ribbon"",True)" 'Ripristina Ribbon
La notizia farà la gioia di 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).
Vado senza indugi in medias res con la macro “toggle” (altalenante o basculante che dir si voglia) seguente
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 la massima visibilità alle celle del foglio.
Nota – L’opzione di riduzione a icona è un compromesso? Sì ma richiede comunque un clic aggiuntivo per l’accesso alle icone dei comandi...
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. 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 Redmon 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
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:
riportare un elementare file CustomUI.xml dal contenuto seguente:
<customUI xmlns="http://schemas.microsoft.com/office/2006/01/customui">
<ribbon>
<tabs>
<tab id="CustomTab" label="Mia Tab">
<group id="SampleGroup" label="Sample Group">
<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" />
</group>
< SPAN>tab>
< SPAN>tabs>
< SPAN>ribbon>
< FONT>customUI>
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 quin...
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.
Inoltre le macro sono previste sia per Excel 2007 che per le precedenti versioni 97-2003 (nel qual caso ovviamente il Ribbon non viene trattato ma sono nascoste le vecchia barre strumenti).
Ma ecco, senza troppi commenti il codice proposto. Dovrebbe essere auto esplicativo, almeno per chi mastica l’ABC del VBA, comunque prometto che appena ho tempo pubblicherò l’intero modellino.
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
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 complicanze (e conseguenti incubi sintattici);
- 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 poi 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.