~Excel VBAでいこう~「Public Sub」「Private Sub」って? | Excel VBAでいこう

Excel VBAでいこう

Excel VBAでいこう!
会社でマクロ作ってます。かれこれ20年近くも・・・私の全ての知識を公開します。

今まで意識しないで作成していた「Sub」プロシージャ

Sub aaa()
  MsgBox  "testだぴょん"
End sub

な感じで、「Sub」の前に「Public」「Private」というキーワードを書く事を行ってませんでした。
参考書や、ネットでも「Public」「Private」をつけて書いてたり、つけてなかったりのまちまちで・・・
私的には、「Public」「Private」は省略可能なキーワードなんだから書かなくてもいいよね。
なんて思っていてずっと書いてませんでした。

今までは、自分で使用するマクロばかり書いていたので、簡単に済ませていましたが、
今回、客先に提出するマクロを作成するにあたり、きちんとプログラムを書かなきゃとの思いで調べてみました。

◆PublicとPrivate

「Public」「Private」は、そのSubプロシージャが有効な範囲(スコープ)のことです。

「Public」・・・モジュールの外から呼び出すことができる
「Private」・・・モジュール内でのみ呼び出すことができる

では、違いを見てみましょう。

まず、標準モジュールを一つ作り、下記のコードを書いてみて下さい。

Public Sub test1()
    MsgBox "「ぱぶりっく」だよ"
End Sub

Private Sub test2()
    MsgBox "「ぷらいべーと」だよ"
End Sub

さて、これを実行しようとすると…
test2が出てきません。

では、Private Sub test2()はどうやってつかうのでしょうか?
先ほど書いたように「Private」は、モジュール内でのみ呼び出しができるので、
下記のように「Call ステートメント」でプロシージャ内でのSubプロシージャを呼び出す時に使います。

Public Sub SubCall()
    Call test1
    Call test2
End Sub


同じモジュール内なのでtest1、test2は問題なく処理が行われます。

今度は、さらにもう一つ新しく標準モジュールを追加してください。
そこに、次のプロシージャを追加します。

Public Sub SubCall()
    Call Module1.test1  ’Module1に書いてあるモジュールを呼び出す
    Call Module1.test2
End Sub


これを実行するとどうなるでしょうか?
test1とtest2が両方とも実行される…わけではなく、
エラーが出てしまうはずです。



最初に書いたとおり、「Publicはモジュールの外から呼び出すことができ、
Privateはモジュール内でのみ呼び出すことができる」ものです。
別のモジュールからtest1を呼ぶことはできますが、
test2は呼び出せないのでこういうことになってしまいます。

PublicとPrivateの違いはこうです。

同じモジュール内からの呼び出し  Public ○ Private ○ 
別モジュールからの呼び出し    Public ○ Private ×

これなら全部「Public」でいいじゃん!と私も思ったわけなんですが、
やっぱり物事には「きまり」や「基本」というものがあって、きちっと理解しなくてはいけないわけです。
理解していないうちはちゃんと書く!を心がけたいと思います。


スコープ:有効な範囲のこと

~Excel VBAでいこう~の chicoたんでした。