web-dev-qa-db-ja.com

ワークブック全体で表示されるようにExcel VBAでグローバル変数を宣言する方法

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

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の私の理解が正しくない限り。
オブジェクトSheet1Sheet2ThisWorkbook、...ブックに付属しています。これらはグローバルスコープで変数を宣言できるモジュールではありませんか?

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

14
user2978241

あなたの質問は:これらはグローバルスコープで変数を宣言できるモジュールではありませんか?

回答:はい、それらは「可能」です

唯一のポイントは、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:グローバル変数を完全に修飾しない場合にあいまいさを引き起こすいくつかのケースがあります。それらを見つけるために少し手を加えることができます。それらはコンパイルエラーです。

18
sancho.s

以下を実行して、コンセプトを学習/テストできます。

  1. 新しいExcelワークブックを開き、Excel VBAエディターで「モジュール」->「挿入」->「モジュール」を右クリックします。

  2. 新しく追加されたModule1で宣言を追加します。 _Public Global1 As String_

  3. ワークシートVBAモジュールSheet1(Sheet1)にコードスニペットを追加します。

_Sub setMe()
      Global1 = "Hello"
End Sub
_
  1. worksheet VBA Module Sheet2(Sheet2)にコードスニペットを追加します。
_Sub showMe()
    Debug.Print (Global1)
End Sub
_
  1. Sub setMe()を順番に実行し、次にSub showMe()を実行して、var _Global1_のグローバルな可視性/アクセシビリティをテストします

これが役立つことを願っています。

3
Alexander Bell