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 |
|
|
|
|
|
|
|
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.
?>
?>
?>
?>