Home » エクセルマクロ・Excel VBAの使い方 » 変数のPrivateとPublicの違い

拙著『いちばんやさしいExcel VBAの教本』の、Lesson 34「Subプロシージャごとに変数宣言することに慣れましょう」では、 モジュールレベル変数について少しだけ触れています。

モジュールレベル変数

モジュールレベル変数とプロシージャレベル変数の違いだけを解説するため、プロシージャの外でDimキーワードを使って宣言する形で解説をしていますが、実際にモジュールレベル変数を使う場合には、DimよりもPrivateで宣言するほうが、意味がより明確になってイイでしょう。

そして実は、Privateの対語でもあるPublicというキーワードを使って変数を宣言することも可能です。

この変数宣言の、PrivateとPublicの違いがよくわからないという方が、時折いらっしゃいます。

PrivateとPublicの違い

標準モジュールの変数宣言部で、PrivateとPublicを使った場合の違いを結論からお伝えすると、以下のとおりです。

Privateで宣言された変数は、宣言したモジュールの中でのみ、どこからでも使えます。

これに対し、
Publicで宣言された変数は、プロジェクト全体の中で、どこからでも使えます。

Private変数とPublic変数を用意する

実際にコードを書いて確認しましょう。

PrivateとPublicの違いを確認するには、モジュールを2つ以上用意する必要があります。
今回は、Publicで宣言する変数や、プロジェクト全体で広く使われるプロシージャ等を配置することを想定した標準モジュールの名前を「Common」に、通常のプロシージャ等を配置する標準モジュールはデフォルトのまま「Module1」としてみます。

プロジェクトエクスプローラーは下図のような状態になります。

プロジェクトエクスプロラー:CommonとModule1

Commonモジュール

2つのモジュールが準備できたら、Commonモジュールに以下のようにPublicで変数を宣言します。
' Commonモジュール
Option Explicit
Public g_cnt As Long

何らかの数をカウントすることを想定した変数g_cntを、Long型で宣言しています。

コードウィンドウ:Commonモジュール

Publicで宣言したグローバル(global)変数ということを明確にするため、接頭辞g_を付けた、g_cntという名前にしました。

Module1モジュール

つづいてModule1モジュールには、以下のようにPrivateで変数宣言を行い、Subプロシージャも作成しましょう。

' Module1モジュール
Option Explicit
Private m_cnt As Long Sub sample()
 m_cnt = m_cnt + 1
 g_cnt = g_cnt + 1
End Sub

モジュールレベルで何らかの数をカウントすることを想定した変数m_cntを、やはりLong型で宣言しています。

コードウィンドウ:Module1モジュール

Privateで宣言したモジュール(module)レベル変数ということを明示するために、接頭辞m_を付けた、m_cntという名前にしました。

Subプロシージャsampleには、変数g_cntとm_cntをインクリメントする処理だけを書いています。

VBAProjectのコンパイルと接頭辞

この状態でメニュー[デバッグ]-[VBAProjectのコンパイル]を実行すれば、エラーが発生することなくコンパイルが行われます。

ちなみに、接頭辞をg_とm_にしていますが、これはどの範囲で有効な変数なのかを判別しやすくするため便宜的につけただけで、必ずこうしなければならないというわけではありません。
実務でどうするのかは、コーディング規約で決めましょう。

変数のPrivateとPublicを確認する

ここまでは変数のPrivateとPublicの違いを確認するための、いわば準備作業です。

実際の違いを体験しましょう。
Commonモジュールに以下のSubプロシージャを追加して、[VBAProjectのコンパイル]を実行してみてください。
Sub test_コンパイルエラー発生()
 m_cnt = m_cnt + 1
 g_cnt = g_cnt + 1
End Sub

先ほど、Commonモジュールに作成したsampleプロシージャと同じ処理が書かれているだけですが、変数m_cntが反転した「変数が定義されていません。」コンパイルエラーが発生します。

「変数が定義されていません。」コンパイルエラー

Module1内でPrivateキーワードを使って宣言された変数m_cntは、Commonモジュールからは、見えていない状態になっているということです。

変数m_cntは、Module1内でならどこでも使えますが、他のモジュールでは使えないわけです。

これに対し、Module1モジュールに作成したSubプロシージャsampleでは、Privateで宣言された同じモジュール内にあるm_cntだけでなく、別のモジュールであるCommonモジュールでPublicキーワードを使って宣言したg_cntも見えているわけです。

これが、PrivateとPublicの違いです。

PrivateとPublicの違い

Privateで宣言された変数は、宣言したモジュールの中でのみ、どこからでも使えます。

Publicで宣言された変数は、プロジェクト全体の中で、どこからでも使えます。

最終更新日時:2018-10-25 03:14

[スポンサードリンク]

Home » エクセルマクロ・Excel VBAの使い方 » 変数のPrivateとPublicの違い

「エクセルマクロ・Excel VBAの使い方」の記事一覧

検索


Copyright © インストラクターのネタ帳 All Rights Reserved.
.