Excel VBA でグローバル変数を宣言してワークブック全体で表示する方法 質問する

Excel VBA でグローバル変数を宣言してワークブック全体で表示する方法 質問する

グローバル スコープについて質問があり、問題を簡単な例に抽象化しました。

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、、、 ... はSheet2ThisWorkbookグローバル スコープで変数を宣言できるモジュールではないのでしょうか?

または、グローバルを宣言できる唯一の場所は、別のモジュールのタイプモジュール

ベストアンサー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 コードをモジュールまたはシートに配置しますか?

Sheet1PS5: たとえば、 でグローバル変数を宣言して、他のワークブックのコードで使用することはできない場合があります(読み取りhttp://msdn.microsoft.com/en-us/library/office/gg264241%28v=office.15%29.aspx#sectionSection0;私はこの点をテストしていないので、この問題はまだ確認されていません。しかし、いずれにせよ、あなたの例ではそうするつもりはありません。

PS6: グローバル変数を完全に修飾しないと、あいまいさが生じるケースがいくつかあります。それらを見つけるには少しいじってみる必要があるかもしれません。それらはコンパイル エラーです。

おすすめ記事