Gestire Convalida usando il VBA

Visto l'interesse che desta l'utilizzo dello strumento Convalida, che non richiede assolutamente nessuna istruzione in codice vba (di cui trovate tre diversi utilizzi sul sito, sezione "Formule"), era naturale che a qualcuno venisse la curiosità di chiedermi "ma si può gestire Convalida via vba?". E quindi in questa pagina parleremo delle istruzioni che si possono usare per ottenere quello che in vba si chiama "Validation". Prenderò come esempio quanto riportato in "Usare CONVALIDA (3)", per mostrare come si possa ottenere lo stesso risultato con l'impiego del Vba. Senza stare a ripetere cosa vorremo ottenere (basta leggere la pagina in "formule"), passo alla routine:

Sub MacroConvalida()

With Range("D2:D7").Validation
.Delete
.Add Type:=xlValidateWholeNumber, AlertStyle:=xlValidAlertStop, _
Operator:=xlBetween, Formula1:="1", Formula2:="6"
.IgnoreBlank = True
.InCellDropdown = True
.InputTitle = "inserire valore "
.ErrorTitle = "avviso"
.InputMessage = "valori ammessi compresi tra 1 e 6"
.ErrorMessage = "hai inserito un valore errato"
.ShowInput = True
.ShowError = True
End With
End Sub

Attenzione! La routine sopra, funziona solo con numeri interi, NON decimali, in base all'impostazione:
.Add Type:=xlValidateWholeNumber,  se si volesse invece un controllo che intervenga per numeri decimali, come nel caso di valuta Euro, andrà sostituito WholeNumber  con  Decimal, così:
.Add Type:=xlValidateDecimal

E' inoltre possibile assegnare dei valori variabili, usando il sistema di usare due celle del foglio di lavoro, come "contenitori" dei valori che servono di confronto, e poi via codice, assegnando il valore di queste celle a due variabili ( X e Y ), richiamare queste al posto di valori predefiniti nelle istruzioni Formula1:= e Formula2:= ; sarà necessario modificare anche la stringa assegnata ad "InputMessage" perchè possa presentare un messaggio aggiornato con i valori delle variabili, come nell'esempio sotto fatto per valori decimali:

Sub MacroModificata()
Dim X, Y
X = Range("J1").Value 
'J1 cella che conterrà il valore minimo
Y = Range("K1").Value
 'K1 cella che conterrà il valore massimo
With Range("D2,E7,C3").Validation
'definizione delle celle per la convalida
.Delete
.Add Type:=xlValidateDecimal, AlertStyle:=xlValidAlertStop, _
Operator:=xlBetween, Formula1:=X, Formula2:=Y
.IgnoreBlank = True
.InCellDropdown = True
.InputTitle = "inserire valore "
.ErrorTitle = "avviso"
.InputMessage = "valori ammessi compresi tra " & X & " e " & Y & ""
.ErrorMessage = "hai inserito un valore errato"
.ShowInput = True
.ShowError = True
End With

End Sub


E questa è la routine per togliere dalle stesse celle, il controllo convalida:

Sub TogliConvalida()

With Range("D2:D7").Validation
.Delete
End With
MsgBox "E' stata tolta la convalida alle celle richieste"

End Sub

Alcune precisazioni. Si può assegnare, come range di applicazione della Convalida, non solo un range di celle contigue, come nell'esempio ( Range("D2:D7" ), ma anche celle "sparse", dove appunto ci interessi eseguire un controllo, basterà indicare nei riferimenti del Range, i riferimenti alle celle, separate da una virgola, così : Range("D1, C2, D3, F10, A1)" .

Poichè le combinazioni del controllo convalida sono diverse, suggerisco di usare il "Registratore di macro", Se avviate il registratore e poi scegliete i vari passaggi di Convalida, alla fine, premendo lo stop del registratore, nell'editor di visual basic, nel Modulo che troverete, potrete leggere tutto il codice corrispondente alle azioni da voi fatte e quindi vedere, imparare e modificare, se credete, le istruzioni che il registratore ha compilato per voi. Registrate gente, registrate.