webentwicklung-frage-antwort-db.com.de

So deklarieren Sie globale Variablen in Excel VBA für die Sichtbarkeit in der Arbeitsmappe

Ich habe eine Frage zum globalen Geltungsbereich und habe das Problem in einem einfachen Beispiel zusammengefasst:

In einer Excel-Arbeitsmappe: In Sheet1 Ich habe zwei (2) Schaltflächen.
Das erste ist mit SetMe bezeichnet und mit einem Unterprogramm in Sheet1s Modul verknüpft:
Sheet1 code:

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

Die zweite hat die Bezeichnung ShowMe und ist mit einer Unterroutine in Modul von ThisWorkbook verknüpft:
ThisWorkbook code:

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

Ein Klick auf SetMe erzeugt einen Compiler error: variable not defined.
Wenn ich ein separates Modul erstelle und die Deklaration von Global1 hineinschiebe, funktioniert alles.

Meine Frage lautet also: Alles, was ich gelesen habe, besagt, dass globale Variablen, die am Anfang eines Moduls außerhalb von Code deklariert sind, für alle Module im Projekt sichtbar sein sollten. Offensichtlich ist dies nicht der Fall. Es sei denn, mein Verständnis von Modul ist nicht korrekt.
Die Objekte Sheet1, Sheet2, ThisWorkbook, ... die mit einer Arbeitsmappe geliefert werden: Sind diese Module nicht in der Lage, Variablen im globalen Bereich zu deklarieren?

Oder ist der einzige Ort, an dem man ein globales deklarieren kann, in einem separaten Modul vom Typ Module.

14
user2978241

Ihre Frage lautet: Sind diese Module nicht in der Lage, Variablen im globalen Bereich zu deklarieren?

Antwort: JA, sie sind "fähig"

Der einzige Punkt ist, dass Referenzen auf globale Variablen in ThisWorkbook oder einem Sheet-Modul vollständig qualifiziert sein müssen (dh als ThisWorkbook.Global1 Bezeichnet). Referenzen auf globale Variablen in einem Standardmodul müssen nur in vollständig qualifiziert sein Mehrdeutigkeit (z. B. wenn mehrere Standardmodule eine Variable mit dem Namen Global1 definieren und Sie diese in einem dritten Modul verwenden möchten).

Platzieren Sie beispielsweise in dem 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

in ThisWorkbook Code einfügen

Public glob_this As String

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

und in einem Standardmodulcode

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

Alle drei Subs funktionieren einwandfrei.

PS1: Diese Antwort basiert im Wesentlichen auf Informationen von hier . Es ist sehr lesenswert (vom großen Chip Pearson).

PS2: Ihre Zeile Debug.Print ("Hello") gibt Ihnen den Kompilierungsfehler Invalid outside procedure.

PS3: Sie können Ihren Code (teilweise) mit Debug -> VBAProject kompilieren im VB Editor überprüfen. Alle Kompilierungsfehler werden angezeigt.

PS4: Überprüfen Sie auch Excel-VBA-Code in Modul oder Blatt einfügen? .

PS5: Möglicherweise können Sie eine globale Variable in beispielsweise Sheet1 nicht deklarieren und in Code aus einer anderen Arbeitsmappe verwenden (Lesen von http://msdn.Microsoft.com/en-us/library/office/). gg264241% 28v = office.15% 29.aspx # sectionSection ; Ich habe diesen Punkt nicht getestet, daher muss dieses Problem noch als solches bestätigt werden.) Aber das wollen Sie in Ihrem Beispiel sowieso nicht.

PS6: Es gibt mehrere Fälle, die zu Mehrdeutigkeiten führen, wenn globale Variablen nicht vollständig qualifiziert werden. Sie können ein wenig basteln, um sie zu finden. Sie sind Kompilierungsfehler.

18
sancho.s

Sie können Folgendes tun, um das Konzept zu lernen/zu testen:

  1. Öffnen Sie eine neue Excel-Arbeitsmappe und klicken Sie im Excel VBA-Editor mit der rechten Maustaste auf Module-> Einfügen-> Modul

  2. Fügen Sie in neu hinzugefügtem Modul1 die Deklaration hinzu; Public Global1 As String

  3. fügen Sie in Arbeitsblatt VBA-Modul Sheet1 (Sheet1) das Code-Snippet ein:

Sub setMe()
      Global1 = "Hello"
End Sub
  1. fügen Sie in das Arbeitsblatt VBA-Modul Sheet2 (Sheet2) das Code-Snippet ein:
Sub showMe()
    Debug.Print (Global1)
End Sub
  1. Führen Sie nacheinander Sub setMe() und dann Sub showMe() aus, um die globale Sichtbarkeit/Zugänglichkeit der Variable Global1 Zu testen.

Hoffe das wird helfen.

3
Alexander Bell