Utilisation Controls() dans module vba

Fermé
seb4257 - 14 juin 2013 à 11:01
eriiic Messages postés 24600 Date d'inscription mardi 11 septembre 2007 Statut Contributeur Dernière intervention 21 octobre 2024 - 15 juin 2013 à 17:28
Bonjour,

j'utilise régulièrement l'instruction Controls() dans mes formulaires Access.
exemple d'instruction:

For i = 1 To 20
Controls("Img" & Trim$(Str$(i))).Visible = False
Next i

je voulais utiliser cette même instruction dans une boucle timer pour déterminer si mon curseur n'était plus sur le contrôle déclencheur et le cas échéant quitter la boucle. "ctrle" est donc le nom du contrôle déclencheur de ma procédure et je teste si mon curseur est toujours sur lui dans la boucle. ça donne ça:

Sub PauseSi(tps, ctrle)
Dim Curseur As POINTAPI
Dim lngStatus As Long

tinit = Timer
Do While Timer - tinit < tps
lngStatus = GetCursorPos(Curseur)
If Curseur.x < Controls(ctrle).Left Or Curseur.x > (Controls(ctrle).Left + Controls(ctrle).Width) Or Curseur.y < Controls(ctrle).Top Or Curseur.y > (Controls(ctrle).Top + Controls(ctrle).Height) Then GoTo TempsEcoule
DoEvents
Loop

le problème c'est que cette procédure est dans un module et que du coup j'ai un message d'erreur "erreur de compilation: Sub ou Function non définie". dans le code d'une Form VBA connait bien Controls() mais visiblement pas dans un module.
auriez vous une solution?

4 réponses

en fait non ça fonctionne pas.
sur un formulaire j'ai des photos.
j'ai une "Function infos (Origine as string)" qui se déclenche lors d'un mousemove sur une image et qui doit rendre visible une zone de liste dans laquelle il y a le résultat d'une requête en rapport avec l'image qu'on survole.
pour cela, dans ma "Function infos" il y a une boucle qui permet de rendre visible ma Zone de liste X secondes.
le problème vient du fait que si je passe le curseur sur 10 images à la suite (par exemple je fais juste traverser mon curseur d'un coté a l'autre de l'écran), je lance 10 boucles timer et ça arrive a planter Access.
du coup j'essayai la boucle citée plus haut pour sortir de la boucle si mon curseur quitte mon image, et ainsi n'avoir qu'une boucle timer active à la fois.

donc mon image appelle la function qui elle même appelle ma sub timer. c'est peux etre cette imbrication qui pose problème.


en mettant directement le code de la sub timer dans la function je n'ai plus de message d'erreur, mais ma zone de liste clignote avec un sablier.
1
blux Messages postés 26473 Date d'inscription dimanche 26 août 2001 Statut Modérateur Dernière intervention 15 novembre 2024 3 316
14 juin 2013 à 14:55
Là, je crois que tu as atteint les limites de VBA.
Comme c'est de la programmation évènementielle, tu ne peux pas avoir une liste des actions en cours à un moment donné, puisqu'elles sont lancées en asynchrone pour access.
Je crains que tu n'arrives pas à faire ce que tu souhaites...
0
pourtant sortir d'une boucle si il se passe un événement donné ne semble pas si compliqué.

peut-être y aurait il une approche complètement différente pour arriver à ce résultat?
0
blux Messages postés 26473 Date d'inscription dimanche 26 août 2001 Statut Modérateur Dernière intervention 15 novembre 2024 3 316
14 juin 2013 à 15:22
pourtant sortir d'une boucle si il se passe un événement donné ne semble pas si compliqué.
Pas dans le type de programmation évènementielle, car cela voudrait dire qu'un évènement va modifier ou interférer le comportement d'un autre évènement...

peut-être y aurait il une approche complètement différente pour arriver à ce résultat?
Je ne vois pas trop, là...
Si encore, tu laissais affichée ta zone de liste, ça pourrait peut-être marcher, puisqu'il suffirait (à mon avis) de faire un .refresh ou un .repaint...
0
précise ton idée avec refresh ou repaint voir si c'est applicable
0
blux Messages postés 26473 Date d'inscription dimanche 26 août 2001 Statut Modérateur Dernière intervention 15 novembre 2024 3 316
14 juin 2013 à 11:04
Salut,

erreur sur quelle ligne ?
0
oups pardon, j'oublie le principal.
il s'arrête sur "Controls(ctrle).Left" en surlignant "Controls".
c'est pour ça que je disais qu'il ne semble plus reconnaitre Controls()
0
blux Messages postés 26473 Date d'inscription dimanche 26 août 2001 Statut Modérateur Dernière intervention 15 novembre 2024 3 316
14 juin 2013 à 11:29
J'ai peur qu'il n'emmène pas le contexte quand tu appelles ta fonction et que du coup, il ne sache pas de quel contrôle on parle...

Si tu mets le code de ta fonction là où tu en as besoin, ça marche ?
0
je n'ai pas le résultat escompté, mais ça fonctionne effectivement.
en fait le but est initialement d'affiche une zone de liste comme infobulle pendant un certain temps (variable tps) mais en interrompant cet affichage si le curseur quitte le contrôle ( des images) pour lequel on a cette infobulle
0
eriiic Messages postés 24600 Date d'inscription mardi 11 septembre 2007 Statut Contributeur Dernière intervention 21 octobre 2024 7 239
15 juin 2013 à 17:28
Bonjour,

il faudrait peut-être lui indiquer dans quel formulaire il est :
userform1.control(...) etc

eric
0