ExcelVBAのSubとPrivateSubの違いは何ですか?


ベストアンサー

サブプログラムにはさまざまな可視性があります。 VBAでは、任意のコードモジュールからパブリックサブにアクセスできます(呼び出されます 。プライベートサブは、それが存在するモジュールからのみ呼び出すことができます。

この概念の名前はスコープです。オブジェクトと変数にもスコープがあります。 。

ここに短い紹介があります:範囲と可視性を理解する

わかっている場合は、サブプライベートにします現在のモジュールの外部では、このコードが設計されていることを決して実行してはなりません。タスクとコンテキストに固有の何かを構築しています。一方、サブパブリックを作成するときは、慎重に検討する必要があります。

自分以外のユーザー向けにVBAを作成する場合、ユーザーがコードを直接呼び出さないようにする必要があります。パラメータがない場合、パブリックサブはユーザーの「マクロ」リストに表示されます。 (Alt-F8)

ユーザーからパブリックサブを非表示にする(すべきです)通常は自分で処理します。別のモジュールでSubを呼び出す場合は、通常、適切なパラメータを渡して知っておく必要があることを伝える必要があり、パラメータを含むPublicSubはユーザーのリストに表示されないことがあります。

どこからでも呼び出すことができ、パラメータを必要としないユーティリティSubがあると便利です。パブリックモジュールのスタートアップコードを呼び出すワークシートのボタンから言います。スタートアップモジュールがユーザーに表示されないようにする必要があります。

したがって、サブに使用しないパラメータを指定します。さらに良いことに、言及する必要のないパラメータを指定します。以下の3番目のサブのオプションパラメータを参照してください。

Option Explicit

Sub Visible()

" Can call this guy from anywhere;

" from any module or directly by the user.

" Sub (on it"s own) is lazy shorthand for "Public Sub"

Invisible

End Sub

Private Sub Invisible()

" This Sub can ONLY be called from inside its module.

" It is not shown in the Macro list available to the user.

Tricksy

End Sub

Public Sub Tricksy(Optional pIgnore As Boolean = True)

" This sub can be called from anywhere.

" It does not require a parameter (pIgnore).

" BUT, because it has a parameter, it does not appear

" in the user"s list of available "macros".

MsgBox "Hi there", vbExclamation, "Greetings from Tricksy"

End Sub

ユーザーはサブ表示。同じモジュール内のコードのみがサブ非表示を呼び出すことができます。 トリッキーはどこからでも呼び出すことができ、パラメータは必要ありませんが、ユーザーはそれを「見る」ことはできません。

表示の結果:

デバッグ時に、パブリックサブを呼び出すことができますイミディエイトウィンドウから、コードがまだ実行されていないときはいつでも呼び出すことができます。

ただし、ブレークポイントに到達したとき、またはホストモジュールのどこかで一時停止したときにのみ、イミディエイトウィンドウからプライベートサブを呼び出すことができます。 。

回答

プライベートおよび(パブリック)サブは、ルーチンのスコープを宣言するために使用されます。

Private Sub:は、ルーチンが同じモジュール内で別のルーチンによってのみ呼び出されるようにします。

モジュールA というモジュールがあり、このモジュール内に次の2つのルーチンがあるとします。

  • Private Sub Hello\_World()
  • サブメッセージ()

Public Sub Message()

Call Hello\_World()

End Sub

Private Sub Hello\_World()

MsgBox “Hello World”

End Sub

メッセージルーチンは Hello\_World 。これが可能だったのは、両方のルーチンが同じモジュール(モジュールA)にあったためです。

次のルーチンを持つモジュールB があるとします。 :

Sub Message2()

Call Hello\_World()

End Sub

これにより、コンパイルエラーが返されます:「サブまたは関数が定義されていません」。

理由

呼び出していたため別のモジュールからのプライベートルーチン( Hello\_World )。不可能です。

パブリックサブ:ルーチンは、異なるモジュール内の他のルーチンからも呼び出すことができます。 すべてのルーチンはデフォルトでパブリックであるため、事前にワールドを「パブリック」と宣言する必要はありません。 Subだけで十分です。

Sub ThisIsEnough()

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です