変数やプロシージャのスコープ(適用範囲)
【構文:変数の宣言】
{ Dim | Private | Public | Static } varname [ As type , … ]
【項目の説明】
- varname ・・・ 定義する変数名
- type ・・・ 変数 varname のデータ型(省略するとバリアント型になります)。
Dim ステートメントは、変数を宣言し、メモリ領域を割り当てます。
Private ステートメントで宣言された変数は、宣言されたモジュール内でのみ参照できます。
Public ステートメントで宣言された変数は、Option Private Module が有効でない限り、すべてのアプリケーションのすべてのモジュールのすべてのプロシージャから参照できます。
Static ステートメントで宣言した変数 (静的変数) の値は、プログラムが実行されている間をとおして保持されます。
変数・定数の宣言の位置とその適用範囲
場所 | キーワード | 適用範囲 |
プロシージャ内 | Dim | 同一プロシージャ内 実行後、値は破棄される |
Static | 同一プロシージャ内 実行後も値は保持される |
|
標準モジュール宣言部 | Dim | 同一モジュール内のみ 実行後も値は保持される |
Private | 同一モジュール内のみ 実行後も値は保持される |
|
Public | ブック全体 実行後も値は保持される |
|
シート/ブックモジュール宣言部 | Dim | 同一モジュール内のみ 実行後も値は保持される |
Private | 同一モジュール内のみ 実行後も値は保持される |
|
Public | 同一モジュール内のみ ただし「親オブジェクト」を装飾すれば使用可 (例) ThisWorkbook.aaa 実行後も値は保持される |
|
フォームモジュール宣言部 | Dim | 同一モジュール内のみ フォーム終了時に値は破棄される |
Private | 同一モジュール内のみ フォーム終了時に値は破棄される |
|
Public | 同一モジュール内のみ ただし「親オブジェクト」を装飾すれば使用可 (例) Form1.aaa フォーム終了時に値は破棄される |
|
クラスモジュール宣言部 | Dim | 同一モジュール内のみ インスタンス終了時に値は破棄される |
Private | 同一モジュール内のみ インスタンス終了時に値は破棄される |
|
Public | 同一モジュール内のみ ただしインスタンスからは使用可 (例) cc.aaa インスタンス終了時に値は破棄される |
プロシージャの適用範囲
場所 | キーワード | 適用範囲 |
標準モジュール | Public(省略可) | ブック全体 |
Private | 同一モジュール内のみ | |
シートモジュール・ブックモジュール | Public(省略可) | 同一モジュール内のみ ただし「マクロ」ボタン(開発タブ)からは実行可 |
Private | 同一モジュール内のみ | |
フォームモジュール | Public(省略可) | 同一モジュール内のみ ただし「親オブジェクト」を装飾すれば実行可 (例) ThisWorkbook.myfunc() |
Private | 同一モジュール内のみ | |
クラスモジュール | Public(省略可) | 同一モジュール内のみ ただしインスタンスからは実行可 (例) cc.clsfunc |
Private | 同一モジュール内のみ |
プロシージャ の構文については、プロシージャを作成する( Sub, Function ) を参照してください。
モジュール宣言部に、Option Private Module が記述されている場合は、モジュール自体がプライベートとして宣言され、エクセルのツールバーにある「マクロ」ボタン(開発タブ)をクリックしたときに表示されるマクロの一覧にそのプロシージャは表示されなくなります。
ただし、別のモジュールからの実行は可能です(「Private」のついたプロシージャ以外)。また、プロシージャの中で宣言された変数は、そのプロシージャの実行中だけ有効で、キーワード Static により静的変数として宣言されていない限り、プロシージャの実行が、終了すると値は破棄されます。
変数やプロシージャのスコープ(適用範囲)使用例
サンプルVBAソース
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 |
'-------------------------------------------------------------------- ' Class1 モジュールに記述 '-------------------------------------------------------------------- Option Explicit Dim cls1 'Class1 モジュール内のみ Public cls2 'インスタンスから参照可 Private cls3 'Class1 モジュール内のみ Sub mySet(num As Integer) 'インスタンスから参照可 cls1 = num * 2 cls2 = num + 100 cls3 = num - 100 End Sub '-------------------------------------------------------------------- ' ThisWorkbook モジュールに記述 '-------------------------------------------------------------------- Dim wbk1 'ThisWorkbook モジュール内のみ Public wbk2 '「ThisWorkbook.wbk2」とすると参照可 Private wbk3 'ThisWorkbook モジュール内のみ Sub wbk_test1() '「ThisWorkbook.wbk_test1」とすると実行可 wbk1 = "abc" wbk2 = wbk2 + 100 wbk3 = 1000 End Sub '-------------------------------------------------------------------- ' UserForm1 モジュールに記述 '-------------------------------------------------------------------- Option Explicit Dim ufrm1 'UserForm1 モジュール内のみ Public ufrm2 '「UserForm1.ufrm2」とすると参照可 Private ufrm3 'UserForm1 モジュール内のみ Public Function xsub(aa As Integer) '「UserForm1.xsub(引数)」とすると実行可 MsgBox "aaa" End Function Private Sub CommandButton1_Click() xyz = 100 MsgBox xyz End Sub '-------------------------------------------------------------------- ' 標準モジュールに記述' '-------------------------------------------------------------------- Option Explicit Dim aa 'このモジュールからのみ Public bb 'ブック全体から参照可 Private cc 'このモジュールからのみ Sub test1() Static num As Integer Dim c1 As Class1 Set c1 = New Class1 c1.mySet (125) aa = 1 bb = 2 cc = 3 num = 1 + num UserForm1.ufrm2 = "あいうえお" Debug.Print num & "回目の実行" Debug.Print "クラスPublic cls2:" & c1.cls2 Debug.Print "Dim aa:" & aa Debug.Print "Public bb:" & bb Debug.Print "Private cc:" & cc Debug.Print "UserForm1.ufrm2 :" & UserForm1.ufrm2 Call ThisWorkbook.wbk_test1 Debug.Print "ThisWorkbook.wbk2:" & ThisWorkbook.wbk2 End Sub |