Controls [Résolu]

Signaler
Messages postés
332
Date d'inscription
lundi 29 septembre 2008
Statut
Membre
Dernière intervention
10 avril 2020
-
Messages postés
332
Date d'inscription
lundi 29 septembre 2008
Statut
Membre
Dernière intervention
10 avril 2020
-
Bonjour a tous,
Sa faisait un moment que je n'étais passé, IRL oblige !
Ma question est simple,mais je m'y perds !
Set ObjCombo = Me.Controls(I).Name
Comment en faire un objet ?
Ma fonction:

Function ChercheControls(Objets As String) As Integer

Dim I As Long
Dim J As Long
Dim ObjCombo As ComboBox
Dim Nom As String

For I = 0 To Me.Controls.Count - 1
If TypeOf Me.Controls(I) Is ComboBox Then GoSub Suite
Next I
Exit Function

Suite:
Nom = Me.Controls(I).Name ' est ce un combo voulu ?
If InStr(Nom, Objets) > 0 Then
Set ObjCombo = Me.Controls(I).Name
'Erreur ligne cidessus : objet obligatoire !
For J = 0 To 40
ObjCombo.AddItem Str(J)
Next J
End If
Return

j'ai plus de 300 Combo, galère !
Si quelqu'un peut m'aider sa serais cool !

seul celui qui reconnait ses fautes, Progress ..._bar
Galactus le Vrai !

14 réponses

Messages postés
17286
Date d'inscription
mercredi 2 janvier 2002
Statut
Modérateur
Dernière intervention
23 décembre 2019
67
Set implique un Objet

Name est un String, pas un objet

faire simplement :

Set ObjCombo = Me.Controls(I)

pour nettoyer ton code (merci de l'avoir colorié!!!)


que contient la chaine "Objets" transmise ?
il semble que tu souhaites pouvoir cibler plusieurs comboBox.
utilises-tu bien un séparateur entre le nom de chaque combo ciblé ?

pourquoi utiliser une Function (tu ne renvoie rien)

Gosub inutile ici...

Sub ChercheControls(ByRef vF As Form, ByRef vsNames As String)
Dim i As Long
Dim o As Object
Dim oCbo As ComboBox
    '# On parcoure chaque controle de la Form vF
    For Each o In vF.Controls
        '# Si l'itération courante porte sur un Combobox, on le traite...
        If TypeOf o Is ComboBox Then
            Set oCbo = o
            '# Si le nom du combobox correspond a notre demande...
            If InStr(1, oCbo.Name, vsNames, vbTextCompare) Then
                '# On effectue un traitement particulier sur ce contrôle
                For i = 0 To 40
                    oCbo.AddItem Str(i)
                Next i
            End If
        End If
    Next o
End Sub



Renfield - Admin CodeS-SourceS - MVP Visual Basic & Spécialiste des RegExp
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
232
Bonjour,

L'instruction Set affecte un Objet (de type object) à une variable
La propriété Name d'un objet n'est pas un objet, mais le nom (de type string) de l'objet
Set ObjCombo = Me.Controls(I).Name

est bien évidemment en contradiction avec cette règle fondamentale (exposée dans ton aide MSDN pour l'instruction Set)
Dans ta boucle, tu cherches apparemment à parcourir tous les objets contrôles présents sur un Form et quittes ta boucle si tu trouves une ComboBox.
Si tu en trouves une, elle est déjà en soi un objet : l'objet Controls(i) !

Maintenant :
1) ton code est suffisamment mal écrit pour que l'on ne puisse deviner avec certitude le but recherché et te guider, donc, en parfaite connaissance de cause
2) si tu veux une aide plus complète, expose en détail et avec précision de ce tu as sur ton Form et ce que tu cherches à obtenir exactement

PS : en ce qui concerne mon aide éventuelle : je pars en voyage demain matin et ne serai de retour que l'année prochaine. Le temps étant court, je te conseille d'être d'entrée de jeu suffisamment précis pour ne pas tout retarder par la nécessité de te poser au "coup par coup" des questions supplémentaires. Essaye donc d'être à la fois concis et très précis.
____________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches d'autres forumeurs.
Pas d'aide en ligne installée ? ==> ne comptez pas sur moi pour simplement vous dire ce qu'elle contient
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
232
Et peux-tu m'expliquer également ce que tu attends que fasse ton "Return" dans ta fonction ? (alors que je n'y vois aucun GoSub).


____________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches d'autres forumeurs.
Pas d'aide en ligne installée ? ==> ne comptez pas sur moi pour simplement vous dire ce qu'elle contient
Messages postés
17286
Date d'inscription
mercredi 2 janvier 2002
Statut
Modérateur
Dernière intervention
23 décembre 2019
67
Bonnes vacances, l'ami ucfoutu, ta vue baisse, ou la fatigue se fait sentir ^^

Et peux-tu m'expliquer également ce que tu attends que fasse ton "Return" dans ta fonction ? (alors que je n'y vois aucun GoSub).


on a bien :
If TypeOf Me.Controls(I) Is ComboBox Then GoSub Suite


Renfield - Admin CodeS-SourceS - MVP Visual Basic & Spécialiste des RegExp
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
232
Bonjour, Renfield

Ouais, tu as meilleure vue que moi. A ma décharge : un code non indenté et le fait que je n'avais pas encore bu mon café


____________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches d'autres forumeurs.
Pas d'aide en ligne installée ? ==> ne comptez pas sur moi pour simplement vous dire ce qu'elle contient
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
232
ceci étant dit et en lisant ce qu'il écrit là :
j'ai plus de 300 Combo, galère !

et :
- sans préjudice de l'estimation de son appli (300 comboboxes !)
- constatant qu'il veut apparemment remplir toutes ses comboboxes d'une série de chiffre allant de 0 à 40
- et en constatant qu'il développe sous VB6 ===>>
il devrait sans plus attendre s'intéresser à ce que sont les groupes de contrôles indexés, ce qui le conduirait à réduire son code à ceci (avec un groupe de comboboxes "combototo" indexées de 0 à x (299, donc)
For i = 0 To combototo.Count - 1
   For j = 0 To 40
     combototo(i).AddItem j
   Next
 Next

____________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches d'autres forumeurs.
Pas d'aide en ligne installée ? ==> ne comptez pas sur moi pour simplement vous dire ce qu'elle contient
Messages postés
17286
Date d'inscription
mercredi 2 janvier 2002
Statut
Modérateur
Dernière intervention
23 décembre 2019
67
clair que c'est pas courant, ergonomie a revoir, ou du-moins a travailler

même plus court (et rapide)

For Each objCbo In combototo
   For j = 0 To 40
     objCbo.AddItem j
   Next
 Next


Renfield - Admin CodeS-SourceS - MVP Visual Basic & Spécialiste des RegExp
Messages postés
14008
Date d'inscription
samedi 29 décembre 2001
Statut
Modérateur
Dernière intervention
28 août 2015
73
Salut

Consulte <cette documentation> et tu verras que multiplier les objets peut poser des problèmes.
Comme le dit Renfield, il faut revoir l'organisation de ton projet. Il n'est pas normal d'avoir autant d'objets : comment l'utilisateur va t-il s'y retrouver ?

Vala
Jack, MVP VB
NB : Je ne répondrai pas aux messages privés

Le savoir est la seule matière qui s'accroit quand on la partage (Socrate)
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
232
Bonjour, jack,
Je commence d'ailleurs à m'y perdre moi-même, avec un Père (Noël ou Jack ?) qui arrive avec 4 jours d'avance .


____________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches d'autres forumeurs.
Pas d'aide en ligne installée ? ==> ne comptez pas sur moi pour simplement vous dire ce qu'elle contient
Messages postés
332
Date d'inscription
lundi 29 septembre 2008
Statut
Membre
Dernière intervention
10 avril 2020
1
Bonjour,
Oups ! Pas encore but mon café moi !
Merci Renfield et Ucfoutu d'avoir répondu si vite et pardon pour ma présentation de cochon ...
J'en profite pour vous souhaitez de bonne fête de fin d'année !

Je souhaite en effet remplir 300 combos environ d'une série de chiffre allant de 0 à 40.
Avec une fonction, ou sub, peut importe en fait.
Tout les combos sont déjà des groupes de 11 !
Ayant pour nom exemple:
Groupe 1 : CboLevelD(1 à 11)
Groupe 2 : CBOLevelM(1 à 11)
etc ...
Mais vu le paquet, si, si ! Ils servent tous !
Je sais bien que: Me.Controls(I).Name ne peut
pas être transformé en objet !
Set ObjCombo = Me.Controls(I).Name 

est en contradiction, mais c'était l'idée.
Je teste le code de Renfield ...
Et revient dire si sa fonctionne ou pas !
ET surtout après avoir bu mon café ! héhé !
Messages postés
332
Date d'inscription
lundi 29 septembre 2008
Statut
Membre
Dernière intervention
10 avril 2020
1
Me revoiloux !
Merci renfield !
C'était pile poil se que je voulais faire !
Et je viens de comprendre mon erreur, me fallait créer un Objet ! un vrai quoi !
La fatigue et mon age, sans doute, et une grosse épine enlevé !
Je me voyais mal tout remplacer par des textbox même si après une nuit de réflexion, je pense que se serait plus sage !
Pourquoi faire simple quand on peut faire compliqué !

seul celui qui reconnait ses fautes, Progress ..._bar
Galactus le Vrai !
Messages postés
332
Date d'inscription
lundi 29 septembre 2008
Statut
Membre
Dernière intervention
10 avril 2020
1
Oups ! J'ai tout relu et Oublié Jack ! re Oups !
Désoler !
Bonne fête aussi !
Du coup, j'ai tout remplacer par des textbox, plus rapide, mais j'ai gardé le sub pour le remplissage de chacun d'eux via une sauvegarde:
Voici l'image du modèle d'origine ...


seul celui qui reconnait ses fautes, Progress ..._bar
Galactus le Vrai !
Messages postés
17286
Date d'inscription
mercredi 2 janvier 2002
Statut
Modérateur
Dernière intervention
23 décembre 2019
67
possible de passer par des FlexGrid (ou autre)

Renfield - Admin CodeS-SourceS - MVP Visual Basic & Spécialiste des RegExp
Messages postés
332
Date d'inscription
lundi 29 septembre 2008
Statut
Membre
Dernière intervention
10 avril 2020
1
FlexGrid , je ne maitrise pas du tout !

J'avais pensé au listView
C'est mon bébé !
Mais ne me parait pas adapté dans le contexte.
Sauf pour l'affichage final; j'y resiste jamais !




seul celui qui reconnait ses fautes, Progress ..._bar
Galactus le Vrai !