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

Boucle For sur des contrôles de formulaire

10 réponses
Avatar
jpaul.berard
Bonjour,
En VBA, je voudrais faire une proc=E9dure qui passe en revue des contr=F4le=
s de formulaire (des horaires en fait) pour faire des v=E9rifications de co=
h=E9rence gr=E2ce =E0 une boucle For...
Ces contr=F4les ont des noms diff=E9rents les uns des autres.
Mon probl=E8me est donc d'arriver =E0 appeler ces contr=F4les.
J'essaie avec :

Public Sub rechHpost(Hx) 'rech d'un controle horaire post=E9rieur rempli
Dim H3 As Control, H4 As Control, H5 As Control, H6 As Control, H7 As Contr=
ol, n As Byte

Set H3 =3D Me.installation
Set H4 =3D Me.induction
Set H5 =3D Me.incision
Set H6 =3D Me.pansement
Set H7 =3D Me.sortie

For n =3D 3 To 7
If IsNull("H" & n) =3D False Then

If DateDiff("n", Hx, "H" & n) > -360 Then
etc

et =E7a ne marche pas. ("H" & n) est traduit en 'H4' par exemple mais pas r=
econnu comme une variable.
Alors qu'en fen=EAtre de d=E9bogage, si je tape '? H4', j'ai bien la valeur=
de Me.induction qui s'affiche

Si je change et d=E9clare
Dim H4 as string
puis
H4 =3D "induction"
puis=20
If IsNull(Me.Controls("H" & n)) =3D False Then

etc, =E7a ne marche pas non plus.
O=F9 je me plante ? Merci. (Access 2000)

10 réponses

Avatar
db
Le 11/08/2014 15:43, a écrit :
Bonjour,
En VBA, je voudrais faire une procédure qui passe en revue des contrôles de formulaire (des horaires en fait) pour faire des vérifications de cohé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 :

For n = 3 To 7
If IsNull("H" & n) = False Then

If DateDiff("n", Hx, "H" & n) > -360 Then



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
Avatar
jpaul.berard
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....
Avatar
db
Le 11/08/2014 18:15, a écrit :


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
Avatar
jpaul.berard
Le lundi 11 août 2014 19:13:35 UTC+2, db a écrit :

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.
Avatar
db
Le 11/08/2014 19:54, a écrit :

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 fonctionnalité 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 formulaire ?
Merci d'avance.




"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
Avatar
jpaul.berard
Le lundi 11 août 2014 20:51:50 UTC+2, db a écrit :

"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 r empli

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))=..., s ous

r�serve que les contr�les du formulaire soient modifiable s.


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 !
Avatar
db
Le 11/08/2014 21:17, a écrit :

Etonnamment, je n'ai pas eu besoin de faire Me(H(n)) = nouvelle valeur. En faisant directement
H(n) = H(n) + 1
mon contrôle a été directement mis à jour !



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
Avatar
jpaul.berard
Le lundi 11 août 2014 22:02:07 UTC+2, db a écrit :

> Etonnamment, je n'ai pas eu besoin de faire Me(H(n)) = nouvelle valeu r. En faisant directement

> H(n) = H(n) + 1

> mon contrôle a été directement mis à jour !


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 :-).



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))
Avatar
Gloops
a écrit le 11/08/2014 15:43 :
If IsNull(Me.Controls("H" & n)) = False Then



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.
Avatar
jpaul.berard
Le mardi 12 août 2014 22:25:54 UTC+2, Gloops a écrit :

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().