IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Macros et VBA Excel Discussion :

[VBA] [E-XP] pb de passage variable objet


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    25
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 25
    Par défaut [VBA] [E-XP] pb de passage variable objet
    Bonjour à tous,
    Je bute sur le pb suivant :

    J'ai la fonction suivante pour initialiser des combobox :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    Sub InitCb(RefFichier As Workbook, _
              RefFeuille As Integer, _
              RefCel As String, _
              RefCol As String, _
              RefCombo As Variant)
       Dim compteur As Long
       Dim AjoutListe As String
       For compteur = 2 To RefFichier.Sheets(RefFeuille).Range(RefCel).End(xlDown).Row
          AjoutListe = RefFichier.Sheets(RefFeuille).Range(RefCol & compteur).value
          RefCombo.AddItem (AjoutListe)
       Next compteur
    End Sub
    qui est appelée de la façon suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Call InitCb(FicParamètres, 4, "A1", "A", MultiPageMachines.pgMachine1.cbConstructeur1)
    ça marche, mais je voudrais passer l'argument RefCombo sous forme d'une variable string concatennée du style :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
       Dim comboStr As String
       comboStr = "MultiPageMachines.pgMachine1.cbConstructeur" & variableNumérique
    évidemment ça coince puisque la fonction attend un objet combo
    J'ai passé l'après-midi sur le net sans succès...
    Quelqu'un aurait-il une solution svp
    En vous remerciant d'avance
    Thierry

  2. #2
    Membre chevronné
    Avatar de Bigalo
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    445
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Décembre 2007
    Messages : 445
    Par défaut
    Bonsoir,

    Dans ta Sub, remplace RefCombo As Variant par RefCombo as String, et RefCombo.AddItem par Controls(RefCombo).AddItem.

    Cordialement,


    Michel Gaboly

  3. #3
    Rédacteur/Modérateur


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 125
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur chez EXCELLEZ.net
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 125
    Billets dans le blog
    131
    Par défaut
    Bonjour Thierry,

    Pourquoi veux-tu modifier cela? Qu'auras-tu de plus à utiliser une chaine de caractères? L'avantage de passer le combo en tant qu'objet te permet de le manipuler comme tel dans ta procédure, et donc de ne pas devoir le redéfinir à l'intérieur de la procédure.

    La procédure de Michel fonctionnera si et seulemement si le parent du combo est l'objet ME, c'est-à-dire si ta procédure qui utilisera le nom du combo se trouve dans le module de classe de l'objet qui contient le combo (un userform en l'occurence, car les feuilles de calcul ne contiennent pas de collection controls). Si ta procédure se trouve ailleurs que dans ce module de classe, tu devras préfixer Controls(RefCombo).AddItem...

    Pourrais-tu nous dire l'utilité de la modification?
    "Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
    ---------------
    Mes billets de blog sur DVP
    Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles...
    Pensez à utiliser les tableaux structurés. Ils vous simplifieront la vie, tant en Excel qu'en VBA ==> mon tuto
    Le VBA ne palliera jamais une mauvaise conception de classeur ou un manque de connaissances des outils natifs d'Excel...
    Ce ne sont pas des bonnes pratiques parce que ce sont les miennes, ce sont les miennes parce que ce sont des bonnes pratiques
    VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
    ---------------

  4. #4
    Membre chevronné
    Avatar de Bigalo
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    445
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Décembre 2007
    Messages : 445
    Par défaut
    Pierre,

    Citation Envoyé par Pierre Fauconnier Voir le message
    Bonjour Thierry,

    Pourquoi veux-tu modifier cela? Qu'auras-tu de plus à utiliser une chaine de caractères? L'avantage de passer le combo en tant qu'objet te permet de le manipuler comme tel dans ta procédure, et donc de ne pas devoir le redéfinir à l'intérieur de la procédure.
    Je me suis posé la même question que toi : quel intérêt d’utiliser une chaine de caractères.

    J’ai répondu pour 2 raisons :

    • Thierry a droit à une réponse, même si la demande nous paraît farfelue de prime abord. Je n’ai pas ici une fonction de contrôleur, destiné à juger sévèrement les demandes : si un exemple de code est aberrant, je vais le dire, mais s’il est juste "suboptimal" (pour citer un vieil ami), je ne sens nullement obligé d’expliquer tout ce qui ne va pas, selon moi.
    • J’ai suppposé qu’une justification possible était de traiter plusieurs combo situés au même endroit, auquel cas, "MultiPageMachines.pgMachine1.cbConstructeur" pourrait être stocké dans une variable, "Racine" par exemple, ce qui permettrait de remplacer :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Call InitCb(FicParamètres, 4, "A1", "A", MultiPageMachines.pgMachine1.cbConstructeur1)
    par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Call InitCb(FicParamètres, 4, "A1", "A", Racine & 1)
    ou mieux encore, par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    InitCb FicParamètres, 4, "A1", "A", Racine & 1
    le mot clef "Call" étant un résidu des Basic d’autrefois, parfaitement superflu en VBA.

    Il est vrai que même dans ce cas,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    InitCb FicParamètres, 4, "A1", "A", Controls(Racine & 1)
    en conservant
    dans la Sub "InitCb serait encore mieux

    Citation Envoyé par Pierre Fauconnier Voir le message
    La procédure de Michel fonctionnera si et seulemement si le parent du combo est l'objet ME, c'est-à-dire si ta procédure qui utilisera le nom du combo se trouve dans le module de classe de l'objet qui contient le combo (un userform en l'occurence, car les feuilles de calcul ne contiennent pas de collection controls). Si ta procédure se trouve ailleurs que dans ce module de classe, tu devras préfixer Controls(RefCombo).AddItem...
    Pourrais-tu nous dire l'utilité de la modification?
    Tout à fait, mais

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Call InitCb(FicParamètres, 4, "A1", "A", MultiPageMachines.pgMachine1.cbConstructeur1)
    dans l’exemple de code laisse fortement penser que le ComboBox est situé sur une page d’un contrôle Multipage.

    Comme ce contrôle Multipage, "MultiPageMachines" est utilisé directement, sans préfixe, on peut en déduire que le code applelant la Sub "InitCb" se trouve dans le module associé au UserForm concerné (sauf si l’objet MultiPage est posé directement sur une feuille de calcul), ce qui me paraît hautement improbable.

    Il est également très peu probable que la procédure "InitCb" se trouve dans un autre module, et si c’était le cas, cela appellerait d’autres critiques. À défaut d’info complémentaire, j’ai effectivement supposé que "InitCb" était dans le module du UserForm.

    Cordialement,

  5. #5
    Rédacteur/Modérateur


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 125
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur chez EXCELLEZ.net
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 125
    Billets dans le blog
    131
    Par défaut
    Salut Michel,

    Je ne vais pas ici discuter de nos philosophies respectives quant à l'opportunité d'une réponse ou d'une question "subsidiaire"...

    Ma question à Thierry sur le pourquoi de la modification lui permettra de nous préciser ce qu'il souhaite réaliser, et donc de l'aider à optimiser son code, quitte à le remanier avec lui... (Chacun sa philosophie...)

    Cela étant, sur l'intérêt technique de la chose:

    Soit la procédure est externe au module de classe, et en utilisant une chaine de caractères, il faudra préfixer l'objet. Ce préfixage sera inutile si l'on passe l'objet en tant que tel, quitte à créer, à l'intérieur de la procédure appelante, la boucle pour déterminer l'objet (pour ma part, gestion plus propre du code)...

    Soit la procédure est interne au module de classe, et il n'y a alors pas lieu, a priori, de passer le combo en paramètre puisqu'il est utilisable directement en tant que tel à l'intérieur de la procédure.

    C'est pourquoi j'en appelle à Thierry pour qu'il explicite ce qu'il souhaite obtenir...
    "Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
    ---------------
    Mes billets de blog sur DVP
    Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles...
    Pensez à utiliser les tableaux structurés. Ils vous simplifieront la vie, tant en Excel qu'en VBA ==> mon tuto
    Le VBA ne palliera jamais une mauvaise conception de classeur ou un manque de connaissances des outils natifs d'Excel...
    Ce ne sont pas des bonnes pratiques parce que ce sont les miennes, ce sont les miennes parce que ce sont des bonnes pratiques
    VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
    ---------------

  6. #6
    Membre chevronné
    Avatar de Bigalo
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    445
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Décembre 2007
    Messages : 445
    Par défaut
    Pierre,

    Que le procédure soit interne ne rend absolument pas inutile de passer le combo en paramètre :

    Si Thierry a écrit une procédure pour initialiser les Combo, on peut supposer qu’elle est destinée à être utilisée pour plusieurs Combo distincts, auquel cas, il faut bien passer à la procédure le Combo concerné, chaque fois qu’elle est appelée !

    Le "1", à la fin du nom du Combo utilisé dans l’extrait de code, cbConstructeur1, semble bien confirmer l’existence de plusieurs Combo similaires.

    Dans mon esprit, que la procédure soit dans un module standard ne se justifie que si elle est utilisée pour plusieurs UserForms distincts, auquel cas, il n’y a aucune raison de l’appeler à partir du module du UserForm. Le code correct me paraît alors devoir être quelque chose comme :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Sub InitUF1()
    Dim Racine As String, i As Integer
        Racine = "MultiPageMachines.pgMachine1.cbConstructeur"
            For i = 1 To 4 ' Borne à adapter
                InitCb FicParamètres, 4, "A1", "A", UF1.Controls(Racine & i)
            Next
        UF1.Show
    End Sub
    Dans le module contenant la Sub "InitCB".

    Amicalement,

  7. #7
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    25
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 25
    Par défaut
    Bonjour,
    Tout d'abord merci de votre intérêt à ma question et vos réponses.
    Comme vous pouvez voire la combo est dans un multipage.
    Or j'ai 10 pages avec le même combo :

    de MultiPageMachines.pgMachine1.cbConstructeur1
    à MultiPageMachines.pgMachine10.cbConstructeur10

    d'ou l'idée de faire une boucle de 10 avec un seul appel de sub en faisant varier le nom du combo par variable concaténée.

    Il n'y a qu'un formulaire et l'appel de la sub est dans son code d'initialisation.
    Merci encore
    Thierry

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Variable Objet VBA excel
    Par blade15 dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 09/07/2009, 10h57
  2. Excel VBA et dll Com VB.net:passage d objet en parametre
    Par blueskyman dans le forum VB.NET
    Réponses: 0
    Dernier message: 02/02/2009, 02h22
  3. Variable Objet VBA
    Par blade15 dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 06/12/2007, 18h41
  4. Réponses: 4
    Dernier message: 16/06/2006, 00h27
  5. [VBA-E]erreur 91: variable objet ou variable de bloc With...
    Par cdk dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 07/03/2006, 14h19

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo