Boucle For sur des contrôles de formulaire
Le
jpaul.berard

Bonjour,
En VBA, je voudrais faire une procédure qui passe en revue des contrôle=
s de formulaire (des horaires en fait) pour faire des vérifications de co=
hérence grâce à une boucle For
Ces contrôles ont des noms différents les uns des autres.
Mon problème est donc d'arriver à appeler ces contrôles.
J'essaie avec :
Public Sub rechHpost(Hx) 'rech d'un controle horaire postérieur rempli
Dim H3 As Control, H4 As Control, H5 As Control, H6 As Control, H7 As Contr=
ol, n As Byte
Set H3 = Me.installation
Set H4 = Me.induction
Set H5 = Me.incision
Set H6 = Me.pansement
Set H7 = Me.sortie
For n = 3 To 7
If IsNull("H" & n) = False Then
If DateDiff("n", Hx, "H" & n) > -360 Then
etc
et ça ne marche pas. ("H" & n) est traduit en 'H4' par exemple mais pas r=
econnu comme une variable.
Alors qu'en fenêtre de débogage, si je tape '? H4', j'ai bien la valeur=
de Me.induction qui s'affiche
Si je change et déclare
Dim H4 as string
puis
H4 = "induction"
puis
If IsNull(Me.Controls("H" & n)) = False Then
etc, ça ne marche pas non plus.
Où je me plante ? Merci. (Access 2000)
En VBA, je voudrais faire une procédure qui passe en revue des contrôle=
s de formulaire (des horaires en fait) pour faire des vérifications de co=
hérence grâce à une boucle For
Ces contrôles ont des noms différents les uns des autres.
Mon problème est donc d'arriver à appeler ces contrôles.
J'essaie avec :
Public Sub rechHpost(Hx) 'rech d'un controle horaire postérieur rempli
Dim H3 As Control, H4 As Control, H5 As Control, H6 As Control, H7 As Contr=
ol, n As Byte
Set H3 = Me.installation
Set H4 = Me.induction
Set H5 = Me.incision
Set H6 = Me.pansement
Set H7 = Me.sortie
For n = 3 To 7
If IsNull("H" & n) = False Then
If DateDiff("n", Hx, "H" & n) > -360 Then
etc
et ça ne marche pas. ("H" & n) est traduit en 'H4' par exemple mais pas r=
econnu comme une variable.
Alors qu'en fenêtre de débogage, si je tape '? H4', j'ai bien la valeur=
de Me.induction qui s'affiche
Si je change et déclare
Dim H4 as string
puis
H4 = "induction"
puis
If IsNull(Me.Controls("H" & n)) = False Then
etc, ça ne marche pas non plus.
Où je me plante ? Merci. (Access 2000)
Essayer (dans le module lié au formulaire) :
For n=3 to 7
If IsNull(Me("H" & n))úlse then
If DateDiff("n", Hx, Me("H" & n)) > -360 Then
...
db
Même résultat. Il me répond : impossible de trouver le contr ôle H3....
J'avais lu trop vite, je pensais que H3, H4... étaient des contrôles du
formulaire. Peut-être alors :
Public Sub rechHpost(Hx) 'rech d'un controle horaire postérieur rempli
Dim H(7) As Control, n As Byte
Set H(3) = Me.installation
Set H(4) = Me.induction
Set H(5) = Me.incision
Set H(6) = Me.pansement
Set H(7) = Me.sortie
For n = 3 To 7
If IsNull(H(n)) = False Then
If DateDiff("n", Hx, H(n)) > -360 Then
db
Merci, beaucoup ! Ca marche !
Mais, j'aimerais beaucoup que tu m'expliques... car je ne comprends pas ce que tu m'as fait coder. Pourquoi je ne déclare qu'un H(7) (j'avais laiss é les autres ce qui m'entrainait une erreur) ? Tu fais appel à une fonc tionnalité que je ne connaît pas.
Et dans la même veine, dans mon code, j'incrémente H(n) d'1 jour, mais ensuite comment renvoyer cette nouvelle valeur au bon contrôle dans le fo rmulaire ?
Merci d'avance.
pas ce que tu m'as fait coder. Pourquoi je ne déclare qu'un H(7)
(j'avais laissé les autres ce qui m'entrainait une erreur) ? Tu fais
appel à une fonctionnalité que je ne connaît pas.
mais ensuite comment renvoyer cette nouvelle valeur au bon contrôle dans
le formulaire ?
"Dim H(7) as control" déclare un tableau de 7 contrôles, accessibles par
H(1), H(2), etc.
Mais dans votre cas, s'il doit y avoir interaction entre ces contrôles
et leur équivalent dans le formulaire, je ferais sans doute comme ça :
Public Sub rechHpost(Hx) 'rech d'un controle horaire postérieur rempli
Dim H(7) As String, n As Byte
H(3) = "installation"
H(4) = "induction"
H(5) = "incision"
H(6) = "pansement"
H(7) = "sortie"
For n = 3 To 7
If IsNull(me(H(n))) = False Then
If DateDiff("n", Hx, Me(H(n))) > -360 Then
...
...et la mise à jour du formulaire se fera avec Me(H(n))=..., sous
réserve que les contrôles du formulaire soient modifiables.
Non testé, mais en gros, c'est l'idée
db
Merci ! Tout semble résolu.
Je vais lire un peu sur ces déclarations de tableau (je n'ai jamais fa it).
Etonnamment, je n'ai pas eu besoin de faire Me(H(n)) = nouvelle valeur. E n faisant directement
H(n) = H(n) + 1
mon contrôle a été directement mis à jour !
Bonne soirée !
Oui, c'est normal tant qu'il n'y a pas d'ambigüité. Mais le fait de
préfixer avec Me est une sage précaution :-).
db
Par contre Me(H(n)) = H(n) + 1 me renvoyait une erreur. Je n'ai pas essay é en utilisant Me(H(n)) = Dateadd ("d", 1, H(n))
Bonjour,
Si c'est l'existence du contrôle, que tu veux tester, un temps on
trouvait sur le site de Raymond Sénèque ou celui d'Hervé Inisan une
fonction ControlExists. Hier j'ai échoué à retrouver ça, mais il se
pourrait bien que j'aie mal cherché.
De mémoire, il existe deux moyens :
- ou parcourir en boucle tous les contrôles pour comparer leurs noms au
nom à vérifier
- ou utiliser Application.SysCmd
La même chose s'applique aux tables, aux formulaires ...
Attention, pour les formulaires la syntaxe est différente selon qu'on
s'intéresse aux formulaires existants ou aux formulaires ouverts.
Bonsoir,
Comme je l'ai expliqué dans le post initial, il s'agit simplement de test er la cohérence entre des contrôles horaires (que l'horaire suivant sai si par l'opérateur n'intervienne pas avant le précédent...)
Mais avant de faire la vérification, je regarde que le contrôle ne soit pas vide d'où l'appel à la fonction IsNull().