Code VBA sur access, boucle automatique

cs_fredln Messages postés 2 Date d'inscription vendredi 23 janvier 2004 Statut Membre Dernière intervention 24 janvier 2004 - 23 janv. 2004 à 23:30
cs_fredln Messages postés 2 Date d'inscription vendredi 23 janvier 2004 Statut Membre Dernière intervention 24 janvier 2004 - 24 janv. 2004 à 14:11
fredln
Sincère salutation à tous. Je désire créer sur access par l'intermédiaire d'un bouton un code qui génère une boucle pour aire un ajout automatique.
J'ai saisie le code suivant et cela ne fonctionne pas :
------
Private Sub Commande33_Click()
On Error GoTo line3

line0
Dim stDocName As String
stDocName = "ajoutauto"
If IsNull(autoform) Then Goto line1 Else Goto line2

Line1:
MsgBox ("Plus de saisie automatique possible")
Exit sub

line2
DoCmd.OpenQuery stDocName, acNormal, acEdit
Goto line0

Me.recette.Requery
Me.repertoire.Requery
Me.autoform.Requery
End If

Exit_Commande33_Click:
MsgBox ("fin d'éxécution")
Exit Sub
line3:
MsgBox ("Erreur d'éxecution")
Exit Sub
End Sub
-------
Sans la fonction "if" la commande fonctionne, je ne comprends pas où est mon erreur.
merci de vos réponse, a+

2 réponses

cs_Jack Messages postés 14006 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 79
24 janv. 2004 à 00:43
Salut fredln
Le "If" qui t'embète ne permet d'aller que vers line1 ou line2.
Or, après la commande DoCmd, tu fais un Goto line0, tu reviens au début (il manque le ":" après line0, volontaire ?).
Comme "autoform" ne change pas d'état grace au DoCmd, tu dois reboucler à l'infini, ça doit même bloquer ta machine. Je pense donc que le "Goto line0" ne sert à rien.
Pour éviter qu'une boucle comme celle-là ne bloque complètement ta machine, insère des "DoEvents" de temps en temps : Cela permet de rendre la min à la machine pour continuer à gérer le reste, notamment Windows lui-même.
Pour moderniser ton code, je te suggère d'utiliser le "Select Case" au lieu du If :
...
stDocName = "ajoutauto"
Select Case IsNull(autoform)
Case True ' Si le cas est vrai #
MsgBox ("Plus de saisie automatique possible") '##
Case False ' Le cas n'est pas vrai '#
DoCmd.OpenQuery stDocName, acNormal, acEdit '##
Goto line0 ' <-- si vraiment il le faut '##
Me.recette.Requery '##
Me.repertoire.Requery '##
Me.autoform.Requery '##
End Select
Exit_Commande33_Click:
...
Je ne sais pas si cela se verra dans la mémorisation de ce message, mais j'ai utilisé "l'indentation", c'est à dire le fait d'ajouter une (ou plusieurs) tabluation(s) avant de commencer certaines lignes (celles marquées par un (ou deux) dièse(s) #): Cela donne de la clarté au code et tu repèreras beaucoup plus facilement les erreurs.

Vala
Jack
0
cs_fredln Messages postés 2 Date d'inscription vendredi 23 janvier 2004 Statut Membre Dernière intervention 24 janvier 2004
24 janv. 2004 à 14:11
fredln
Sincère salutation
Merci à Vala Jack pour ça réponse.

Le code que tu m’as fourni ne génère pas de boucle de calcul.
Petite précision, autoform renvoi la valeur la plus faible d’une requête de non-concordance.
Ajoutauto enregistre dans une table les données correspondantes à la valeur la plus faible de la requête de non-concordance, et donc autoform devient nul lorsque qu’il n’y a plus de non-concordance. Il me faut générer une boucle tant autoform n’est pas nul.
J’ai saisi le code suivant
-----------
Private Sub Commande33_Click()
Me.autoform.SetFocus
On Error GoTo line3
line0:
stDocName = "ajoutauto"
Me.autoform.Requery
Me.autoform.SetFocus
Select Case IsNull(autoform)
Case True
MsgBox ("Plus de saisie automatique possible")
Exit Sub
Case False
DoCmd.OpenQuery stDocName, acNormal, acEdit
Me.recette.Requery
Me.repertoire.Requery
Me.autoform.Requery
Me.autoform.SetFocus
GoTo Line8
Line8:
Select Case IsNull(autoform)
Case True
Exit Sub
Case False
GoTo line0
End Select
End Select

line4:
MsgBox ("fin d'éxécution line4")
Exit Sub

Exit_Commande33_Click:
MsgBox ("fin d'éxécution")
Exit Sub
line3:
MsgBox ("Erreur d'éxecution")
Exit Sub
End Sub
-------

Petit problème :
La boucle ne ce lance que si je clic préalablement au lancement du code sur mon champ « autoform »dans mon formulaire, donc le Setfocus ne convient pas, le Gotfocus génère une erreur

Avec ce code, je génère bien une boucle, mais la seule solution pour la stopper est « Ctrl+Maj+Supr » franchement « bourrin », mais à ma grande surprise quand je relance ma base, les enregistrements non-concordants sont tous enregistrer dans ma table. Question comment arrêter cette boucle ?
Merci d'avance
0
Rejoignez-nous