スコープとは?
今回は「スコープ」について解説いたします。
実はこれまでのプログラミングでも既に使用してきた変数宣言時の「Dim」がそれにあたります。
スコープとは、変数や関数などを参照できる範囲の事を指し、3種類存在しています。
- Dim
- Public
- Private
- Static
スコープ「Dim」について
「Dim」は宣言した変数の中だけで使う事ができます。
クラス名や関数名に使うことは出来ません。
Dim <変数名> AS <型名>
Dim Sub <クラス名・関数名>()
End Sub
スコープ「Public」と「Private」について
「Public」と「Private」は関数やクラスの先頭に付けます。
以下に、前回の「【23】VBAのオブジェクト指向について」と同じサンプルを用意しました。
'★標準モジュール
Function test20()
'クラスモジュールを宣言
Dim testClass As Class1
'クラスオブジェクトを生成する
Set testClass = New Class1
'車の色を確認
MsgBox testClass.carBodyColor
'車の名前を確認
testClass.showCarName
'クラスオブジェクトを破棄する
Set testClass = Nothing
End Function
'★クラスモジュール(「Class1」と命名)
'クラスのメンバー変数
Public carName As String
Public carBodyColor As String
'クラスのコンストラクタ(クラスオブジェクトを生成した時に実行)
Private Sub Class_Initialize()
carName = "カローラ"
carBodyColor = "白"
End Sub
'クラスのメソッド(車の名前を表示する)
Public Sub showCarName()
MsgBox "車の名前は" & carName & "です。"
End Sub
'クラスのデコンストラクタ(クラスオブジェクトを破棄した時に実行)
Private Sub Class_Terminate()
MsgBox "クラスオブジェクトを破棄しました。"
End Sub
この「Class1」には「Public」と「Private」で定義されている箇所が5箇所あります。
「Public」スコープで定義されている箇所の抜粋
'クラスのメンバー変数
Public carName As String
Public carBodyColor As String
'クラスのメソッド(車の名前を表示する)
Public Sub showCarName()
「Private」スコープで定義されている箇所の抜粋
'クラスのコンストラクタ(クラスオブジェクトを生成した時に実行)
Private Sub Class_Initialize()
'クラスのデコンストラクタ(クラスオブジェクトを破棄した時に実行)
Private Sub Class_Terminate()
まず「Public」スコープを付けたメンバメソッドとメンバ変数ですが、これはインスタンスから直接呼び出す事、つまり使う事が出来ます。
例えば「Function test20()」に以下のインスタンスから、メンバメソッドを実行している箇所があります。
'車の名前を確認
testClass.showCarName
これが可能なのは「showCarName」のメソッドが「Public」だから、インスタンスから直接呼び出す事ができます。
という事で「Private」の場合は呼び出せないという事になります。
試しに「showCarName」を「Private」にして実行してみます。
'クラスのメソッド(車の名前を表示する)
Private Sub showCarName()
MsgBox "車の名前は" & carName & "です。"
End Sub
上記のようにエラーが発生します。
このように、クラスでスコープを使うことにより、インスタンスからの呼び出し可能・不可を指定できます。
スコープ「Static」について
「Static」はあまり使われる事もないと覆いますが、一応解説しておきます。
「Static」を使うと、変数の値が継続して保持されます。
以下のサンプルコードを見てください。
Sub test21()
Call test21a
Call test21a
End Sub
Sub test21a()
Static num As Integer
num = 1 + num
MsgBox "変数numは" & num & "です。"
End Sub
関数「test21()」の中で、関数「test21a()」を2回呼び出しています。
「test21a()」で変数numに対して「Static」で宣言しています。
この「test21()」を実行すると以下のようになります。
変数numの初期値は「0」です。
そして変数Numの値が保持されているため、「num = 1 + num」で加算されるという訳です。
ちなみに、もう1度続けて「test21()」を実行します。
ご覧の通り、変数numは先程の実行結果を保持したままなので、そのまま再び加算されます。
変数numの保持を一回リセットするには、リセットボタンを押して下さい。
これで値の保持がリセットされます。