web-dev-qa-db-fra.com

Comment déclarer des variables globales dans Excel VBA pour qu'elles soient visibles dans le classeur

J'ai une question sur la portée mondiale et j'ai résumé le problème dans un exemple simple:

Dans un classeur Excel: Dans Sheet1 J'ai deux (2) boutons.
Le premier est étiqueté SetMe et est lié à un sous-programme dans module Sheet1:
Code Sheet1:

Option Explicit
Sub setMe()
    Global1 = "Hello"
End Sub

Le second est étiqueté ShowMe et est lié à un sous-programme dans module de ThisWorkbook:
Code ThisWorkbook:

Option Explicit
Public Global1 As String
Debug.Print("Hello")
Sub showMe()
    Debug.Print (Global1)
End Sub

Cliquer sur SetMe produit un compilateur error: variable not defined.
Quand je crée un module séparé et que je déplace la déclaration de Global1 dedans, tout fonctionne.

Donc ma question est: Tout ce que j'ai lu dit que les variables globales, déclarées en haut d'un module, en dehors de tout code devraient être visibles par tous les modules du projet. Ce n'est clairement pas le cas. À moins que ma compréhension de Module ne soit pas correcte.
Les objets Sheet1, Sheet2, ThisWorkbook, ... qui viennent avec un classeur: ces modules ne sont-ils pas capables de déclarer des variables à portée globale?

Ou est le seul endroit où l'on peut déclarer un global, dans un module séparé de type Modules.

14
user2978241

Votre question est: ces modules ne sont-ils pas capables de déclarer des variables à portée globale?

Réponse: OUI, ils sont "capables"

Le seul point est que les références aux variables globales dans ThisWorkbook ou un module Sheet doivent être entièrement qualifiées (c.-à-d., Dénommées ThisWorkbook.Global1, Par exemple) Les références aux variables globales dans un module standard doivent être pleinement qualifiées uniquement dans cas d'ambiguïté (par exemple, s'il y a plus d'un module standard définissant une variable avec le nom Global1, et que vous voulez l'utiliser dans un troisième module).

Par exemple, placez dans le code Sheet1

Public glob_sh1 As String

Sub test_sh1()
    Debug.Print (glob_mod)
    Debug.Print (ThisWorkbook.glob_this)
    Debug.Print (Sheet1.glob_sh1)
End Sub

placer dans le code ThisWorkbook

Public glob_this As String

Sub test_this()
    Debug.Print (glob_mod)
    Debug.Print (ThisWorkbook.glob_this)
    Debug.Print (Sheet1.glob_sh1)
End Sub

et dans un code de module standard

Public glob_mod As String

Sub test_mod()
    glob_mod = "glob_mod"
    ThisWorkbook.glob_this = "glob_this"
    Sheet1.glob_sh1 = "glob_sh1"
    Debug.Print (glob_mod)
    Debug.Print (ThisWorkbook.glob_this)
    Debug.Print (Sheet1.glob_sh1)
End Sub

Les trois sous-marins fonctionnent bien.

PS1: Cette réponse est basée essentiellement sur les informations de ici . Cela vaut la peine d'être lu (du grand Chip Pearson).

PS2: Votre ligne Debug.Print ("Hello") vous donnera l'erreur de compilation Invalid outside procedure.

PS3: Vous pouvez (partiellement) vérifier votre code avec Debug -> Compile VBAProject dans l'éditeur VB. Toutes les erreurs de compilation apparaîtront.

PS4: Vérifiez également Mettre le code Excel-VBA dans le module ou la feuille? .

PS5: Vous ne pourrez peut-être pas déclarer une variable globale dans, disons, Sheet1, et l'utiliser dans le code d'un autre classeur (lecture http://msdn.Microsoft.com/en-us/library/office/ gg264241% 28v = office.15% 29.aspx # sectionSection ; Je n'ai pas testé ce point, donc ce problème doit encore être confirmé comme tel). Mais vous n'avez pas l'intention de le faire dans votre exemple, de toute façon.

PS6: Plusieurs cas conduisent à une ambiguïté en cas de variables globales non pleinement qualifiées. Vous pouvez bricoler un peu pour les trouver. Ce sont des erreurs de compilation.

18
sancho.s

Vous pouvez faire ce qui suit pour apprendre/tester le concept:

  1. Ouvrez un nouveau classeur Excel et dans l'éditeur Excel VBA, cliquez avec le bouton droit sur Modules-> Insérer-> Module

  2. Dans Module1 nouvellement ajouté, ajoutez la déclaration; Public Global1 As String

  3. dans la feuille de calcul VBA Module Sheet1 (Sheet1), mettez l'extrait de code:

Sub setMe()
      Global1 = "Hello"
End Sub
  1. dans la feuille de calcul VBA Module Sheet2 (Sheet2), mettez l'extrait de code:
Sub showMe()
    Debug.Print (Global1)
End Sub
  1. Exécutez en séquence Sub setMe() puis Sub showMe() pour tester la visibilité/l'accessibilité globale de la var Global1

J'espère que cela vous aidera.

3
Alexander Bell