Post date: Sep 20, 2012 2:44:01 PM
È risaputo che in una casella di testo posta in una form è possibile controllare l'inserimento
dei dati, impedendo ad es. l'inserimento di numeri, testo etc. si pensi all'evento 'Change' di una Textbox.
In excel, invece, non esiste un evento change per le celle, o meglio, esiste per il foglio,
ma il povero sheet non può sapere qual'era la cella da validare nel momento in cui ne selezioniamo un'altra.
Per dirla tutta, l'evento Change di un foglio di excel 'scatta' anche rimanendo nella stessa cella da
validare, ma solo se il valore modificato è frutto di una selezione da elenco ('Convalida Dati').
Nella maggioranza dei casi però, il nostro ignaro User, si posiziona in una cella, ci scrive dentro e
poi preme Invio o ne seleziona un'altra con il mouse. Per semplificare: se inserisco nella cella B10 un valore che non desidero e poi mi sposto nella cella E40 l'evento non può sapere che prima mi trovavo nella cella B10.
Come si potrebbe aggirare l'ostacolo?
I seguenti blocchi di codice vba (i primi 2 si avvalgono di una funzione intrinseca di excel) possono aiutare.
Consentire l'inserimento solo di dati numerici in un intervallo
'Nel foglio inserisci la seguente formula
=SE(VAL.ERRORE(CERCA.VERT("*";C3:C12;1;0));"";CERCA.VERT("*";C3:C12;1;0))
'l'asterisco indica qualsiasi testo; C3:C12 è l'intervallo in cui cercare
'1 è il numero di colonna; 0 indica di cercare corrsipondenza esatta
'-------------------------------------------------------------------------
'Nell'evento Worksheet_Change incolla il seguente codice
Private Sub Worksheet_Change(ByVal Target As Range)
If [a1].Value <> "" And Not IsNumeric([a1.value]) Then
MsgBox "Devi inserire un dato numerico!!"
Application.Undo
End If
End Sub
----------------------------------------------------------------------------
Impedire l'inserimento di dati numerici in un intervallo
'In una qualsi-cella del foglio inserisci la seguente formula
=CONTA.NUMERI(C3:C12)
'se la nostra qualsi-cella calcola un valore maggiore di 0 allora ...
'Nell'evento Worksheet_Change incolla il seguente codice
Private Sub Worksheet_Change(ByVal Target As Range)
If [a3].Value > 0 Then
MsgBox "ma .. hai inserito un dato numerico! ti avevo detto di non farlo!!"
Application.Undo
End If
End Sub
----------------------------------------------------------------------------
Impedire la modifica diretta di celle sprotette (non ha effetto sulle formule)
(può essere utile per evitare il messaggio: "La cella o il grafico che si sta tentando di modificare è protetto ...")
Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Row > 5 And Target.Row < 20 And Target.Column = 4 Then
With Application
.EnableEvents = False
.Undo
.EnableEvents = True
End With
End If
End Sub
Spero possa essere di aiuto a qualcuno