VBA, Variables publiques
Fermé
Bonjour,
Voilà mon problème. Je travaille en ce moment sur VBA (VB associé à Excel) et j'ai crée plusieurs userforms.
J'ai crée une variable sur l'une de ces userforms dans laquelle elle prend une valeur particulière que j'aimerais retrouver/pouvoir utiliser dans d'autres userforms.
Je vous remercie,
Adrienne
Voilà mon problème. Je travaille en ce moment sur VBA (VB associé à Excel) et j'ai crée plusieurs userforms.
J'ai crée une variable sur l'une de ces userforms dans laquelle elle prend une valeur particulière que j'aimerais retrouver/pouvoir utiliser dans d'autres userforms.
Je vous remercie,
Adrienne
A voir également:
- Vba déclaration variable globale
- Déclaration de revenus - Guide
- Vba ouvrir un fichier excel avec chemin ✓ - Forum VB / VBA
- Vba range avec variable ✓ - Forum VB / VBA
- Find vba - Astuces et Solutions
7 réponses
Polux31
Messages postés
6917
Date d'inscription
mardi 25 septembre 2007
Statut
Membre
Dernière intervention
1 novembre 2016
1 204
15 nov. 2010 à 02:12
15 nov. 2010 à 02:12
Bonjour,
Pour qu'une variable puisse être utilisée dans tout le code, il faut la déclarée en variable globale publique.
Elle doit toujours être déclarée en en-tête d'un module.
On peut également déclarée une variable globale privée et utiliser un "getter" pour récupérer sa valeur en écrivant la fonction adéquat.
La fonction getMavariable() étant public, elle peut être appelée dans les module du code.
De même, on peut affecter une valeur à une variable privée en utilisant "un setter"
Si on doit utiliser plusieurs variables globales, il est conseillé de les regrouper dans un module.
;o)
Pour qu'une variable puisse être utilisée dans tout le code, il faut la déclarée en variable globale publique.
Elle doit toujours être déclarée en en-tête d'un module.
On peut également déclarée une variable globale privée et utiliser un "getter" pour récupérer sa valeur en écrivant la fonction adéquat.
Option Explicit Private MaVariable As String Public Function getMaVariable() As String getMaVariable = MaVariable End Function
La fonction getMavariable() étant public, elle peut être appelée dans les module du code.
De même, on peut affecter une valeur à une variable privée en utilisant "un setter"
Public sub setMavariable(ByVal chaine As String) MaVariable = chaine End Sub
Si on doit utiliser plusieurs variables globales, il est conseillé de les regrouper dans un module.
;o)
Polux31
Messages postés
6917
Date d'inscription
mardi 25 septembre 2007
Statut
Membre
Dernière intervention
1 novembre 2016
1 204
16 nov. 2010 à 11:00
16 nov. 2010 à 11:00
Salut,
Si je comprends bien ton exemple. Tu as 3 variables a, b et c qui ont comme valeur le contenue de cellules. Ce que tu oublies de dire, c'est quand veux tu qu'elles soient initialisées. Ce qui est étrange, c'est que 2 variables reçoivent la même valeur (Cells(1,1) pour a et b.
Est-ce à l'ouverture du fichier Excel ou au lancement d'un UserForm précis ou quelconque ?
Je vais imaginer qu'avant de lancer un UF quelconque, l'utilisateur remplit les cellules A1, A2 de la feuille 1 et A2 de la feuille 2. Il est déconseillé de nommer une variable avec une seule lettre, je vais donc modifier leur appellation. De même, tu n'indiques pas le type de données que doivent recevoir ces variables.
Dans l'éditeur VB, je créé un module que je nomme : ModVarGob et j'y mets le code suivant :
Ensuite dans l'évènement Iniatialize() de chaque UF:
Maintenant, partout dans le code, si j'ai besoin d'utiliser l'une des 3 variables, j'appelle le getter correspondant:
Voilà.
;o)
Si je comprends bien ton exemple. Tu as 3 variables a, b et c qui ont comme valeur le contenue de cellules. Ce que tu oublies de dire, c'est quand veux tu qu'elles soient initialisées. Ce qui est étrange, c'est que 2 variables reçoivent la même valeur (Cells(1,1) pour a et b.
Est-ce à l'ouverture du fichier Excel ou au lancement d'un UserForm précis ou quelconque ?
Je vais imaginer qu'avant de lancer un UF quelconque, l'utilisateur remplit les cellules A1, A2 de la feuille 1 et A2 de la feuille 2. Il est déconseillé de nommer une variable avec une seule lettre, je vais donc modifier leur appellation. De même, tu n'indiques pas le type de données que doivent recevoir ces variables.
Dans l'éditeur VB, je créé un module que je nomme : ModVarGob et j'y mets le code suivant :
Option Explicit Private Var1 As Long Private Var2 As String Private Var3 As Long 'Accesseurs en écriture Public Sub setVar1(ByVal str As Long) Var1 = str End Sub Public Sub setVar2(ByVal str As String) Var2 = str End Sub Public Sub setVar3(ByVal str As Long) Var3 = str End Sub 'Accesseurs en lecture Public Function getVar1() As Long getVar1 = Var1 End Function Public Function getVar2() As String getVar2 = Var2 End Function Public Function getVar3() As Long getVar3 = Var3 End Function
Ensuite dans l'évènement Iniatialize() de chaque UF:
Private Sub UserForm_Initialize() Call ModVarGob.setVar1(Worksheets("x").Cells(1, 1).Value ) Call ModVarGob.setVar2(Worksheets("x").Cells(2, 1).Value ) Call ModVarGob.setVar3(Worksheets("y").Cells(2, 1).Value ) End Sub
Maintenant, partout dans le code, si j'ai besoin d'utiliser l'une des 3 variables, j'appelle le getter correspondant:
'... Label1.Caption = ModVarGob.GetVar2 '...
Voilà.
;o)
Peux tu préciser comment faire pour déclarer plusieurs variables (et aussi leur affecter des valeurs) de facon à ce que toutes ces variables soient lisibles depuis toutes les sub du module.
Le but étant d'alléger un code de ce type :
Sub un()
a = Worksheets("x").Cells(1, 1).Value
b = Worksheets("x").Cells(1, 1).Value
c = Worksheets("y").Cells(1, 2).Value
.
.
.
End Sub
Sub deux()
a = Worksheets("x").Cells(1, 1).Value
b = Worksheets("x").Cells(1, 1).Value
c = Worksheets("y").Cells(1, 2).Value
.
.
.
End Sub
Sub trois()
a = Worksheets("x").Cells(1, 1).Value
b = Worksheets("x").Cells(1, 1).Value
c = Worksheets("y").Cells(1, 2).Value
.
.
.
End Sub
...etc
Sub un()
a = Worksheets("x").Cells(1, 1).Value
b = Worksheets("x").Cells(1, 1).Value
c = Worksheets("y").Cells(1, 2).Value
.
.
.
End Sub
Sub deux()
a = Worksheets("x").Cells(1, 1).Value
b = Worksheets("x").Cells(1, 1).Value
c = Worksheets("y").Cells(1, 2).Value
.
.
.
End Sub
Sub trois()
a = Worksheets("x").Cells(1, 1).Value
b = Worksheets("x").Cells(1, 1).Value
c = Worksheets("y").Cells(1, 2).Value
.
.
.
End Sub
...etc
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
Ok je ne pensais pas que c'était aussi compliqué.
En fait c'est juste un exemple dans lequel j'ai tout simplifié, pour a et b je me suis trompé c'est bien deux variables différentes. a b et c sont simplement des valeurs, je n'ai même pas besoin de les déclarer, mon code fonctionne bien comme ça. C'est juste que c'est un peu bête de devoir réaffecter les valeur dans chaque sub.
Je pensais qu'on pouvait simplement affecter les valeur au début du module comme ceci :
a = Worksheets("x").Cells(1, 1).Value
b = Worksheets("x").Cells(1, 2).Value
c = Worksheets("y").Cells(1, 3).Value
Sub un()
.
.
.
End Sub
Sub deux()
.
.
.
End Sub
Sub trois()
.
.
.
End Sub
Je vais essayer de faire ce que tu as expliqué.
Merci beaucoup.
En fait c'est juste un exemple dans lequel j'ai tout simplifié, pour a et b je me suis trompé c'est bien deux variables différentes. a b et c sont simplement des valeurs, je n'ai même pas besoin de les déclarer, mon code fonctionne bien comme ça. C'est juste que c'est un peu bête de devoir réaffecter les valeur dans chaque sub.
Je pensais qu'on pouvait simplement affecter les valeur au début du module comme ceci :
a = Worksheets("x").Cells(1, 1).Value
b = Worksheets("x").Cells(1, 2).Value
c = Worksheets("y").Cells(1, 3).Value
Sub un()
.
.
.
End Sub
Sub deux()
.
.
.
End Sub
Sub trois()
.
.
.
End Sub
Je vais essayer de faire ce que tu as expliqué.
Merci beaucoup.
Pour ce qui est de l'initialisation, je ne comprends pas vraiment.
En fait je n'initialise rien, les sub "un", "deux" et "trois" ne font que des calculs avec les valeurs a, b et c qui sont lues dans le tableur. Je suppose que l'accesseur en lecture suffit.
En fait je n'initialise rien, les sub "un", "deux" et "trois" ne font que des calculs avec les valeurs a, b et c qui sont lues dans le tableur. Je suppose que l'accesseur en lecture suffit.
J'ai réussi à déclarer une bonne partie de mes variables en écrivant ceci au début du module.
Public Const l = 10
Public Const c = 5
Mais pour les variables qui sont lues dans le tableau ça ne fonctionne pas, y a t'il une façon simple et qui fonctionne d'écrire cette ligne ?
Public Const a = Worksheets("x").Cells(1, 1).Value
Merci d'avance.
Public Const l = 10
Public Const c = 5
Mais pour les variables qui sont lues dans le tableau ça ne fonctionne pas, y a t'il une façon simple et qui fonctionne d'écrire cette ligne ?
Public Const a = Worksheets("x").Cells(1, 1).Value
Merci d'avance.