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