Accéder aux variables d'un autre classeur [VBA] - VB/VBA/VBS - Programmation
Marsh Posté le 28-03-2013 à 19:23:59
Bonjour, si j'ai bien compris, car sans voir le code ni le genre de variables à récupérer (…),
je le fais simplement mais ni avec l'une ni avec l'autre !
Dans le classeur 2, définir les variables publiques par exemple dans le module du classeur en entête :
Public {nom de la variable} As {type de la variable} |
Le type n'est pas obligatoire, c'est selon …
Dans le classeur 1, on définit dans la procédure une variable pointant sur le classeur, par exemple s'il est ouvert et actif :
Set Wb = ActiveWorkbook |
puis toujours dans cette même procédure une variable du classeur 2 est accessible ainsi :
Wb.{nom de la variable} |
Evidemment une procédure du classeur 2 aura alimenté au préalable ses variables publiques …
Marsh Posté le 29-03-2013 à 09:41:52
Merci pour ta réponse, mais je n'ai pas bien compris ^^'
Voilà un exemple de code actuel assez simple, mais qui ne marche pas :
Dans le lecteur "k:", j'ai deux classeurs : classeur1.xlsm, et classeur2.xlsm
Code dans un module de classeur1.xlsm :
Code :
|
Code dans un module de classeur2.xslm :
Code :
|
Quand j'exécute le code de "importerClasseur2", ça plante à la récupération de la valeur (nbHibouxDansClasseur2 = classeur2.nbHiboux).
Ce que j'aimerais faire, c'est récupérer la valeur de "nbHiboux", mais sans passer par un accesseur "getNbHiboux" qui serait défini dans le classeur2.
Marsh Posté le 29-03-2013 à 13:04:28
Et boom, en plein dans le mille ! Je n'ai pas indiqué un quelconque module mais le module du classeur !
En fait le module de classe du classeur, ThisWorkbook par défaut, j'aurais peut-être dù le préciser …
Et boom, encore une fois ! Là il ne s'agit plus d'une variable mais d'une constante !
Hors en consultant l'aide de l'instruction déclarative Const, c'est interdit dans un module de classe !
Donc on oublie les constantes pour repartir sur les variables …
Exemple de code à insérer dans le module de classe ThisWorkbook du classeur 2 :
Code :
|
Marsh Posté le 29-03-2013 à 15:25:57
En fait, je cherche aussi à pouvoir récupérer la valeur de certaines variables. Mais pour avoir l'exemple de code le plus synthétique possible, j'ai mis une constante.
En déplaçant le code dans "ThisWorkbook" du classeur2, ça marche effectivement ! Donc, si je comprends bien, cette méthode ne permet de récupérer que la valeur des variables déclarées dans "ThisWorkbook", mais pas dans les autres modules ?
Idéalement, je voulais pouvoir récupérer n'importe quelle variable/constante du classeur2, comme c'est par exemple le cas en utilisant la référence.
Marsh Posté le 29-03-2013 à 16:11:03
En déclarant des variables publiques dans le module de classe du classeur,
elles sont donc utilisables dans ses modules simples et récupérables dans d'autres classeurs.
De toute manière, même si cela fonctionnait depuis un simple module, il faudrait quand même déclarer les variables publiques …
Maintenant si cela concerne des valeurs fixes, des constantes donc,
pourquoi ne pas utiliser des cellules nommées de la feuille réservées à cet effet ?
Car là il n'y a plus besoin de déclaration …
Par exemple si une cellule de la feuille 1 du classeur 2 est nommée NBHIBOUX, dans le classeur 1 on y accède
Code :
|
Marsh Posté le 29-03-2013 à 17:12:10
Marc L a écrit : De toute manière, même si cela fonctionnait depuis un simple module, il faudrait quand même déclarer les variables publiques … |
Justement, elles sont déclarées en public.
Ça ne me viendrait pas à l'idée d'essayer de récupérer des variables privées, et à plus forte raison dans un autre classeur
Marc L a écrit : Maintenant si cela concerne des valeurs fixes, des constantes donc, pourquoi ne pas utiliser des cellules nommées de la feuille réservées à cet effet ? |
Ce serait plus simple en effet, mais je ne contrôle pas le format des données dans le classeur1 ou dans le classeur2. Il est ce qu'il est ^^
Même si ça ne correspond pas tout à fait à ce que je veux, je te remercie pour ton aide
Marsh Posté le 29-03-2013 à 17:24:28
Je vois de tout et pas qu'ici ! …
Bon ben, ne reste plus qu'à faire un couper / coller des déclarations de variables publiques du classeur 2
de ses modules simples vers son module de classe ThisWorkbook …
Dans mon précédent exemple, la ligne 3 est une option;
sans cette ligne, la feuille 1 est directement accessible par son nom objet (CodeName) :
Debug.Print "Il y a " & Cl2.Feuil1.[NBHIBOUX] & " hiboux dans le classeur2." |
Marsh Posté le 28-03-2013 à 18:07:10
Bonjour,
Voilà ce que j'essaye de faire :
Dans un classeur (classeur1), j'exécute du code VBA pour :
J'ai testé 2 méthodes pour le faire :
Dans le classeur1, créer une référence vers le classeur2 (dans Outils / Références). C'est assez pratique parce que je peux ensuite accéder à n'importe quelle fonction ou variable avec "var = Classeur2.nomFonction" ou "var = Classeur2.nomVariable".
Le problème, c'est que je n'arrive pas à charger dynamiquement le classeur2 dans le classeur1. J'ai bien essayé : Call ThisWorkbook.VBProject.References.AddFromFile(cheminClasseur2) mais ça fait une erreur à l'exécution qui m'empêche ensuite de débugger le code pas à pas
En plus, je ne sais pas comment accéder dynamiquement à la référence vers le classeur2, que je viens d'ajouter.
Autrement dit, ça marche bien quand je fais la manip manuellement dans Outils / Références, mais ça ne marche pas quand j'essaye de faire l'équivalent en code.
La deuxième méthode, c'est d'utiliser des appels du type "var = Application.Run(Classeur2!nomFonction)". Ca marche bien pour les fonctions, mais je ne trouve pas de moyen simple d'accéder à la valeur des variables, à part évidemment en créant une fonction "get" pour accéder à chaque variable.
Le problème, c'est que j'ai une tonne de variables, et la flemme de créer un accesseur pour chacune. Est-ce qu'il n'y aurait pas une fonction d'un Workbook qui renvoie la valeur d'une variable en fonction de son nom ?
Un truc du type :
et que tout magiquement, ça fasse que valeurToto = 2.
Voilà, j'espère que mon problème est clair. Merci d'avance pour votre aide !