VBA, Variables publiques

Fermé
Signaler
-
 Sylvain_F -
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
A voir également:

7 réponses

Messages postés
6917
Date d'inscription
mardi 25 septembre 2007
Statut
Membre
Dernière intervention
1 novembre 2016
1 190
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.
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)
3
Messages postés
6917
Date d'inscription
mardi 25 septembre 2007
Statut
Membre
Dernière intervention
1 novembre 2016
1 190
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 :

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)
1
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.
0
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
0
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.
0
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.
0
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.
0