グローバルスコープについて質問があり、簡単な例に問題を抽象化しました。
Excelワークブックの場合:Sheet1には2つのボタンがあります。
最初のラベルはSetMeで、Sheet1のモジュールのサブルーチンにリンクされています。
Sheet1コード:
Option Explicit
Sub setMe()
Global1 = "Hello"
End Sub
2番目のラベルはShowMeで、ThisWorkbookのモジュールのサブルーチンにリンクされています。
ThisWorkbookコード:
Option Explicit
Public Global1 As String
Debug.Print("Hello")
Sub showMe()
Debug.Print (Global1)
End Sub
SetMeをクリックすると、コンパイラerror: variable not defined
。
別のモジュールを作成し、Global1の宣言をそこに移動すると、すべてが機能します。
だから私の質問は:私が読んだことはすべて、モジュールの先頭で宣言されたコードの外側のグローバル変数は、プロジェクト内のすべてのモジュールに表示されるべきだということです。明らかにそうではありません。 Moduleの私の理解が正しくない限り。
オブジェクトSheet1
、Sheet2
、ThisWorkbook
、...ブックに付属しています。これらはグローバルスコープで変数を宣言できるモジュールではありませんか?
または、タイプModulesの別のモジュールで、グローバルを宣言できる唯一の場所です。
あなたの質問は:これらはグローバルスコープで変数を宣言できるモジュールではありませんか?
回答:はい、それらは「可能」です
唯一のポイントは、ThisWorkbookまたはSheetモジュールのグローバル変数への参照は完全修飾(つまり、_ThisWorkbook.Global1
_などと呼ばれる)する必要があるということです。標準モジュールのグローバル変数への参照は、あいまいさ(たとえば、Global1という名前の変数を定義する複数の標準モジュールがあり、3番目のモジュールで使用することを意味する場合)。
たとえば、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
_
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
_
および標準モジュールコード
_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
_
3つの潜水艦はすべて正常に動作します。
PS1:この回答は、本質的に here からの情報に基づいています。 (偉大なチップピアソンから)読む価値があります。
PS2:行Debug.Print ("Hello")
はコンパイルエラー_Invalid outside procedure
_を提供します。
PS3:(一部)VBエディターでデバッグ-> VBAProjectのコンパイルを使用してコードをチェックできます。すべてのコンパイルエラーが表示されます。
PS4:チェックも Excel-VBAコードをモジュールまたはシートに入れますか? 。
PS5:たとえば、Sheet1でグローバル変数を宣言して、他のブックのコードで使用できない場合があります( http://msdn.Microsoft.com/en-us/library/office/ gg264241%28v = office.15%29.aspx#sectionSection ;この点はテストしなかったため、この問題はまだ確認されていません)。とにかく、あなたの例ではそうするつもりはありません。
PS6:グローバル変数を完全に修飾しない場合にあいまいさを引き起こすいくつかのケースがあります。それらを見つけるために少し手を加えることができます。それらはコンパイルエラーです。
以下を実行して、コンセプトを学習/テストできます。
新しいExcelワークブックを開き、Excel VBAエディターで「モジュール」->「挿入」->「モジュール」を右クリックします。
新しく追加されたModule1で宣言を追加します。 _Public Global1 As String
_
ワークシートVBAモジュールSheet1(Sheet1)にコードスニペットを追加します。
_Sub setMe() Global1 = "Hello" End Sub
_
_Sub showMe() Debug.Print (Global1) End Sub
_
setMe()
を順番に実行し、次にSub showMe()
を実行して、var _Global1
_のグローバルな可視性/アクセシビリティをテストしますこれが役立つことを願っています。