Trafficare coi Menù. - pagina vista: volte

Chi tra i lettori ha girato sui miei due siti, sicuramente avrà letto come la penso in merito agli "smanettoni" delle barre dei menù, ma continuando, gli imperterriti, a danneggiare i menù altrui, penso sia meglio chiarire alcune cose e proporre una soluzione, peraltro ben illustrata nei lavori di Elio Buonocore (vedi sezione "Lavori").

Le barre dei menù in Excel sono modificabili, spostabili, intercambiabili,  e si possono aggiungere nuove barre personalizzate, create dall'utente.

Quindi ognuno si imposta, sul proprio computer, le barre che più gli servono, e poste in un determinato ordine. Di solito sfruttiamo le opzioni che troviamo nel menù "Visualizza/Barre degli Strumenti", mettendo una spunta alla voce che ci interessa avere disponibile, e collocando le barre (sono "trasportabili") nelle posizioni a noi più consone. Queste modifiche vengono registrate da Excel e mantenute ad ogni successiva sua riapertura, qualunque sia la cartella che apriremo.

Passare un nostro lavoro che preveda l'inserimento di nuove barre menù o la modifica delle barre visualizzate, ad altri, vuol dire scombinare le impostazioni delle barre menù sul computer che ospiterà questo lavoro, con relative litanie e qualche vaffa da parte dello sfortunato utente.

I più attenti tra questi "smanettoni", sanno che è necessario cercare di ripristinare le barre dei menù alla chiusura della cartella di lavoro, e predispongono istruzioni appropriate per cercare di eliminare le barre ev. aggiunte, ma non potranno mai sapere, e quindi ripristinare, quante barre erano visibili, e in quale ordine lo sfigato utente aveva sul proprio Excel.

Per questi motivi mi permetterei di suggerire caldamente, specie ai neofiti del vba, di stare buoni con le barre dei menù e di lasciarli stare, se pensate di passare il vostro lavoro ad altri.

Ritornando invece a cose possibili, è possibile crearsi dei menù personalizzati senza interferire con i menù altrui.

Credo sia opportuno fare alcune precisazioni, iniziando col chiarire cosa sono menù e/o barre; i menù sono distribuiti su "Barre di Comando", in inglese "CommandBars". Noi siamo abituati ad usare il termine "Barra dei menù" per indicare la zona dove sono presenti le "voci dei menù" (File,Modifica,Visualizza,Inserisci,Formato,Strumenti,Dati,Finestra,?): anche questa appartiene alle CommandBars (insieme di..) e si chiama precisamente "MenuBar" ed è fissa, cioè non la si può spostare come avviene con le altre CommandBars, ma solo rendere visibile/invisibile, e tanto per intenderci è questa:

Delle altre CommandBars, alcune sono visibili di default, altre le si possono aggiungere dal menù "Visualizza/Barre degli Strumenti", e si posizioneranno sotto la MenuBar. Sempre di default, alcune CommandBars sono poste sulla stessa linea, e risultano "compresse" (questo in funzione di quante icone(pulsanti) sono inseriti sulle CommandBars), come in questo caso dove sono presenti sulla stessa linea la CommandBars "Standard" e quella "Formatting" che però, essendo compressa, mostra all'estrema destra questo segno ">>", che premuto, farà aprire un menù contestuale nel quale sarà possibile scegliere se "eliminare o aggiungere pulsanti", oppure "mostrare i pulsanti su due righe".

Scegliendo "mostra pulsanti su due righe", troveremo che la CommandBars "Formatting" verrà spostata tutta sulla riga successiva; (manovra questa che possiamo tranquillamente fare a mano, tra l'altro spostandola dove meglio ci tornerà rispetto alle altre CommandBars), così:

Mi sembra a questo punto evidente che l'inserimento di altre CommandBars , tra quelle usualmente messe a disposizione da Excel, potrà avvenire secondo nostri precisi criteri, mantenendo un ordine che ci saremo ottimizzati. E' questo modo di organizzarci i menù che non potrà mai essere conosciuto da altri che noi, e coloro che pensano di ripristinare i nostri menù, peccano di presunzione o peggio ancora di leggerezza.

Ma ritorniamo al motivo di questo articolo: esiste una zona tra i vari menù, che non potrà arrecare danni se eventualmente modificata: è quella zona nella MenuBar, dopo il punto di domanda. E' vuota, ed è appunto possibile, tramite istruzioni, aggiungere una "voce di menu" (Controls) e voci di sottomenù (popup), così:

E' stata aggiunta la voce "Mie Aggiunte" (o quel che preferite), e cliccandoci si apre il sottomenù, dove potremo inserire altri Controls (pulsanti di comando), ognuno accompagnato da una propria icona e da una descrizione della macro alla quale lo collegheremo per l'esecuzione della stessa.

La soluzione di Elio Buonocore mi sembra molto valida, specie se consideriamo che sarà possibile eliminare e raccogliere in un unico sottomenu, tutti i comandi in genere affidati a CommandButton posti (e a volte sparsi) sul foglio/fogli di lavoro.

Oltre tutto non aggiungiamo CommandBars "pellegrine" e quindi non modifichiamo impostazioni esistenti, con beneplacito mio e di quanti come me, non amano farsi ravanare la propria consolle.

L'evento migliore da sfruttare per far aggiungere una voce di menù è il Workbook_Open, ma ricordiamoci, dovremo  eliminare la nostra voce aggiunta, alla chiusura della cartella di lavoro o alla chiusura di Excel. Ricordo ancora, che modifiche alle CommandBars, se non ripristinate, restano anche per le successive sessioni su Excel.

Nel nostro esercizio non aggiungeremo CommandBars, ma useremo la CommandBars "MenuBar" esistente, aggiungendo una "voce". Le "voci" in realtà sono dei "Controls", cioè dei "pulsanti di comando". Per definire il tipo del "Controls" che stiamo aggiungendo, potremo usare uno degli argomenti MsoControlType che restituisce il tipo di controllo di una barra dei comandi; ce ne sono veramente parecchi (vedi guida in linea), noi useremo solo due tipi, il msoControlPopup che definisce un Controls destinato a formare un menù contestuale (appunto: popup) e il msoControlButton che avrà il compito di funzionare come se fosse un pulsante di comando. Il metodo che seguiremo sarà il metodo Add applicato all'oggetto Controls dell'oggetto CommandBars dell'oggetto Application.(purtroppo in Excel bisogna abituarsi a questa storia di "oggetti", di "oggetti figli di oggetti", di proprietà, di metodi di eventi, ecc. ecc. - a volte sembra di avere a che fare con una "matrioska")

Io presento istruzioni un pò diverse da quelle usate da Elio Buonocore, ma sono facilmente interpretabili e modificabili dai più. Il risultato ottenuto sarà quello visto nella quarta immagine dall'alto. Useremo solo tre proprietà legate ai Controls

  • la proprietà Caption  - che ci restituisce il testo (la "voce")  che vedremo nel menù

  • La proprietà FaceId  che determina l'aspetto (l'icona), ma non la funzione, di un pulsante di una barra dei comandi

  • La proprietà OnAction che restituisce o imposta il nome della macro che viene eseguita quando viene fatto clic sull'oggetto specificato.

Per quanto riguarda la Caption, ognuno scriverà il testo che più si addice alle sue esigenze, per quanto riguarda le icone da associare con FaceId, è necessario indicare un numero che identifica l'icona da allegare; poichè non è di facile reperibilità un elenco di icone associabili e loro numero di identificazione, allego a questo articolo un file di Excel nel quale troverete una bella varietà di icone e il loro numero di identificazione; basta selezionare l'icona che interessa e leggere nella finestrina "Contenuto cella" della barra della formula, il suo numero come immagine, oppure leggere il numero rappresentato dal numero riga e dal numero colonna indicati sul foglio: in questo esempio, il numero corrispondente per FaceId è 609

Non tutte le icone (e relativi numeri) saranno presenti su tutti i computer, dipende dal tipo di installazione eseguito, ma ce ne sono tante...Per quanto riguarda OnAction, basta dire che andrà indicato, tra doppi apici, il nome della macro da lanciare cliccando sul Controls.

Vediamo ora le istruzioni impiegate. Le istruzioni servono per aggiungere un menù popup, e sottomenù. L'argomento Temporary = True del metodo Add, è l'istruzione che elimina il menù popup e sottomenù alla chiusura di Excel. E' preferibile però, visto che si potrebbe chiudere la cartella ma non Excel, e riaprendo la stessa cartella si aggiungerebbe ancora un'altro Controls "Mie Aggiunte", decidere di eliminare la voce alla chiusura della cartella di lavoro, e per fare questo dovremo usare l'evento Workbook_BeforeClose per inserire l'istruzione Delete per l'eliminazione del menù aggiunto (vediamo la macro per ultima):

  • Private Sub Workbook_Open()
    Set myMenuBar = Application.CommandBars.ActiveMenuBar 
    Set NewMenu = myMenuBar.Controls.Add(Type:=msoControlPopup, Temporary:=True)
    NewMenu.Caption = "Mie Aggiunte"
     'il nome che appare sulla ControlBars MenuBar
    Set ctrl1 = NewMenu.CommandBar.Controls.Add(Type:=msoControlButton)
    'aggiungiamo il primo pulsante
    With ctrl1
    .FaceId = 352
    'impostiamo il numero dell'icona
    .Caption = "Import" 
    'impostiamo il testo che visualizzeremo nel sottomenù
    .OnAction = "pippo" 
    'scriviamo il nome della macro da lanciare
    End With
    Set ctrl2 = NewMenu.CommandBar.Controls.Add(Type:=msoControlButton)
    'ripetiamo per altri pulsanti
    With ctrl2
    .FaceId = 351
    .Caption = "Export"
    .OnAction = "pluto"
    End With
    Set ctrl3 = NewMenu.CommandBar.Controls.Add(Type:=msoControlButton)
    With ctrl3
    .FaceId = 350
    .Caption = "Magazzino"
    .OnAction = "quiquoqua"
    End With
    End Sub

Come notate, per ogni Controls si setta un numero successivo che definisce il nuovo Controls di tipo ControlButton; sarà possibile inserire quanti pulsanti vorrete, ottenendo il vostro menù personalizzato, sempre in vista, e raggiungibile da tutti i fogli. E senza aggiungere nuove CommandBars, ma solo Controls.

E questa l'istruzione per eliminare tutte le voci aggiunte, eliminando il Controls di popup:

  • Private Sub Workbook_BeforeClose(Cancel As Boolean)
    Application.CommandBars.ActiveMenuBar.Controls("Mie Aggiunte").Delete
    End Sub

Buon lavoro.

File con icone, scaricabile:

nome file dimensione n.download
CartellaconiconeID.zip 236 Kb

 

prelevato sul sito www.ennius.altervista.org