Gianni Giaccaglini

Tricks & mini applics on WPF
posts - 46, comments - 0, trackbacks - 0

Un Ribbon spartano ma efficace per Excel

 

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à si possono ancora creare e restano in vita su modelli creati in precedenza e le macro associate sono garantite, ma purtroppo sono confinate in una tab chiusa (perdendo una delle loro virtù, il floating).

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 XAML, è 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:

Premi qui
per favore

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.

 

Print | posted on sabato 14 settembre 2013 09:17 |

Feedback

No comments posted yet.

Post Comment

Title  
Name  
Email
Url
Comment   
Please add 2 and 5 and type the answer here:

Powered by:
Powered By Subtext Powered By ASP.NET