VBA, Variables publiques

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