VBA, Option Byref dans macro complémentaire?

Un grand bonjour à tous ceux et celles qui nous offrent leur savoir.

Avec plusieurs outils vba à mon actif,
je me tourne dernièrement vers le développement de macros complémentaires.

Les problèmes arrivent assez vite.
J'ai créé une routine (donc une sub placée dans mon fichier .xla) qui nécessite une série d'arguments pour travailler.
Ces arguments sont, des variables string, des entiers, des objets, des variables tableaux...

Cette routine modifie certains des arguments.

Et voici le problème par lui même :
Cette routine complémentaire est utilisée par une macro "normale" placée dans un fichier .xls quelconque.

Malgré avoir bien déclaré toutes mes variables utilisées en argument (option explicit oblige :)
Et bien les modifications réalisées par la routine complémentaire sur mes variables sont perdues dès la fin de cette routine.

C'est bien là tout le problème, j'ai besoin de récupérer ces modifs moi !!! Sinon ma routine ne sert à rien !! :)

J'ai beau user de l'option Byref devant chacun des arguments, cela s'avère inefficace.
Bref, je sèche...

Quelqu'un sait-il d'où vient ce problème ?

4 réponses

  1. J'ai finalement une solution pour contourner le problème.

    Le variables as object qui sont modifiées par la "macro complémentaire" reviennent correctement modifiées. Contrairement au variables as string, as integer, etc..

    Il m'a donc fallu créer un objet qui contienne toutes les autres infos.
    Le gagnant du jour est le dictionary.

    Chaque nom de variable devient une key de mon dictionary et le contenu de la variable sera la définition.

    En langage vba, voici ce que ça donne :

    mon_dico.add "nom_de_ma_variable", ma_variable

    Ensuite, je donne à manger mon_dico à ma macro complémentaire qui en modifiera le contenu et me rendra mon_dico bien modifié.

    Voilà.
    Je ne sais toujours pas comment faire pour que ma macro complémentaire me rende directement les modifs des variables de type string ou autre, mais en utilisant des objets à la place, j'ai quand même pu récupérer mes infos.
    1. Contributeur
      bonjour
      Une fonction ne renvoie qu'une variable

      le fait d'utiliser une collection "dictionary" te renvoie une variable de type objet, ce qui est valable. une autre possibilité, moins pratique à mon avis, aurait été de renvoyer une variable-tableau
      Michel
      1. Attention, je n'utilise pas une fonction, mais une routine.

        C'est assez différent.

        Dans le cas d'une fonction, c'est le nom de la fonction qui sert de variable.


        Function Ma_belle_fonction (argument1, argument2, etc...) as string
        Ma_belle_fonction = mon travail avec les arguments
        End Function

        Dans le cas de ma routine, ce sont les arguments qui subissent des modifs

        Sub Ma_belle_routine (arg1, arg2)

        ...
        arg1 = arg1_modifié
        arg2 = arg2_modifié

        End Sub

        En sortie, je n'arrive à récupérer que les modifs réalisées sur les arguments as object et c'est tout. Heureusement, sur tous les arguments as object et pas juste un seul.

        Alors que, si Ma_belle_routine n'est pas une macro complémentaire, mais une macro "normale" placée dans le même projet, alors je peux récupérer les modifs sur tous les arguments, quelles que soient leurs définitions.
        1. Contributeur
          ne te fâche pas, grand génie

          base du vba: Ta" routine" s'appelle une macro-fonction paramétrée

          Excuses moi de t'avoir dérangé
        2. Je ne me fâche pas :)
          j'essai juste de comprendre au mieux.

          J'ai déjà assez de mal à piger ce que je fais parfois.
          Si je ne fais plus le distingo entre les 2, je me mélange les pinceaux, et pour finir, mon code devient total foireux :o)

          C'est aussi pour ça que j'appelle à l'aide.....
      2. Pour ceux que ça intéresse toujours,

        Il existe une possibilité de retrouver toute la fonctionnalité de l'option "byref" simplement si la macro (routine, procédure, fonction ou que sais-je... n'est-ce pas Michel:o) qui utilise la macro complémentaire devient elle aussi une macro complémentaire, alors ça marche.

        Tous les types de variables reviennent correctement modifiés.