グローバル スコープについて質問があり、問題を簡単な例に抽象化しました。
Excelブックの場合:シート1ボタンは2つあります。
最初のボタンはセットミーそして、サブルーチンにリンクされていますSheet1のモジュール:
シート1コード:
Option Explicit
Sub setMe()
Global1 = "Hello"
End Sub
2番目はラベルが貼られています見せてそして、サブルーチンにリンクされていますThisWorkbookのモジュール:
このワークブックのコード:
Option Explicit
Public Global1 As String
Debug.Print("Hello")
Sub showMe()
Debug.Print (Global1)
End Sub
クリックするとセットミーコンパイラを生成しますerror: variable not defined
。
別のモジュールを作成し、宣言を移動するとグローバル1すべてが機能します。
私の質問は次のとおりです。私が読んだものはすべて、モジュールの先頭で宣言されたグローバル変数は、どのコードからもプロジェクト内のすべてのモジュールから見えるはずだと言っています。明らかにそうではありません。モジュールは正しくありません。ワークブックに付属する
オブジェクトSheet1
、、、 ... はSheet2
、ThisWorkbook
グローバル スコープで変数を宣言できるモジュールではないのでしょうか?
または、グローバルを宣言できる唯一の場所は、別のモジュールのタイプモジュール。
ベストアンサー1
あなたの質問は次のとおりです:これらはグローバルスコープで変数を宣言できるモジュールではないのでしょうか?
答え: はい、彼らは「有能」です
唯一のポイントは、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: この回答は、基本的に以下の情報に基づいています。ここ読む価値は大いにあります(偉大なチップ・ピアソン著)。
PS2: この行でDebug.Print ("Hello")
はコンパイル エラーが発生しますInvalid outside procedure
。
PS3: コードを(部分的に)チェックするにはデバッグ -> VBAProject のコンパイルVB エディターで、すべてのコンパイル エラーが表示されます。
PS4: こちらもチェックExcel-VBA コードをモジュールまたはシートに配置しますか?。
Sheet1
PS5: たとえば、 でグローバル変数を宣言して、他のワークブックのコードで使用することはできない場合があります(読み取りhttp://msdn.microsoft.com/en-us/library/office/gg264241%28v=office.15%29.aspx#sectionSection0;私はこの点をテストしていないので、この問題はまだ確認されていません。しかし、いずれにせよ、あなたの例ではそうするつもりはありません。
PS6: グローバル変数を完全に修飾しないと、あいまいさが生じるケースがいくつかあります。それらを見つけるには少しいじってみる必要があるかもしれません。それらはコンパイル エラーです。