【EXCEL VBA | 基礎コード】プロシージャのスコープについて

スポンサーリンク

プロシージャのスコープについて

EXCEL VBAの基本コードを紹介しています。初心者の方が順番に読んでくだけでVBAの基礎コードが理解出来るようになればなと思って、短めの記事で進めて行きたいと思います!

今回は、"スコープについて"について紹介します!

スコープ

前回、変数のスコープについて紹介しました。変数だけでなく、SubプロシージャやFunctionプロシージャについても、同じように参照範囲を決めることが出来ますので、今回はプロシージャのスコープについて紹介したいと思います!

プロシージャのスコープの種類

プロシージャのスコープには次の2種類があります。

Publicプロシージャ・・・同一プロジェクトのすべてのプロシージャから呼び出しが可能

Privateプロシージャ・・・同一モジュール内のみ呼び出しが可能

プロシージャの呼び出しについてはこちらの記事をご覧ください。

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)が認識されていないということになります。呼び出せませんでした。

まとめ

プロシージャのスコープについて説明しました!少しずつ大きなプログラムを作るにあたっって、このスコープの使い所が見えてくると思います!スコープを意識して、適切なプログラムを書くことは重要ですので、しっかり覚えましょう!