Résolu Macro Excel variable globale dans plusieurs projets Excel

jeremvba31

Nouveau membre
Bonjour,

Je cherche comment utiliser une variable globale dans plusieurs projets Excel. Est-ce possible ?

Voici un exemple :

Dans un premier projet Tab_init_var_globale.xls j'écris dans un Module 1 :

Public var_globale As Integer
Sub Init_var_globale()
var_globale = 9
End Sub


Puis dans un deuxième projet Tab_Util_var_globale.xls je souhaiterais utiliser la variable globale var_globale. Dans un Module 1, j'écris :

Sub Utilisation_var_globale()
' Rem : je suppose ici que le tableur Tab_init_var_globale.xls a déjà été ouvert
Application.Run "Tab_init_var_globale.xls!Module1.Init_var_globale"
MsgBox var_globale
End Sub


Et malheureusement ça ne marche pas : la variable var_globale est bien initialisée à 9 par la procédure Init_var_globale mais sa valeur n'est pas accessible dans le projet Tab_Util_var_globale.xls => var_globale vaut finalement 0.
Y a t-il une solution ?

Merci d'avance pour votre aide
 

zeb

Modérateur
Bonjour jeremvba31, sois le bienvenu.

Je t'invite à lire le règlement, à le respecter. Pour preuve de ta bonne volonté, modifie donc ton message précédent pour le rendre conforme.
 

jeremvba31

Nouveau membre
Bonjour,

J'espère avoir compris en quoi mon message ne respectait pas le règlement. Je remets mon message initial avec les balises de code...

Je cherche comment utiliser une variable globale dans plusieurs projets Excel. Est-ce possible ?

Voici un exemple :

Dans un premier projet Tab_init_var_globale.xls j'écris dans un Module 1 :

Code:
Public var_globale As Integer
Sub Init_var_globale()
var_globale = 9
End Sub

Puis dans un deuxième projet Tab_Util_var_globale.xls je souhaiterais utiliser la variable globale var_globale. Dans un Module 1, j'écris :

Code:
Sub Utilisation_var_globale()
' Rem : je suppose ici que le tableur Tab_init_var_globale.xls a déjà été ouvert
Application.Run "Tab_init_var_globale.xls!Module1.Init_var_globale"
MsgBox var_globale
End Sub

Et malheureusement ça ne marche pas : la variable var_globale est bien initialisée à 9 par la procédure Init_var_globale mais sa valeur n'est pas accessible dans le projet Tab_Util_var_globale.xls => var_globale vaut finalement 0.
Y a t-il une solution ?

Merci d'avance pour votre aide
 

zeb

Modérateur
Salut.

Tu as trouvé pour la mise en forme. Mais tu aurais pu modifier ton message, sans tout recopier. Qu'importe.

Alors bien sûr que c'est possible. Mais il va falloir m'expliquer ce que tu entends par projets Excel. S'il s'agit de classeurs différents, il va falloir stocker cette variable quelque part dans 1, là où 2 2 pourra la lire.

Il existe plusieurs endroits où stocker une valeur :
■ Dans une cellule du classeur 1.
■ Dans une cellule du classeur 2.
■ Comme tout document Office, un classeur possède des propriétés où l'on peut stocker ta valeur (fichier/propriété/personnalisation).
■ Dans la base de registre.
■ Dans un fichier quelconque.
■ Dans un fichier ini.

Mais certainement pas en mémoire, sauf si je n'ai pas compris ton histoire de "projet".
 

jeremvba31

Nouveau membre
Meilleure réponse
Bonjour,

Merci pour votre réponse. J'ai récupéré une autre réponse par un formateur, qui répond exactement à ce que je cherchais à faire. J'inclus sa réponse dans mon message.

Le mot projet correspond à un projet de programmation VBA (VBAProject), qu'on visualise dans l'Explorateur de Projets. Dans mon exemple, j'ai deux projets VBA (qui s'appellent par défaut VBAProject), contenus dans deux tableurs Excel (que j'ai appelés Tab_init_var_globale.xls et Tab_Util_var_globale.xls).

Pour pouvoir utiliser une variable globale dans plusieurs projets (qu'on peut appeler une variable "super globale"), si on reprend mon exemple ci-dessus, il faut :

- changer le nom du projet dans lequel on a déclaré la variable globale (dans l’explorateur de projets, clic droit sur le nom actuel du projet, puis Propriétés du projet, puis lui donner un nom compatible avec les règles des identifiants VB) : par exemple Projet_Init_var_globale

- Dans les projets où l'on souhaite utiliser la variable globale, on doit faire Outils-Références, puis cocher la case intitulée de la même façon que le projet qui contient la variable « super-globale » (pour que les variables globales d’un projet soient accessibles à d’autres, ces autres projets doivent faire référence au projet qui contient la variable globale). Dans mon exemple, dans mon projet du tableur Excel Tab_util_var_globale.xls, je mets en référence le projet Projet_Init_var_globale

- On peut faire référence à la variable "super-globale" dans toute procédure du/des projet(s) qui référencent le projet Projet_Init_var_globale.

Après avoir suivi cette manip, ça marche, var_globale vaut bien 9 en fin de procédure Utilisation_var_globale !
 

dve

Nouveau membre
Bonjour,


On peut aussi utliser des API Windows


Voir le code ci-dessous dans un module VBA :

Code:
'*************************************************
Option Explicit

Declare Function SetEnvironmentVariable Lib "kernel32" Alias _
"SetEnvironmentVariableA" (ByVal lpName As String, _
ByVal lpValue As String) As Long

Declare Function GetEnvironmentVariable Lib "kernel32" Alias _
"GetEnvironmentVariableA" (ByVal lpName As String, _
ByVal lpBuffer As String, ByVal nSize As Long) As Long


'*************************************************************
Sub AutoOpen()
Dim EnvVarName As String
Dim ValVar As String

Dim x
Dim lpbuf As String
Dim lsize As Long



'le nom de variable utilise est le Hwnd de l'application Excel (quand excel sera fermé, cette variable sera automatiquement détruite)
EnvVarName = CStr(Application.Hwnd)

lpbuf = Space$(256)
lsize = 256

x = GetEnvironmentVariable(EnvVarName, lpbuf, lsize)
ValVar = Left$(lpbuf, x)

If ValVar = "1" Then
    'si la variable d'environnement est renseignée à "1" c'est qu'un fichier est déjà ouvert.
    'on peut alors décider de fermer le fichier en cours d'ouverture
    MsgBox "Un fichier est déjà ouvert"
    ActiveWorkbook.Close False
    End
Else
    'la variable d'environnement étant vide on lui affecte sa valeur "1"
    x = SetEnvironmentVariable(EnvVarName, "1") 
End If

End Sub


'***************************************************
Sub AutoClose()
Dim EnvVarName As String
Dim x

'le nom de variable utilise est le Hwnd de l'application Excel (quand excel sera fermé, cette variable sera automatiquement détruite)
EnvVarName = CStr(Application.Hwnd)

'on vide la variable d'environnement à la fermeture du fichier
x = SetEnvironmentVariable(EnvVarName, "")

End Sub

(Merci Zeb)
Cordialement.

Dominique


 
Vous devez vous inscrire ou vous connecter pour répondre ici.
Derniers messages publiés
Statistiques globales
Discussions
730 098
Messages
6 717 073
Membres
1 586 286
Dernier membre
petitangebleu1977
Partager cette page
Haut