Newsgroup: it.comp.appl.access
Titolo: For Each

Per controllare che tutti i campi in una frm di inserimento dati siano
riempiti dall'utente ho scritto la seguente routine
sull'evento Salva.
Dim ctlNomeText As Control
For Each ctlNomeText In Me.Controls
    If IsNull(ctlNomeText.Value) Then
        MsgBox "Il campo " &  ctlNomeText.Name &" è vuoto"
        Exit Sub
    End If
Next ctlNomeText
Il problema è che il ciclo funziona solo al primo giro
perchè sul secondo mi lancia l'allarme "Propietà o metodo non
supportato dall'oggetto." ,bloccandosi sulla riga If IsNull.....
P.S. I controlli non sono associati a nessuna tbl.
Consigli?
Ciao
Giuseppe

 news:Sv16a.219653$0v.61...@news1.tin.it...

[...]
    Mi sa che non hai considerato che la collezione Controls di un Form
comprende *tutti* i controlli presenti sul Form, non solo le Caselle di
testo, quindi, ma anche Pulsanti, Etichette, ecc. Alcuni di questi
controlli non posseggono la proprieta' Value, ecco perche' avviene
l'errore che segnali. Quindi, prima di testare la proprieta' Value di un
controllo dovrai accertarti che tale controllo sia del *tipo* di quelli
da verificare. Per esempio:
        Dim oAcCtl As Access.Control
        For Each oAcCtl In Me.Controls
            If (TypeName(oAcCtl) = "Textbox") Then
                If IsNull(...
    Consulta la Guida in linea di Microsoft Visual Basic a proposito di:
        Function TypeName(VarName) As String
            Membro di VBA.Information
    (Facci sapere se ed eventualmente come hai risolto. Grazie.)
--
Ciao :o)
Maurizio
--------
?SPQR(C)
 X
--------

 Maurizio
Prima di tutto grazie del consiglio.In effetti non avevo considerato gli
altri controlli.Ho provato la tua routine ma mi dava sempre
errore,"Variabile dell'oggetto
with non impostata".Cmq ho risolto così.Anche questa routine mi da un errore
ma con la gestione
degli errori lo by-passo.Non sarà elegante ma apparentemente funziona.
Ciao
Giuseppe
Private Sub cmdSalva_Click()
Dim TextBox As TextBox
On Error GoTo Err_cmdSalva_Click
       For Each TextBox In Me
            If IsNull(TextBox.Value) Then
            MsgBox "Il campo " & TextBox.Name & " è vuoto"
            TextBox.SetFocus
            Exit Sub
End If
Next TextBox
Exit_Err_cmdSalva_Click:
    Exit Sub
Err_cmdSalva_Click:
    Resume
End Sub

 End Sub
    Testa questo codice:
        Dim oAcCtl As Access.Control
        For Each oAcCtl In Me.Controls
            If (TypeName(oAcCtl) = "Textbox") Then
                If (Len("" & oAcCtl.Value)=0) Then
                    oAcCtl.SetFocus
                    MsgBox _
                        "Campo a immissione obbligatoria." _
                      , vbExclamation Or vbOkOnly _
                      , oAcCtl.ControlSource
                    Exit Sub
                End If
            Else
                ' Non ci interessa perche' non e'
                ' un controllo di tipo "TextBox".
            End If
        Next


 Maurizio
OK funziona egregiamente e senza generare errori.
In pratica se ho capito qualcosa leggendo anche "Oggetti di Microsoft
Access" i riferimenti  in sequenza sono
Access -> Form->Control->TextBox
Mentre io facevo
Form->TextBox
Una cosa però non ho ancora capito.Perchè posso dichiarare
una variabile As TextBox?Cioè in che contesto la dovrei usare
allora?
Ciao
Giuseppe

 allora?
    Confronta questo codice con quello sopra:
        Dim oAcCtl As Access.Control
        Dim oAcTxt As Access.TextBox
        For Each oAcCtl In Me.Controls
            If (TypeName(oAcCtl) = "Textbox") Then
                Set oAcTxt = oAcCtl
                If (Len("" & oAcTxt.Value)=0) Then
                    oAcTxt.SetFocus
                    MsgBox _
                        "Campo a immissione obbligatoria." _
                      , vbExclamation Or vbOkOnly _
                      , oAcTxt.ControlSource
                    Exit Sub
                End If
            End If
        Next
        Set oAcTxt = Nothing
        Set oAcCtl = Nothing
    In questo, una volta riconosciuto il controllo oAcCtl come controllo
di tipo Textbox, lo gestiamo per mezzo di una variabile oggetto di tipo
idoneo, in modo che possiamo, per esempio, sfruttare l'Intellisense per
ottenere la lista di proprieta' e metodi propri dell'oggetto e non
quelle generiche degli oggetti di tipo Control.
    Nota anche le ultime due righe. Nell'esempio precedente avevo
trascurato questo importantissimo particolare.


 Maurizio
Adesso mi creo una frm nuova e mi metto a studiare i due "modelli"
;)
Ciao
Giuseppe