Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1530 connectés 

  FORUM HardWare.fr
  Programmation
  VB/VBA/VBS

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

 



 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

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

n°2183031
Mozz_
Posté le 28-03-2013 à 18:07:10  profilanswer
 

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 !

mood
Publicité
Posté le 28-03-2013 à 18:07:10  profilanswer
 

n°2183053
Marc L
Posté le 28-03-2013 à 19:23:59  profilanswer
 

 
            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 …
 

n°2183106
Mozz_
Posté le 29-03-2013 à 09:41:52  profilanswer
 

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
n°2183144
Marc L
Posté le 29-03-2013 à 13:04:28  profilanswer
 

 
           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

 

n°2183180
Mozz_
Posté le 29-03-2013 à 15:25:57  profilanswer
 

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
n°2183193
Marc L
Posté le 29-03-2013 à 16:11:03  profilanswer
 

 
           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


 

n°2183203
Mozz_
Posté le 29-03-2013 à 17:12:10  profilanswer
 

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
n°2183206
Marc L
Posté le 29-03-2013 à 17:24:28  profilanswer
 

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

 


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  VB/VBA/VBS

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

 

Sujets relatifs
[VBA] Savoir si n'importe quel caractère défini est plusieurs fois...VBA supprimer cours de bourse
Programme VBA trouvant une valeur répondant à des conditions ET/OUSOS VBA Besoin d'aide pour un programme
Lancer invite de commande en VBAEcritude dans un fichier.bat à partir de VBA
problème programmation VBAVBA prob de doublon
VBA et excel Base de donnéesproblème éclipse et les variables d'environement
Plus de sujets relatifs à : [VBA] Accéder aux variables d'un autre classeur


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR