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.
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.
Sie können Folgendes tun, um das Konzept zu lernen/zu testen:
Öffnen Sie eine neue Excel-Arbeitsmappe und klicken Sie im Excel VBA-Editor mit der rechten Maustaste auf Module-> Einfügen-> Modul
Fügen Sie in neu hinzugefügtem Modul1 die Deklaration hinzu; Public Global1 As String
fügen Sie in Arbeitsblatt VBA-Modul Sheet1 (Sheet1) das Code-Snippet ein:
Sub setMe() Global1 = "Hello" End Sub
Sub showMe() Debug.Print (Global1) End Sub
setMe()
und dann Sub showMe()
aus, um die globale Sichtbarkeit/Zugänglichkeit der Variable Global1
Zu testen.Hoffe das wird helfen.