Appeler les contrôles d'un état par leur index ?

Fermé
Tessel75 - 12 juil. 2022 à 17:14
 Tessel75 - 19 juil. 2022 à 22:50

Bonjour,

J'ai un état de comptabilité avec un certain nombre de contrôle, je veux que si la valeur d'un contrôle est nulle, ce contrôle ne soit pas visible. J'ai fait mon code de telle sorte que l'action se fait bien comme je le souhaite.

Mais je voudrais l'améliorer. Actuellement, j'appelle les contrôles un par un par leur nom; ce qui fait que mon code est assez long et lourd, parce qu'il y en a pas mal. Aussi, pour alléger je voudrais les appeler par leur Index dans une boucle, soit avec For each control .... Next , soit avec Do .... Loop until .... .  Mais ça ne passe pas, ni avec  Control.Index = N, ni avec Control.TabIndex = N.

Quelqu'un aurait-il la solution pour résoudre mon problème ?   Je répète, il s'agit d'un Etat en cours d'édition Preview et non pas d'un formulaire, donc il ne peut être question d'utiliser la fonction with Screen.ActiveControl qui ne fonctionne pas dans le cas présent.

Merci à tous pour votre aide.


Windows / Firefox 102.0

A voir également:

6 réponses

yg_be Messages postés 23405 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 20 décembre 2024 Ambassadeur 1 557
12 juil. 2022 à 18:10

bonjour,

Peux-tu montrer comment ton code fait appel aux contrôles?

Qu'as-tu essayé comme "For each control .... Next"?  C'est l'objet en "in" qui pose problème, ou le type de "control"?  Souvent mieux de séparer:

dim liste as aaa, control as bbb
set liste = ...
for each control in liste
...
next control

As-tu envisagé de partir d'une liste des noms des contrôles?  Tu peux alors simplement boucler dans la liste.

Peux-tu partager un fichier exemple?

0
yg_be Messages postés 23405 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 20 décembre 2024 1 557
12 juil. 2022 à 18:33

J'essaierais une de ces trois techniques:

' 1
for each control in xxx.controls

'2
for i = 0 to xxx.controls.count
    set control=xxx.controls(i)

'3
nomcontrole=...
set control=xxx.controls(nomcontrole)
0

Bonjour et merci pour ta réponse.

Comme j'ai dit dans ma question la difficulté n'est pas dans le lancement de la boucle, j'ai bien écrit

For Each Ctrl In CodeContextObject.Section(N).Controls Section(N) est la section où se trouve les contrôles à masquer.

La difficulté est dans l'appel des contrôles avec Index ou tabIndex pour lesquels je bute sur la syntaxe.

Ci-dessous un exemple de cce que j'ai écrit mais qui ne donne pas ce que j'attends

With CodeContextObject.Section(N)  
Do
            m = m + 1
            TabIndex = m         

             Ctrl = Ctrl.TabIndex (m)
        If Ctrl = 0 Or IsNull(Ctrl) Then
                Ctrl.Visible = no
        Else
                Ctrl.Visible = yes
        End If
CtrlSuivant:
Loop Until m > 500

End with

0
yg_be Messages postés 23405 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 20 décembre 2024 1 557
12 juil. 2022 à 20:53

Les petits morceaux de code que tu montres ne nous permettent pas d'avoir une vue d'ensemble.

Peux-tu partager un fichier exemple?

0
yg_be Messages postés 23405 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 20 décembre 2024 1 557 > yg_be Messages postés 23405 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 20 décembre 2024
12 juil. 2022 à 20:57

peut-être:

For Each Ctrl In CodeContextObject.Section(N).Controls
        If Ctrl = 0 Or IsNull(Ctrl) Then
                Ctrl.Visible = false
        Else
                Ctrl.Visible = true
        End If
next Ctrl
0

J'ai donc essayé la boucle que tu proposes, qui est à peu près celle que j'avais bâtie à l'origine, et elle me sort tous  les éléments de la section, y compris ceux qui ne sont pas des contrôles, les étiquettes, les traits de séparation entre les blocs de données. C'est donc pour cela que je voulais les index , pour être sûr qu'il ne répertorie que les vrais contrôles.

0
yg_be Messages postés 23405 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 20 décembre 2024 1 557
13 juil. 2022 à 08:05

Tu peux sans doute examiner le type de contrôle, pour ne garder que ceux qui t'intéressent.

0
yg_be Messages postés 23405 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 20 décembre 2024 1 557
18 juil. 2022 à 13:07

Quand tu écris "contrôle", penses-tu "textbox"?
Si oui, comme suggéré le 13 juil. 2022 à 08:05, tu peux faire ainsi:

Dim Ctrl As Control, N As Integer
For Each Ctrl In CodeContextObject.Section(N).Controls
    If Ctrl.ControlType = acTextBox Then
        If Ctrl = 0 Or IsNull(Ctrl) Then
                Ctrl.Visible = False
        Else
                Ctrl.Visible = True
        End If
    End If
Next Ctrl

Ce code examine le type de chacun des contrôles de la section, et ne traite que les boîtes de texte, et pas les autres contrôles: les étiquettes, les traits de séparation, ...

0

Bien sûr !   C'est ce que j'ai fait en sélectionnant ceux qui ont un nombre pour index.ça marche; mais le problème, c'est qu'après, même en ne conservant que ces contrôles, il ne masque pas ceux dont la valeur est égale à 0. Et c'est précisément ce que je veux obtenir.

0
yg_be Messages postés 23405 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 20 décembre 2024 1 557
14 juil. 2022 à 20:38

Je suggère d'ajouter à la boucle en #5 un test pour ne traiter que les contrôles qui t'interessent.  As-tu compris la suggestion, et fait cela?  J'en doute, vu ta réponse en #9.

Pourquoi ne montres-tu pas alors le code de ce que tu as fait?

Tu demandes des suggestions, et, à chaque suggestion, tu réagis avec des objections.  J'ai l'impression que tu ne cherches pas de solution, tu cherches uniquement à montrer que tu as déjà tout essayé.

Pour que cette discussion soit constructive, partage un fichier exemple, avec ton code, décris le résultat obtenu, et le résultat attendu.

Autrement, je ne vois pas comment t'aider.

0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question

Merci de ta réponse. Excuse moi de répondre si tard, je ne l'avais pas vue.

Pour ce qui est du contenu lui-même de ta réponse, il ne s'agit pas du tout de ça. En général, quand je pose une question, c'est parce que je bute sur un point particulier; je peux toujours bénéficier d'autres suggestions mais comme je sais où je veux aller, je trouve trop compliqué de tout expliquer et après de dire que je ne veux pas ceci ou cela parce que ceci ou cela, parce que ça ne correspond pas à mon programme. C'est aussi ce que je fais dans mes réponses; je ne cherche pas à savoir le pourquoi mais j’essaie d'expliquer le comment faire sans chercher à connaitre le code du début à la fin.

Cela dit, j'ai fini par trouver la réponse que je cherchais, je la mettrai en ligne, dès que j'aurai fini, pour ceux qui seraient intéressés.  C'était finalement très simple, il suffisait de savoir.

0
blux Messages postés 26539 Date d'inscription dimanche 26 août 2001 Statut Modérateur Dernière intervention 20 décembre 2024 3 317
Modifié le 18 juil. 2022 à 13:37

Salut,

If Ctrl = 0 Or IsNull(Ctrl) Then

Ce ne serait pas en testant plutôt :

Ctrl.Value = 0

0

Merci de ta réponse.

Pour ce qui est de ta suggestion la réponse est "non",  parce que a valeur par défaut de "Ctrl" est "value", càd qu'on écrive  xxxxx = Ctrl  ou xxxxx = Ctrl.Value  cela donne exactement le même résultat.

Cela dit, pour être absolument certain de ne ramener que des valeurs non-nulles, j'avais poussé le vice jusqu'à écrire :   "If not (IsNull(Ctrl) or IsEmpty(Ctrl) or Ctrl = 0)   then ...... " .

Mais ce n'est pas là mon problème; il est de sélectionner les contrôles adéquats par leur Index.

Merci encore.

0