Il blog di Gianni Giaccaglini

Blog su VBA e VSTO
Gianni Giaccaglini

My Links

News

NB - V. anche gli ARTICOLI (in fondo a questa barra)
Solo quesiti validi a: giannigiac@tin.it
Il mio nuovo libro


La mia nipotina ELISA

Foto con dedica a ME di
Bill Gates giovanissimo
nei mitici anni 80!

Categorie Post

Categorie Articoli

Archivio

Immagini

Blog Stats

Input condizionato, con e senza macro

N.B. Da www.microsoft.com/office/2010/en/default.aspx  oppure www.microsoft.com/italy/office2010/index.aspx si può scaricare la beta di Office 2010 (professionale), sempre in edizione inglese.
 
Input condizionato, con e senza macro

L’adozione in un intervallo ad hoc di un foglio di lavoro Excel per l’immissione di dati può essere interessante, specie se tali valori sono molti e li si vuole assoggettare a successive elaborazioni. Un’esigenza che in tali casi sovente si presenta è l’aderenza dell’input a determinate condizioni. Facile a dirsi e anche a farsi, con opportuno codice macro, ma un tale, al riguardo, mi ha espresso il timore che l’utente finale, succube del terrorismo contro i macro virus possa aver disabilitato le macro.

Per farla breve, ho studiato il problema sviluppando il modellino esemplificativo seguente, ove Zalva vuol raffigurare un pulsante ActiveX.

 

A

B

C

D

E

F

G

1

Zona input:

2

5

2

7

 <== immettere valori tra 5 e 10 (compresi)

3

3

8

10

(Valori fuori limiti: celle BIANCHE)

4

6

4

9

5

7

5

11

6

7

Zona verifica:

Salva

8

VERO

FALSO

VERO

9

FALSO

VERO

VERO

Num. input OK:

10

VERO

FALSO

VERO

8

11

VERO

VERO

FALSO

4 celle fuori limiti!

12

13

14

 

Lo si può scaricare dal link seguente:

http://www.giannigiaccaglini.it/download/ZonaInputCondizionata.xls

Si sappia inoltre che vanno assegnati i nomi di zona seguenti (tra parentesi le coordinate):

Zona_Input (A2:C5)

Data_Salva (E6, celata da pulsante Salva)

Nota. È poi opportuno che le celle di Zona_Input non siano bloccate, ricordandosi di fissare la protezione del foglio. In tal modo l’end user può operare solo nell’intervallo dedicato (che potrebbe essere una maschera di celle anche non contigue).

Soluzioni senza macro VBA

La cosa che sarà subito venuta in mente a molti è l’adozione della formattazione condizionale, le cui manovre do per note. Nel modellino, per estrema semplicità, ho previsto la condizione TRA, con minimo e massimo pari a 5 e 10 inclusi. Di conseguenza le celle OK si colorano automaticamente. Se l’utente non è del tutto sprovveduto dovrebbe bastare. Comunque per i palati più esigenti ho previsto l’intervallo A8:C11 sottostante Zona_Input, contenente formule booleane di cui riporto solo quella nella cella d’angolo A8:

=E(A2>=5;A2<=10)

Nota. Ricordo ai principianti che scritta tale formula in A8 si può inserirla, previa selezione di A8:C11 premendo Ctrl+Invio simultaneamente.

Tali formule creano dei valori logici VERO in tutte e sole le celle “gemelle “ di quelle in Zona_Input che soddisfano la predetta condizione. A questo punto non resta che esaminare le formule seguenti, che recano a sinistra del segno = l’indirizzo della cella di appartenenza:

E10=CONTA.SE(A8:C11;VERO)

E11=SE(E10=CONTA.VALORI(A8:C11);"Tutte celle OK";(CONTA.VALORI(A8:C11)-E10)&" celle fuori limiti!")

Come spero sia a tutti chiaro, la prima dà il numero di input corretti, la seconda messaggi alternativi di limpida semantica.

Soluzione VBA

Il clou consiste nella routine seguente, relativa all’evento BeforeSave che si scatena prima del salvataggio della cartella di lavoro, comunque effettuato, tramite il pulsante Salva o a mano. È ospitata nel modulo ThisWorkbook:

Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)

  Dim c As Range

  For Each c In Foglio1.Range("Zona_Input")

    'If c.Interior.ColorIndex = 3 Then ' NON VA!!!

    If c < 5 Or c > 10 Then

      MsgBox "Valori fuori limiti!"

      Cancel = True

      Exit Sub

    End If

  Next

  Range("Data_Salva") = Date

End Sub

 

Commenti ultrarapidi.

C’è poco da dire, almeno a chi mastica un poco il VBA, dico solo a chi non lo sapesse che l’argomento booleano Cancel, per default uguale a False, con Cancel = True inibisce il salvataggio. Quando invece l’utente si comporta bene Range(“Data_Salva”) = Date inserisce nella cella denominata Data_Salva la data corrente. Tale finezza (non del tutto perfetta, a dirla tutta) mira a permettere ad un eventuale controllore di constatare se il VBA è stato o meno disabilitato. Nel qual caso Data_Salva dovrebbe essere vuota. Chiaro?

Nota. Come si constaterà, in fase di modifica, anche del VBA la Sub dell’evento BeforeSave impedisce il salvataggio se la zona di input non è corretta. In tali casi, volendo salvare la miglioria, è giocoforza disabilitare il VBA.

Dimenticavo una cosa, che però non sorprenderà nessuno. Al pulsante Salva è abbinata questa macro:

Private Sub btnSalva_Click()

  ThisWorkbook.Save

End Sub

Infine si potrebbe agire anche sull’evento Close, comunque si constata che la pur noiosa domanda “Salvare le modifiche?...” è di fatto ininfluente ai nostri scopi.

?>

?>

?>

?>

posted on lunedì 16 novembre 2009 13.53