tamaeril ha scritto:
Dunque, in merito al clear form, è un semplice susseguirsi di focus sui diversi campi che vengono "riempiti" con un valore = ""
Per quanto concerne l'err, ho preso l'oggetto da un altro codice similar. Ad essere sincere non l'ho dichiarata! Potrebbe essere questo? E nel caso, come è meglio porla?
Come dicevo prima, Err è già previsto da VBA. In assenza di errori (non quelli che hai definito tu come verifica della compilazione del campo) vale 0.
Quando scrivi
If Err < 1 Then
salti l'inserimento anche quando vale 0, cioè non si sono verificati errori in assoluto (sia quelli che tu hai definito tali tirando in campo Err ed aggiungendovi 1, sia quelli di VBA)
Questo però è in apparente (o reale) contrasto con quello che hai detto all'inizio
tamaeril ha scritto:
il problema è molto semplice: non appena avviata la maschera, questa consente la registrazione del primo codice senza effettuare alcun controllo! Dopo il primo update, il controllo viene invece effettuato come dovuto.
ed ecco la spiegazione "vera".
Una casella combinata senza alcuna selezione non ha come valore "" ma Null
Quindi al primo caricamento la verifica di ogni
If [combo].Value = ""
non sarà True, non darà alcun messaggio d'errore ed Err non sarà incrementato di 1. Solo con il codice di clear form in cui, credo, anche le combo vengono impostate a "" la verifica, come l'hai intesa tu, funziona.
Soluzione?
If Len([Combo].Value & vbNullString) = 0 Then
così sia il valore Null sia "" (meglio usare però vbNullString) della combo saranno trattati nello stesso modo.
Anche nel codice che fa la "pulizia" della maschera, invece di scrivere [""] usa vbNullString.
Se non vuoi interferire con l'oggetto Err di VBA (visto che non l'hai usato consapevolmente) usa una variabile ad hoc:
Private Sub RegisterB_Click()
Dim intErr as Integer
...
intErr = intErr + 1
...
If intErr < 1 Then
...
End Sub
Perché nella prima verifica controlli il contenuto della proprietà .Text e non .Value? Sempre perché l'hai "trovato così"? .Text ha un uso diverso da quello di Visual Basic (.Net). Per quello che ti serve credo che sia giusto .Value
Forse è per quello che usi il .SetFocus, perché solo in quel modo potevi leggere il contenuto di .Text.
In generale non ti serve sposatare il focus sul controllo da verificare per leggerne la proprietà .Value, anzi è uno "spreco": sposta il focus sul controllo solo se riscontri l'errore in modo che l'utente possa correggere immediatamente.