Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

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

6 réponses
Avatar
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

6 réponses

Avatar
Xavier HUE
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.
Avatar
Lydya
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" a écrit dans le message de
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.
Avatar
Xavier HUE
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.

Avatar
Lydya
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" a écrit dans le message de
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.

Avatar
Xavier HUE
Re,

Essaie dans beforeUpdate du formulaire:

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

A tout hasard.

Cordialement.
Avatar
Lydya
Bien vu! ça marche.
Merci


"Xavier HUE" a écrit dans le message de
news:18ed101c41bef$ec458810$
Re,

Essaie dans beforeUpdate du formulaire:

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

A tout hasard.

Cordialement.