[VBA] Accéder aux variables d'un autre classeur

Accéder aux variables d'un autre classeur [VBA] - VB/VBA/VBS - Programmation

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 :

  • Ouvrir un classeur2
  • Dans le classeur1, exécuter des fonctions du classeur2
  • Dans le classeur1, récupérer la valeur de certaines variables du classeur2


J'ai testé 2 méthodes pour le faire :
 

  • 1) Avec une référence


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.
 

  • 2) Avec "Application.Run"


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 :

Code :
  1. Dim toto As Integer
  2. toto = 2
  3. valeurToto = ThisWorkbook.Value("toto" )


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 !

Reply

Marsh Posté le 28-03-2013 à 18:07:10   

Reply

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 …
 

Reply

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 :
  1. Public Sub importerClasseur2()
  2.     Dim classeur2 As Workbook
  3.     Set classeur2 = Workbooks.Open(Filename:="k:\Classeur2.xlsm" )
  4.    
  5.     Dim nbHibouxDansClasseur2 As Integer
  6.     nbHibouxDansClasseur2 = classeur2.nbHiboux
  7.    
  8.     Debug.Print "Il y a " & nbHibouxDansClasseur2 & " hiboux dans le classeur2"
  9. End Sub


 
Code dans un module de classeur2.xslm :

Code :
  1. Public Const nbHiboux As Integer = 4


 
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.


Message édité par Mozz_ le 29-03-2013 à 10:27:28
Reply

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 :
  1. Public nbHiboux As Integer
  2.  
  3.  
  4. Private Sub Workbook_Open()
  5.     nbHiboux = 4
  6. End Sub

 

Reply

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.


Message édité par Mozz_ le 29-03-2013 à 15:26:12
Reply

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 :
  1. Public Sub ImporterClasseur2()
  2.       Set Cl2 = Workbooks.Open("k:\Classeur2.xlsm" )
  3.     Set Cl2F1 = Cl2.Worksheets(1)
  4.     Debug.Print "Il y a " & Cl2F1.[NBHIBOUX] & " hiboux dans le classeur2."
  5. End Sub


 

Reply

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 :o
 

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 ?
Car là il n'y a plus besoin de déclaration …


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 :jap:


Message édité par Mozz_ le 29-03-2013 à 17:14:53
Reply

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."

 

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed