Ma secondo te sarà mai possibile che per OGNI MASCHERA ci siano tutti i controlli che vanno compilati…? Non ci credo nemmeno se vedo… quindi il codice che proponi è solo Teoricamente sensato ma praticamente non utile tanto meno scritto come Funzione Public da richiamare come hai fatto e ne è dimostrazione proprio la tua richiesta.
Faccio poi presente questo:
If Ctl = " " Or IsNull(Ctl) Then
Lo spazio non corrisponde a campo NON compilato… e questo è un controllo sbagliato.
Questo tipo di controllo verifica sia il NULL che il NULLSTRING, diverso dallo spazio.
If Len(Ctl.Value & vbNullstr4ing)=0 Then
Altra cosa che rende impossibile il funzionamento del tuo codice:
For Each Ctl In Maschera
L'oggetto Maschera non consente l'iterazione, devi iterare la Collection Controls:
For Each Ctl In Maschera.Controls
Ora nasce il problema non molto compatibile con il tuo metodo… che non è particolarmente tecnico.
I Controlli hanno una proprietà di Validazione o ValidationRules che contribuisce alla gestione dei vincoli da inserire, a seguito del rispetto o meno dei vincoli si genera un Errore a livello di Form che viene gesito, questo sistema è estremamente più potente e funzionale in quanto consente di personalizzare esattamente le REGOLE per ogni Controllo Associato e non…
Il tuo codice, che tutto sommato fa quello che dici ora diventa un problema in quanto scritto come lo hai scritto che è generalizzato per Form diventa non gestibile come personalizzazione di Maschera.
Quindi io fossi in te userei le ValidationRoules, se invece vuoi usare quel codice e renderlo sempre Flessibile devi usare una Variante, ovvero la proprietà TAG dei controlli, da compilare con un Carattere o Valore che ti consente di discriminare quelli obbligatori da quelli non obbligatori.
Esempio, nei controlli Obbligatori alla proprietà TAG inserisci “OBBLIGATORIO”
quindi modificherai il tuo codice così, migliorando anche il codice:
Public Function DatoObbligatorio(ByVal Maschera As Form) As Boolean
Dim Ctl As Control
DatoObbligatorio = False
'Esamina ciclicamente tutti i controlli Casella di testo e casella combinata e quando ne
For Each Ctl In Maschera.Controls
If ctl.TAG="OBBLIGATORIO" Then
If Ctl.ControlType = acTextBox Or Ctl.ControlType = acComboBox Then
If LEN(Ctl.value & vbNullstring)=0 Then
DatoObbligatorio=True
MsgBox "Dato obbligatorio nel campo " & Ctl.Name & " , " & vbCr & "inserirlo, per favore.", vbInformation, "Dato obbligatorio omesso"
Exit For
End if
End if
End If
Next Ctl
End Function
Metterei la gestione errori…