contrôle de saisie d'un champ en fonction d'un autre champ

Le
Lydya
Bonjour,

Dans un formulaire, j'ai un champ 1 qui peut prendre la valeur oui ou non
(liste)
Si la valeur "oui" est choisie, le champ 2 doit impérativement être rempli
(liste de choix)
Si la valeur "non" est choisie, le champ 2 ne doit absolument pas être
rempli

Après plusieurs recherches et de nombreuses tentatives, je patauge encore
et je n'arrive à rien!
Voici une des versions de mon code, qui ne fonctionne pas correctement, cad,
quand le champ 1 est à "oui", le champ 2 reste verrouillé, ce qui fait qu'on
ne peut rien choisir et quand il est à "non", le champ 2 est bien verrouillé
mais impossible de valider le formulaire, de passer à l'enregistrement
suivant
Si vous pouvez m'aider, merci beaucoup, par avance.
--
Private Sub Form_beforeUpdate(Cancel As Integer)
If Me.[Champ1] = "non" Then
MsgBox ("Ne rien saisir")
Cancel = True
Me.[Champ1].SetFocus
With Me.[Champ2]
.Enabled = False
.Locked = True
.Value = ""
End With
End If
If Me.[Champ1].Value = "oui" And IsNull(Me.[Champ2]) Then
Cancel = True
MsgBox "Remplir le champ2"
With Me.[Champ2]
.Enabled = True
.Locked = False
.SetFocus
End With
End If
End Sub
--

Lydya
Vos réponses
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
Xavier HUE
Le #5008391
Bonjour Lydia,

1) Il faut activer ou non tes zones à chaque changement
d'enregistrement.

Private Sub Form_current()
Select Case Me.[Champ1]
Case "non"
Me.[Champ1].SetFocus 'Cette ligne n'est peut être pas
nécessaire (dépend du premier controle qui obtient le
focus)
Me.[Champ2].Enabled = False

Case "oui"
Me.[Champ2].Enabled = True

Case Else
MsgBox "Valeur champ1 incorrect"
Me.[Champ2].Enabled = True
End Select

End Sub

2) Il faut activer Champ2 si champ1 passe à "oui" lors de
modif

Private Sub Champ1_afterUpdate() ou Champ1_Change()
Select Case Me.[Champ1]
Case "non"
Me.[Champ1].SetFocus
Me.[Champ2].Enabled = False
Me.[Champ2].Value = "" 'A voir si à faire
systématiquement ou seulement avant mise à jour

Case "oui"
Me.[Champ2].Enabled = True

End Select
End Sub


3) Ta procédure de controle:

Private Sub Form_beforeUpdate(Cancel As Integer)

Select Case Me.[Champ1]
Case "non"
MsgBox ("Ne rien saisir")
Me.[Champ1].SetFocus
With Me.[Champ2]
.Enabled = False
.Value = ""
End With

Case "oui"
If IsNull(Me.[Champ2]) Then
Cancel = True
MsgBox "Remplir le champ2"
Me.[Champ2].SetFocus
End With

Case Else

MsgBox "Valeur incorrect Champ1"

End Select

End Sub

Sauf erreur de ma part (pas testé)
Cordialement.
Lydya
Le #5008141
Bonsoir Xavier,

Un grand merci pour ton aide.
J'ai juste supprimé 2 msgbox et le Case Else de la procédure de contrôle et
ça marche bien.

Deux petites choses que j'aimerais bien améliorer:
Lorsque le champ 1 est à "non", que le champ 2 est donc désactivé, si je
passe à l'enregistrement suivant, le focus revient sur le dernier champ du
formulaire qui a eu le focus dans l'enregistrement en cours et je dois
recliquer une deuxième fois sur la flèche de navigation pour avoir une
grille vierge et saisir un nouvel enregistrement.
=> Comment passer directement à un nouvel enregistrement?
=> Si je veux, à chaque nouvel enregistrement, donner le focus au premier
champ du formulaire (quel qu'il soit), où dois-je placer l'instruction?

Encore merci!

Lydya


"Xavier HUE" news:1879301c41b28$72070140$
Bonjour Lydia,

1) Il faut activer ou non tes zones à chaque changement
d'enregistrement.

Private Sub Form_current()
Select Case Me.[Champ1]
Case "non"
Me.[Champ1].SetFocus 'Cette ligne n'est peut être pas
nécessaire (dépend du premier controle qui obtient le
focus)
Me.[Champ2].Enabled = False

Case "oui"
Me.[Champ2].Enabled = True

Case Else
MsgBox "Valeur champ1 incorrect"
Me.[Champ2].Enabled = True
End Select

End Sub

2) Il faut activer Champ2 si champ1 passe à "oui" lors de
modif

Private Sub Champ1_afterUpdate() ou Champ1_Change()
Select Case Me.[Champ1]
Case "non"
Me.[Champ1].SetFocus
Me.[Champ2].Enabled = False
Me.[Champ2].Value = "" 'A voir si à faire
systématiquement ou seulement avant mise à jour

Case "oui"
Me.[Champ2].Enabled = True

End Select
End Sub


3) Ta procédure de controle:

Private Sub Form_beforeUpdate(Cancel As Integer)

Select Case Me.[Champ1]
Case "non"
MsgBox ("Ne rien saisir")
Me.[Champ1].SetFocus
With Me.[Champ2]
.Enabled = False
.Value = ""
End With

Case "oui"
If IsNull(Me.[Champ2]) Then
Cancel = True
MsgBox "Remplir le champ2"
Me.[Champ2].SetFocus
End With

Case Else

MsgBox "Valeur incorrect Champ1"

End Select

End Sub

Sauf erreur de ma part (pas testé)
Cordialement.
Xavier HUE
Le #5008011
Bonjour Lydia,

Lorsque le champ 1 est à "non", que le champ 2 est donc
désactivé, si je

passe à l'enregistrement suivant, le focus revient sur le
dernier champ du

formulaire qui a eu le focus dans l'enregistrement en
cours et je dois

recliquer une deuxième fois sur la flèche de navigation
pour avoir une

grille vierge et saisir un nouvel enregistrement.
Pas facile de te dépanner comme ça!

Au moment où tu clic sur le bouton permettant d'atteindre
un nouvel enregistrement (Etoile dans les boutons de
navigation), est-ce que ton enregistrement est en cours de
modif? Si oui, c'est peut être le Me.[Champ1].SetFocus
dans la procédure afterUpdate du formulaire qui "gêne"...

Si le code de ton formulaire n'est pas trop important,
poste ici, et je jetterai un oeil.

=> Si je veux, à chaque nouvel enregistrement, donner le
focus au premier

champ du formulaire (quel qu'il soit), où dois-je placer
l'instruction?

Dans l'Evènement Form_Current.
Cet évènement déclenche à chaque changement
d'enregistrement.

Private Sub Form_current()
'Donner le Focus à un controle
Me.[TonControlAActiver].SetFocus 'ne doit pas être
[Champ2] car sa désactivation plus bas plantera

Select Case Me.[Champ1]
Case "non"
Me.[Champ2].Enabled = False

Case "oui"
Me.[Champ2].Enabled = True

End Select

Cordialement.

Lydya
Le #5007701
Bonjour Xavier,

J'ai enlevé le premier focus de la procédure de contrôle (Case "non") et je
l'ai placé au début de la procédure Form_current et c'est impeccable.
Par contre, j'ai encore un petit souci:
Lorsque je modifie un enregistrement dont le champ 1 était "non" pour le
mettre à "oui", je n'ai plus l'obligation de saisir le champ 2 avant de
quitter l'enregistrement.
J'ai tenté de rajouter le test If isNull(Me.[Champ2] etc. dans le Case "oui"
de la procédure Domicile_afterUpdate (jai essayé Domicile_Change aussi) mais
bizarrement... ça ne le fait pas!
Voilà où en est mon (ton) code:
--
'1) activation ou non des zones à chaque changement d'enregistrement

Private Sub Form_current()
Me.[PremierChampForm].SetFocus

Select Case Me.[Champ1]
Case "non"
Me.[Champ2].Enabled = False

Case "oui"
Me.[Champ2].Enabled = True

Case Else
Me.[Champ2].Enabled = True

End Select
End Sub

'2) Activation Champ2 si champ1 passe à "oui" lors de modif

Private Sub Champ1_Change() 'ou Champ1_afterUpdate()

Select Case Me.[Champ1]
Case "non"
Me.[Champ1].SetFocus
Me.[Champ2].Enabled = False
Me.[Champ2].Value = ""

Case "oui"
Me.[Champ2].Enabled = True

End Select

End Sub


'3) Procédure de contrôle:

Private Sub Form_beforeUpdate(Cancel As Integer)

Select Case Me.[Champ1]
Case "non"
With Me.[Champ2]
.Enabled = False
.Value = ""
End With

Case "oui"
If IsNull(Me.[Champ2]) Then
Cancel = True
MsgBox "Remplir le Champ2"
Me.[Champ2].SetFocus
End If

End Select

End Sub
--
Ah c'est pas facile Access!!
Merci de ta patience, j'apprends beaucoup de choses :-)

A bientôt.

Lydya


"Xavier HUE" news:18b0601c41bb1$7290cc70$
Bonjour Lydia,

Lorsque le champ 1 est à "non", que le champ 2 est donc
désactivé, si je

passe à l'enregistrement suivant, le focus revient sur le
dernier champ du

formulaire qui a eu le focus dans l'enregistrement en
cours et je dois

recliquer une deuxième fois sur la flèche de navigation
pour avoir une

grille vierge et saisir un nouvel enregistrement.
Pas facile de te dépanner comme ça!

Au moment où tu clic sur le bouton permettant d'atteindre
un nouvel enregistrement (Etoile dans les boutons de
navigation), est-ce que ton enregistrement est en cours de
modif? Si oui, c'est peut être le Me.[Champ1].SetFocus
dans la procédure afterUpdate du formulaire qui "gêne"...

Si le code de ton formulaire n'est pas trop important,
poste ici, et je jetterai un oeil.

=> Si je veux, à chaque nouvel enregistrement, donner le
focus au premier

champ du formulaire (quel qu'il soit), où dois-je placer
l'instruction?

Dans l'Evènement Form_Current.
Cet évènement déclenche à chaque changement
d'enregistrement.

Private Sub Form_current()
'Donner le Focus à un controle
Me.[TonControlAActiver].SetFocus 'ne doit pas être
[Champ2] car sa désactivation plus bas plantera

Select Case Me.[Champ1]
Case "non"
Me.[Champ2].Enabled = False

Case "oui"
Me.[Champ2].Enabled = True

End Select

Cordialement.

Xavier HUE
Le #5007601
Re,

Essaie dans beforeUpdate du formulaire:

Case "oui"
If IsNull(Me.[Champ2]) Or Me.[Champ2] = "" Then

A tout hasard.

Cordialement.
Lydya
Le #5007481
Bien vu! ça marche.
Merci


"Xavier HUE" news:18ed101c41bef$ec458810$
Re,

Essaie dans beforeUpdate du formulaire:

Case "oui"
If IsNull(Me.[Champ2]) Or Me.[Champ2] = "" Then

A tout hasard.

Cordialement.


Publicité
Poster une réponse
Anonyme