プロシージャのスコープについて
EXCEL VBAの基本コードを紹介しています。初心者の方が順番に読んでくだけでVBAの基礎コードが理解出来るようになればなと思って、短めの記事で進めて行きたいと思います!
今回は、”スコープについて”について紹介します!
スコープ
前回、変数のスコープについて紹介しました。変数だけでなく、SubプロシージャやFunctionプロシージャについても、同じように参照範囲を決めることが出来ますので、今回はプロシージャのスコープについて紹介したいと思います!
プロシージャのスコープの種類
プロシージャのスコープには次の2種類があります。
プロシージャの呼び出しについてはこちらの記事をご覧ください。
Publicプロシージャ
まずは、Publicプロシージャからです。
同一プロジェクトのすべてのプロシージャから呼び出しが可能なスコープです。
いままで使ってきた次のようなコードは実はPublicプロシージャになります。
Sub test1()
'変数宣言
Dim str As String
str = "ひらちんの部屋"
'イミディエイトウィンドウに表示
Debug.Print str
End Sub
Publicプロシージャは正式には次のように表記します。
【Subプロシージャの場合】
Public Sub プロシージャ名(引数1,引数2,……)
’処理
End Sub
【Functionプロシージャの場合】
Public Function プロシージャ名(引数1,引数2,……) As データ型
’処理
プロシージャ名 = 戻り値
End Function
ただし、「Public」を省略することもできるので、通常はPublicの場合は書かないことが多いですね。
これまで使ってきた「Sub プロシージャ名()」などで始まっているものは、Publicを省略している書き方です。
それでは、次のスコープを実際のサンプルで試してみたいと思います。
【同一プロシージャ内での呼び出し】
まずは、同一プロシージャ内での呼び出しについて試してみましょう。
次のコードは、test1から同一モジュール内に書かれたPublicプロシージャ:test2(Public)を呼び出して利用するプログラムです。
'プロシージャ1
Public Sub test1()
Call test2
End Sub
ーーーーーーーーーーーーーーーーーーーーーーー
'プロシージャ2
Public Sub test2()
'変数宣言
Dim str As String
str = "ひらちんの部屋"
'イミディエイトウィンドウに表示
Debug.Print str
End Sub
test1を実行します。
test1から同一プロシージャ内のtest2(Public)を呼び出せることが確認出来ました。
【別のモジュールのプロシージャを呼び出す】
次に、別のモジュールに書かれたPublicプロシージャを呼び出してみます。
次のコードは、test1から別のモジュール内に書かれたtest3(Public)を呼び出して利用するプログラムです。
'プロシージャ1
Public Sub test1()
Call test3
End Sub
'プロシージャ3
Public Sub test3()
'変数宣言
Dim str As String
str = "ひらちんの部屋"
'イミディエイトウィンドウに表示
Debug.Print str
End Sub
test1を実行します。
test1から別のモジュールに書かれたプロシージャのtest3(Public)を呼び出せることが確認出来ました。
Priveteプロシージャ
次に、Privateプロシージャです。
同一モジュール内のみ呼び出しが可能なスコープです。
書き方はこうなります。
【Subプロシージャの場合】
Private Sub プロシージャ名(引数1,引数2,……)
’処理
End Sub
【Functionプロシージャの場合】
Private Function プロシージャ名(引数1,引数2,……) As データ型
’処理
プロシージャ名 = 戻り値
End Function
PublicがPrivateになっただけですね。
これもサンプルで確認していきます。
【同一プロシージャ内での呼び出し】
まずは、同一プロシージャ内での呼び出しについて試してみましょう。
次のコードは、test1から同一モジュール内に書かれたPrivateプロシージャ:test2(Private)を呼び出して利用するプログラムです。(スコープを意識する必要があるのは、呼び出される方になるので、test1はPrivateにしていません。)
'プロシージャ1
Sub test1()
Call test2
End Sub
ーーーーーーーーーーーーーーーーーーーーーーー
'プロシージャ2
Private Sub test2()
'変数宣言
Dim str As String
str = "ひらちんの部屋"
'イミディエイトウィンドウに表示
Debug.Print str
End Sub
test1を実行します。
test1から同一プロシージャ内のtest2(Private)を呼び出せることが確認出来ました。
【別のモジュールのプロシージャを呼び出す】
次に、別のモジュールに書かれたPrivateプロシージャを呼び出してみます。
次のコードは、test1から別のモジュール内に書かれたtest3(Private)を呼び出して利用するプログラムです。
'プロシージャ1
Sub test1()
Call test3
End Sub
'プロシージャ3
Private Sub test3()
'変数宣言
Dim str As String
str = "ひらちんの部屋"
'イミディエイトウィンドウに表示
Debug.Print str
End Sub
test1を実行します。
test1を実行しようとすると、次の図のように、「SubまたはFunctionが定義されていません。」というコンパイルエラーが発生してしまいました。
つまり、test1からは、test3(Private)が認識されていないということになります。呼び出せませんでした。
まとめ
プロシージャのスコープについて説明しました!少しずつ大きなプログラムを作るにあたっって、このスコープの使い所が見えてくると思います!スコープを意識して、適切なプログラムを書くことは重要ですので、しっかり覚えましょう!
コメント