VBAトレーニング-08 [関数操作について-③]-[PrivateとPublicの違い]

このページで学習出来る事

 前回は関数の[ByVal(値渡し)]と[ByRef(参照渡し)]の違いについて説明しましたが、今回は関数の呼び出し方や[Private]と[Public]の違いについて説明していきます。

 関数には[Private]と[Public]の二種類が存在し、それぞれ呼び出せる範囲が異なりますので、その辺の動きに気を付けながら見ていきたいと思います。

学習内容

  • [Private]と[Public]の違い

  • 別モジュールにある関数の呼び出し方

この学習で使用するエクセルファイルはここからダウンロードできます。

  


サンプルコード

 [sample-08.xlsm]を開いて、中に書かれているコードを確認しましょう。

 今回のコードでは、二つのモジュール[Module1]と[sample]が用意されています。[Module1]には関数を呼び出す記述が書かれており、[sample]には呼び出される側の記述が書かれています。この二つを使って[Private]と[Public]の違いを見ていきます。

 このファイルをそのまま使用しても構いませんし、新しくエクセルファイルを作って、自身でコードを記載して動かしても構いません。(直接コードを書いた方が覚えやすいので、時間がある方は書く練習もしてみましょう)

'Module1側の記述----------------------------------------------
Sub main()
    Dim tempNum As Integer
    
    tempNum = 10
    tempNum = sample.fncTest01(tempNum)
    Debug.Print (tempNum)
End Sub


'sample側の記述----------------------------------------------
Public Function fncTest01(ByVal tempNum As Integer) As Integer
    tempNum = 50
    Debug.Print (tempNum)
    
    fncTest01 = tempNum
End Function

Private Function fncTest02(ByVal tempNum As Integer) As Integer
    tempNum = 100
    Debug.Print (tempNum)
    
    fncTest02 = tempNum
End Function

コードの解説 sub main()部分

‘[sample.fncTest01()]と記述することで、[sample]モジュール内の[fncTest01]を呼び出しています。
tempNum = sample.fncTest01(tempNum)

  

コードの解説 Public Function fncTest01()部分

‘[Public]を付けて関数[fncTest01]を宣言しています。
Public Function fncTest01(ByVal tempNum As Integer) As Integer

  

コードの解説 Private Function fncTest02()部分

‘[Private]を付けて関数[fncTest02]を宣言しています。
Public Function fncTest01(ByVal tempNum As Integer) As Integer

  


[Public]の呼び出し範囲

 [Public]で宣言された関数は、どのモジュールからも呼び出し可能となります。どこからでも呼び出すことが出来ますので、共通処理を行う関数などには[Public]が有効になります。

 今回のサンプルコードでは、[Module1]モジュール内の[Sub main()]から、[sample]モジュールの[fncTest01]を呼び出しています。

 実際に[fncTest01]内の[Debug.Print]でブレークポイントを設定して実行して別のモジュールからも正常に呼び出せるか確認してみましょう。
 実行すると、処理が[Module1]から[sample]モジュールに移っているのが確認できます。そのまま処理を実行すると、[fncTest01]関数内で処理をした値を返しているのも確認する事ができます。

 この様に、[Public]で宣言した関数は別のモジュールからも呼び出せる事がわかりました。

 別モジュールにある関数を呼び出す場合は「[モジュール名].[関数名]」と指定することで呼び出すことが出来ます。

  


[Private]の呼び出し範囲

 次に[Private]を宣言した関数を別のモジュールから呼び出してみましょう。
 まずは、実施前の準備として[Sub main()]関数内にある[tempNum = sample.fncTest01(tempNum)]を[tempNum = sample.fncTest02(tempNum)]と書き換えます。
 これで、[sample]モジュール内の[fncTest02]関数を呼び出すという記述に変わりました。

 この状態で、[fncTest02]内の[Debug.Print]でブレークポイントを設定し、実行してみましょう。下記図のようにエラーが表示されましたか?

 なぜエラーが発生するかと言うと[Private]で宣言した関数は、そのモジュール内でしか呼び出すことが出来ないため、[Module1]から[fncTest02]を呼び出しても、「その様な関数名は[Module1]には無い」という事でエラーが表示されます。

※[fncTest02]をそのまま[Module1]にコピーすると、問題なく[Module1]内の[fncTest02]関数が呼び出されます。

Private:そのモジュール内でしか呼び出せない(使用できない)関数
Public:どのモジュールからも呼び出し(使用)出来る関数

  


最後に([Private]と[Public]の使い分け)

 今回は、関数の利用範囲を決める[Private]と[Public]について説明をしました。
 一見どこからでも使用できる[Public]が便利そうですが、多用しすぎると「どこからでも呼べる」が災いし、ちょっとした修正でも影響範囲が大きくなる場合があります。

 それに比べ[Private]は呼び出される範囲(スコープ)が限られるため、修正が入っても影響範囲は、そのモジュール内に限られます。

 モジュールの役割を明確にし、極力[Private]にて収まるように設計し、変更の少ない共通動作に関してのみ[Public]を宣言するなどして使い分けていきましょう。

[Private]と[Public]の注意点

・[Private]は修正が入っても影響範囲が限られる。
・[Public]は修正時に影響範囲が大きくなる。(どこから呼び出されているか、モジュール全てのチェックが必要)

  

 次回は、変数から関数を呼び出す方法について説明したいと思います。

  

前回-関連記事

このページで学習出来る事  前回は関数の[Sub]と[Function]の違いについて説明しましたが、今回は関数への値の渡し方について説明をします。  値の渡し方には[ByVal(値渡し)]と[ByRef(参照渡し)]の二種類が存在し、それ[…]

次回-関連記事

このページで学習出来る事  前回は関数の[Private]と[Public]の違いについて説明しましたが、今回はちょっと変わった関数の呼出し方について説明していきます。  関数の呼出しは、基本的に[Call 関数名]で呼び出すことが出来ます[…]