Menu

Istruzione segreta fa Sparire/Riapparire il Ribbon

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:

<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>
      </tab>
    </tabs>
  </ribbon>
</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...

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:

  1. Annullare pro tempore il dannato Ribbon (e, inoltre, occultare tab dei fogli, barre di stato e delle applicazioni);
  2. Inserire in alto nel modello una sfilza di iconcine cui sono associate le sub cui l’utente è “costretto” a utilizzare;
  3. 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.

Ultima modifica ilVenerdì, 31 Gennaio 2014 08:52

Aggiungi commento


Codice di sicurezza
Aggiorna

Torna in alto