VBAのコーディング時の「Public Sub」「Private Sub」の使い方について詳しく図解を交えながら解説していきましょう。
Public SubとPrivate Subの使い方について
このPublic SubとPrivate Sub の基本的な考え方については、下記サイトで確認しておきましょう。
SubとPublic Sub、Private Subの3つの違いを図解解説
まず下記プログラムソースをご確認下さい。
左側に単一Moduleとして、「Module1」「Module2」を作成し、そのModule1の中に①②③の3つサブールチン
ポイント
<3つのサブルーチンで検証>
①:Sub
②:Public Sub
③:Private Sub
として、プログラムを実行するマクロを作成したものです。
SubとPublic Subの利用の違い
まず①と②について解説していきます。
①のSubで記載されたサブルーチンは、上述サイトでも述べているように、「Sub=Public Sub」なので、どこからでも呼び出すことができるサブルーチンです。
2つの違いがあるかというと、処理に違いはありません。どちらで記載しても動作は一緒です。
でも、私はPublicは必ず記載するようにしています。それは、後の改修者のためです。
企業で転職があるように仕事は常に人に引き継がれていくため、プログラミングも引き継がなくてはいけないのです。
しかし、そのプログラミングがゴチャゴチャでみにくいと、人が理解するまでに時間がかかります。
プログラミンは、新規開発するよりも、他者が開発したブログラミングを解析して改修する方が難しいと言われますが、
私が実際に開発しても同様です。これは、コーディングに人の色が出るからですね。なので、配慮ができる方は、なるべく細かく「Public Sub」で書いておく方がよいでしょう。
SubとPublic Subを利用する2つのメリット
このSubとPublic Subを利用するメリットには2つあります。
【SubとPublic Subを利用する2つのメリット】
- どこのModuleからでも呼び出せる
- マクロのメニューバーに表示される
PubとPublic Sub=どこのModuleからでも呼び出せる
「Public Sub」で記述されていると、例えば、Module1に記載されている「Public Sub Main」というサブルーチンは、Module2からでも呼び出せるという意味です。
上のModule2に記載されている「Public Sub TestC」というサブルーチンからCall文でMainを呼び出すことができます。
しかし、その下にある「Move_Func」と記載されているサブルーチンは、Module1内に「Private Sub」で宣言されているため、呼び出すことができずにエラーになります。
つまり、上記サイトでも述べているように、なるべく「Public Sub 」で記述している方がよいというのは、見やすくするためだけでなく、Moduleの数やサブルーチンが増えてくると、管理が難しくなるためでもあるのです。
SubとPublic Sub=マクロのメニューバーに表示される
また「SubとPublic Sub」で記述されるともう一つのメリットがあります。
それは、「マクロのメニューにも表示される」点です。
画面はこちら。
Private Subで宣言されているマクロについては、こちらの画面には表示されません。
基本的には、「開発タブ➡マクロ➡実行」から処理することの方が多いかと思いますので、Public SubやSubで記述するのが一般的というわけですね。
Private Subは単一Module内でしか使えない
続いて、Private Subについて解説していきます。
Private Subという宣言は、メモリの消費量が少ないという利点がありますが、単一Module内でしか利用できません。
上記でも記載しましたが、
その下にある「Move_Func」と記載されているサブルーチンは、Module1に記述してあります。そのため、Module1内に「Private Sub」で宣言されているため、Module2からCAll文で呼び出すことができずにエラーになってしまいます。
Private Subを使う場合とは
それでは、このPrivate Subはどんな時に使うのかという場合についてですが、主に2つの場合があります。
<Private Subを使う場合>
- Moduleを一つしか使用しない場合(プログラムソース数が少ない)
- 単一Module内で仕組みを完結させる場合
Moduleを一つしか使わないような、プログラムソースの記述が少ない場合には、Privateの宣言でよいでしょう。
また単一Module内で全ての仕組みを完結するように作成すれば、Private の宣言で十分処理は動きます。
こうした場合にのみ、Private Subの宣言は有効的です。このようにして、「Private Sub」と「Public Sub」を使い分けていきます。
同一Module内で同じ変数名は宣言できない
それでは、おまけとして、「同一Module内で同じ変数名を宣言することができない。」点について解説していきます。
この内容もModuleのPublic とPrivateの宣言を含みますので、合わせて覚えておきましょう。
下記の画面をご覧ください。
Aの部分(Option Explicit)にある「Dim a as string」と、その下の赤枠にある「Dim a as string」が重複した宣言をしていると、この仕組みは正しく動作しなくなります。
Option Explicitとは
A部分は、「Option Explicit」と言われ、Option Explicitより上の部分で変数宣言をする際に使用する項目となっています。
Option Explicitの特徴
Option Explicitの特徴についてまとめておきます。
【Option Explicitの変数宣言について】
- 同一Module内サブルーチンの宣言を意味する
- 「Dim a as String =Private a as String」は同じ事
注意点:但し、Public a as Stringの場合、全てのModuleで共通となる
Dim やPrivateで宣言されている変数は、そのModule内で呼び出すことができ、全てのサブルーチンから呼び出せます。
なので、重複は許されません。
「Dim a as String」というのが、赤枠のように2つありますが、これではプログラミングは正常に動作しません。
実行処理は流れますが、変数に矛盾な値が入りますので、同一変数の重複宣言には、注意して下さい。
但し、Option Explicitではなく、サブルーチンの同士であれば、同じ名称の変数宣言は可能です。
Option Explicitで宣言される「Dim = Private」と同じことになりますが、
つまり、
Dim a as String =Private a as String
は同じものを意味することを覚えておきましょう。
まとめ
このように、Publicは、Moduleが多岐に渡り、大きい範囲で使用する際に用い、Privateは、単一Moduleの狭い範囲内で宣言する際に利用されます。
基本的な、Public Subを使用していれば仕組みは動作します。
またそれなりの大きな仕組みでもPublic宣言を多用しても仕組みやメモリが壊れるようなことはありません。
それほど使い分けに心配する必要性はありませんが、ソースをきれいに見やすく作れるようにサブルーチンの作りや変数の宣言をまとめおきましょう。
後から見た改修者がすぐに改修できるようなコーディングができるといいですね。