Un Ribbon spartano ma efficace per Excel (e chi si accontenta)
Con l’avvento della barra multifunzione, Ribbon in inglese, vecchi utenti di Excel continuano a rimpiangere i pur vetusti (e obsoleti? No comment) menu e soprattutto la possibilità di creare barre personalizzate, adatte a questo o quel modello. Queste in verità restato in vita su modelli creati in precedenza, purtroppo confinate in cartelle chiuse (perdendo una delle loro virtù, il floating e le macro associate sono garantite.
Nota. Con qualche spiacevole incompatibilità, perché non pochi metodi e proprietà sono stati occultati e, addirittura, annullati. Il caso più imbarazzante è FileSearch. Digitando “Application.” Il magico intellisense non lo fornisce, ma si forza Application.Filesearch poi tale mago ce ne dà tutti i vari figli, come LookIn, FindFiles, Execute ecc. Un’illusione che dura poco, perché tali verbi danno errore a run-time.
Intendiamoci, si può sempre creare un Ribbon personalizzato e anch’io ne ho parlato su questo blog ma l’operazione, da compiere con un (ostico) testo XML, è macchinosa. E in parte delude, ma non è di questo che qui voglio parlare.
Far sparire il Ribbon
Con Excel VBA si può. Accontento impazienti & curiosi mostrando il piccolo segreto con una macro altalenante:
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
Le istruzioni segrete sono in grassetto e volendo si può inserire la prima nella routine dell’evento Open e, la seconda, in quella di BeforClose per occultare il ribbon all’utente e, rispettivamente, ripristinarglielo.
La semplice ricetta, inizialmente ingenua...
La scomparsa del nastrone si può giustificare in un modello più o meno chiuso per l’utilizzatore ma ovviamente abbiamo l’obbligo morale di offrire alla sua vista oggetti su cui cliccare per lanciare operazioni compiute da codice VBA. A tale scopo, l’ideuzza consiste nell’utilizzare la riga 1 opportunamente larga come ricettacolo, quantomeno, di pulsanti ivi incorporati. Con due mosse:
1. Selezionare una cella a riga2;
2. Dalla tab Visualizza scegliere Blocca riquadri > Blocca riga superiore.
In tal modo la prima riga resta fissa e visibile mentre si fa lo scrolling verso il basso e può ospitare titoli e oggetti vari cui associare macro secondo modalità che do per arcinote (altrimenti che ci state a fare qua? Tornate quando la sapete un po’ più lunga...).
Il più delle volte ci si accontenta di un’associazione uno a uno. Ma se volessi una specie di menu con opzioni multiple? Si può, si può. Ed ecco la ricetta finale, che sfrutta una ComboBox rispetto alla quale i più bravi faranno spallucce (ce lo sapevo, ce lo sapevo!) mentre le masse credo che ammetteranno di non averci mai pensato. Infatti tutto il mondo o quasi (me compreso) usano tali caselle per attingere valori da un elenco.
Ma ecco il da farsi, in dettaglio:
1. Scheda Sviluppo, poi Modalità progettazione ;
2. Tab Inserisci > Controlli ActiveX > Casella combinata;
3. Selezionare la ComboBox, posizionarla e dimensionarla sulla riga 1 e assegnarle, almeno, la proprietà Caption in modo consono a quel tal caso applicativo;
4. Inserire in una zona di celle, diciamo H2:H5, meglio se denominata “Opzioni” (*), i testi “Questo”, “Codesto”, “Quello” e “Nulla” , di deprecabile umorismo (ma è solo per fare un esempio a casaccio);
5. Fissare la proprietà ListFillRange a Opzioni, lasciando indefinita la LinkedCell che qui non serve e disattivare la Modalità progettazione. Ovviamente ora cliccando sul controllo si accede alle buffe scelte predette.
Nota (*) In tal modo si può spostare l’intervallo senza che la ComboBox cambi le sue scelte. Un altro modo per toglierlo alla vista dell’utente è assegnare il colore bianco ai caratteri delle celle Opzioni, mentre il formato nascosto ;;; non va bene (la ComboBox mostrerebbe tutte opzioni blank.
6. Il discorso si chiude con il possibile codice macro qui sotto riportato (ma attenzione!, esso presenta un malfunzionamento imprevisto...).
Dim ComboAttivato As Boolean ' Variabile a livello Dichiarazioni
Private Sub ComboBox1_Click()
ComboAttivato = Not ComboAttivato ' Toggle da True a False e viceversa
If ComboAttivato Then
Scelta = ComboBox1.Text ' Va bene anche ComboBox1.Value
Select Case Scelta
Case "Questo"
MsgBox "Prima scelta" ' O, meglio, codice ad hoc
Case "Codesto"
MsgBox "Seconda scelta" ' O, meglio, codice ad hoc
Case "Quello"
MsgBox "Terza scelta" ' O, meglio, codice ad hoc
Case "nulla"
MsgBox "Quarta scelta" ' O, meglio, codice ad hoc
End Select
' ComboBox1.Enabled = True 'EVITARE!
' (Valido solo per NON usare più il combo)
ComboBox1.ListIndex = 0 ' Pone la prima scelta
ActiveCell.Select
' Torna alla cella attiva (disattivando di fatto il controllo)
End If
End Sub
A questo punto, per pigrizia più che per sadismo, affermo che i commenti incorporati dovrebbero bastare. Dico solo che il booleano ComboAttivato evita un comportamento, all’inizio, inatteso: senza di esso e in assenza di If ComboAttivato... End If l’istruzione ComboBox1.ListIndex = 0, in verità non indispensabile ma che serve a rimettere in vista la prima scelta (contro sconcerti dell’utente), scatena a sorpresa un evento che lancia comunque MsgBox “Prima scelta”.
Di questo incredibile dictu non è facile darsi piena ragione. Ma chi se ne impipa? La pezza di ComboAttivato dovrebbe funzionare. Ahimè NON è così, inoltre si scopre un altro inghippo che la macro d’evento mette in luce. Pensa e ripensa la causa di questi guai è presto trovata e la corretta soluzione pure.
La riporto dopo una serie di righe intenzionalmente vuote, invitando a non leggerla, ossia sforzandosi di trovarla da soli.
RIGA VUOTA
RIGA VUOTA
RIGA VUOTA
RIGA VUOTA
RIGA VUOTA
RIGA VUOTA
RIGA VUOTA
RIGA VUOTA
RIGA VUOTA
RIGA VUOTA
RIGA VUOTA
RIGA VUOTA
RIGA VUOTA
La ricetta semplice, e funzionante
La causa dei malfunzionamenti di cui sopra è presto detta: l’evento Click del ComboBox equivale all’evento Change e come questo si scatena se e solo se viene scelta un’opzione diversa da quella corrente.
Il rimedio è presto trovato. Non basta un ComboBox, occorre aggiungervi un pulsante che lanci il codice relativo alle varie opzioni, dopo aver selezionato quella voluta agendo sulla frecciotta a destra del Combo. La situazione è rozzamente raffigurata qui sotto:
|
Scelte Varie |
|
|
Questo |
V |
|
SCEGLI |
|
Etichetta (rettangolo arrot. )
ComboBox1
CommandButton4
E il codice VBA? È quasi identico a quello dell’evento Click del ComboBox, ma stavolta si scatena cliccando sul CommandButton4 (è il nome che ho io, ma ciascuno avrà il suo):
Private Sub CommandButton4_Click()
' Scelta dell'opzione del ComboBox1
Dim Scelta As String
Scelta = ComboBox1.Text ' Va bene anche ComboBox1.Value
Select Case Scelta
Case "Questo"
MsgBox "Prima scelta" ' O, meglio, codice ad hoc
Case "Codesto"
MsgBox "Seconda scelta" ' O, meglio, codice ad hoc
Case "Quello"
MsgBox "Terza scelta" ' O, meglio, codice ad hoc
Case "Nulla"
MsgBox "Quarta scelta" ' O, meglio, codice ad hoc
End Select
ComboBox1.ListIndex = 0 ' Pone la prima scelta
ActiveCell.Select
End Sub
Miscellanea di inghippi e piccoli segreti
Fuori programma, ma per analogia con le particolarità citate sopra, ne aggiungo altre due un po’ alla rinfusa.
Che fine ha fatto il Modulo Dati?
Sto parlando del comodo comando Dati > Modulo... per navigare su un elenco presente nel foglio di lavoro. Nella Barra multifunzione non ce n’è traccia. Qualche veterano magari se la cava con l’equivalente codice VBA (rimasto vivo e vegeto, contrariamente al dannato FileSearch):
ActiveSheet.ShowDataForm
Se ne ottiene una finestra di dialogo bell’e pronta, essenziale ma abbastanza completa – navigazione, modifica, filtraggio – anche se limitata a 32 campi.
Comunque non occorre scomodare il VBA. Anche con file .xlsx (privi di macro in Office 2010) tale maschera di record si può inserire nella barra di accesso rapido. Occorre un po’ di pazienza, andando nelle Opzioni di Excel, poi cliccare Barra di accesso rapido, quindi – attenzione! – attivare Scegli comandi da: > Comandi non presenti sulla barra multifunzione, trovare nel susseguente elenco l’icona Modulo...e, infine, trascinarla sul pannello di destra con il pulsante Aggiungi >>. Superfluo dire che tali manovre possono ternare utili con altri oggetti mancannti sull’ingombrante Ribbon.
Caption su 2 righe in un pulsante ActiveX
A prima vista, ovvero nel progetto manuale, non sembra esserci verso di impostare la Caption su due (o più) righe. Esempio:
Ma tranne improbabili segreti, un modo c’è. Consiste nel lanciare una tantum un’istruzione VBA come questa:
CommandButton1.Caption = "Premi qui" & Vblf & "per favore"
Il risultato è permanente, se qualcuno ne dubitasse.
Il pannello segreto GodMode di Windows 7
Premesso che le misteriose operazioni che sto per descrivere NON valgono per Windows XP, eccone i passi qui di seguito.
1. Creare sul desktop una nuova cartella (di file) denominandola esattamente così:
GodMode.{ED7BA470-8E54-465E-825C-99712043E01C};
2. Premere Invio, creando così il pannello GodMode;
3. D’ora in poi un doppioclic su di esso fa apparire una lista di ben 283 voci che danno adito ad altrettante funzioni più o meno speciali. Divertitevi.
?>