VBA, Variables publiques

rocklive.didi -  
 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

7 réponses

  1. Polux31 Messages postés 7219 Statut Membre 1 204
     
    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
  2. Polux31 Messages postés 7219 Statut Membre 1 204
     
    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
  3. Sylvain_F
     
    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
  4. Sylvain_F
     
    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
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. Sylvain_F
     
    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
  7. Sylvain_F
     
    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
  8. Sylvain_F
     
    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