2014-12-20 4 views
10

Ich habe eine Frage über die globale Reichweite und haben das Problem in einem einfachen Beispiel abstrahiert:Wie Globale Variablen in Excel VBA erklären, über die Arbeitsmappe sichtbar sein

In einer Excel-Arbeitsmappe: In Sheet1 Ich habe zwei (2) Tasten.
Die erste ist SetMe markiert und wird in Tabelle1 des Moduls zu einem Unterprogramm verknüpft:
Tabelle1 Code:

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

Der zweite markiert ist ShowMe und wird in zu einem Unterprogramm verknüpft DiesesWorkbook-Modul:
DieserWorkbook-Code:

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

Klick auf SetMe erzeugt einen Compiler error: variable not defined.
Wenn ich ein separates Modul erstellen und die Deklaration von Global1 in es verschieben, funktioniert alles.

Also meine Frage ist: Alles, was ich gelesen habe, sagt, dass globale Variablen, an der Spitze eines Moduls erklärt, außerhalb jeden Code sollten in dem Projekt für alle Module sichtbar. Dies ist eindeutig 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 global zu deklarieren?

Oder ist die einzige Stelle, die man eine globale, in einem separaten Modul des Typs Module deklarieren kann.

+0

Ich glaube, UserForms Code fällt in den Kategorie-Typ-Modul, obwohl es nicht wirklich als solches aufgeführt ist. Ist das korrekt? – peege

+0

@ sancho.s Ich löschte es, um Verwirrung zu vermeiden :) Ich vermisste diesen Link von Pearson und fehlinterpretierte eine Zeile in der MSDN-Verbindung, die ich postete. Habe heute etwas Neues gelernt :) – L42

+0

@ user2978241 - Haben Sie hier nützliche Antworten gefunden? Es ist immer gut, Feedback zu geben, damit andere SO-Benutzer sehen können. –

Antwort

3

können Sie die folgenden Aktionen zu lernen/testen das Konzept:

  1. öffnen neue Excel-Arbeitsmappe und in Excel-VBA-Editor einen Rechtsklick auf Module-> Einfügen-> Modul

  2. In neu hinzugefügt Modul1 fügen Sie die Deklaration hinzu; Public Global1 As String

  3. in Arbeitsblatt VBA-Modul Sheet1 (Sheet1) setzen den Code-Schnipsel:

Sub setMe() 
     Global1 = "Hello" 
End Sub 
  1. in Arbeitsblatt VBA-Modul Sheet2 (Tabelle2) setzen Sie den Code-Schnipsel:
Sub showMe() 
    Debug.Print (Global1) 
End Sub 
  1. Run in Folge Sub setMe() und dann Sub showMe() die globale Sichtbarkeit/Zugänglichkeit der var Global1

Hoffnung zu testen, dies wird dazu beitragen.

+1

Einfach, thx, funktioniert für mich. Ich habe ein Modul "Globals" genannt und benutze es für nichts anderes, als globale Variablen zu definieren - keine Subs oder Funktionen oder irgendeinen Code da drin, nur Globals definiert – user1302114

+0

Gern geschehen! Froh, dass es für dich funktioniert. Bitte markieren Sie die angenommene Antwort, wenn Sie mit der Lösung zufrieden sind. Mit freundlichen Grüßen, –

14

Ihre Frage ist: sind diese Module nicht in der Lage, Variablen auf globaler Ebene zu deklarieren?

Antwort: Ja, sie sind „in der Lage“

Der einzige Punkt ist, dass Verweise auf globale Variablen in Diesearbeitsmappe oder ein Blatt Modul vollständig qualifiziert sein (dh, bezeichnet als ThisWorkbook.Global1, eg) Verweise auf globale Variablen in einem Standardmodul müssen nur im Fall von Mehrdeutigkeiten vollständig qualifiziert sein (z. B. wenn mehr als ein Standardmodul eine Variable mit dem Namen Global1 definiert und Sie sie in einem dritten Modul verwenden möchten).

Zum Beispiel in Sheet1 Code

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

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 Code-Standardmodul

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 U-Boote funktionieren.

PS1: Diese Antwort basiert im Wesentlichen auf Informationen von here. Es ist sehr lesenswert (von dem großartigen Chip Pearson).

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

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

PS4: Überprüfen Sie auch Put Excel-VBA code in module or sheet?.

PS5: Sie können möglicherweise keine globale Variable in sagen, Sheet1, und verwenden Sie es in Code aus anderen Arbeitsmappe (Lesen http://msdn.microsoft.com/en-us/library/office/gg264241%28v=office.15%29.aspx#sectionSection0; ich habe diesen Punkt nicht getestet, so dass dieses Problem noch als bestätigt werden soll eine solche). Aber das ist in deinem Beispiel sowieso nicht so.

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

+0

Ich habe eine Zeile in der von mir geposteten Verbindung falsch interpretiert. Habe heute etwas neues gelernt :). Definitiv +1. Wenn ich mehr als einmal abstimmen könnte, hätte ich das getan. – L42

+0

Das hat mich in den Wahnsinn getrieben - das Hinzufügen von 'Public thing as New Thing' zu einem Modul anstelle von ThisWorkbook löste alle" 424 "-Fehlerprobleme beim Versuch, auf' thing.something() 'zuzugreifen – oooyaya