以前に定義された 識別子 を作成または使用しようとすると、名前付けの競合が発生します。 名前付けの競合によって、現在のスコープであいまいな名前の検出や重複宣言などのエラーが生成される場合があります。 検出されない名前付けの競合により、コードでバグが発生し、誤った結果が発生する可能性があります。特に、最初に使用する前にすべての 変数 を明示的に宣言していない場合は。
スコープ、プライベート モジュール レベル、およびパブリック モジュール レベルを理解することにより、ほとんどの名前競合を避けることができます。
識別子が次の場合、名前の競合が発生する可能性があります。
- 複数のスコープ レベルで認識できる。
- 同じレベルで 2 つの異なる意味がある。
たとえば、異なるモジュールのプロシージャは、名前が同じでもかまいません。 したがって、 MySub という名前のプロシージャを、 Mod1 および Mod2 という名前のモジュールで定義できます。 各プロシージャがそれぞれのモジュール内の他のプロシージャのみから呼び出されている場合は、競合は発生しません。 ただし、 MySub が 3 番目のモジュールから呼び出され、2 つの MySub プロシージャを区別するための修飾が指定されていない場合、エラーが発生する可能性があります。
各識別子の前にモジュール名で構成される修飾子を付け、必要に応じてプロジェクト名を付けることにより、ほとんどの名前の競合を解決できます。 例:
YourProject.YourModule.YourSub MyProject.MyModule.MyVar
前のコードでは、YourSub Sub プロシージャを呼び出し、MyVarを引数として渡します。 修飾子の任意の組み合わせを使用して、同一の識別子を区別します。
Visual Basic は、識別子に対する参照を、一致する識別子の "最も近い" 宣言と一致させます。 たとえば、MyIDがプロジェクト内の 2 つのモジュール (Mod1 と Mod2) で Public と宣言されている場合は、Mod2内から修飾せずにMod2で宣言されたMyIDを指定できますが、Mod1で指定するにはMod2.MyIDとして修飾する必要があります。
これは、 Mod2 が異なるが直接 参照されるプロジェクト内にある場合にも当てはまります。 ただし、Mod2が間接的に参照されるプロジェクト (つまり、直接参照するプロジェクトによって参照されるプロジェクト) にある場合、MyID という名前のMod2変数への参照は、常にプロジェクト名で修飾する必要があります。
MyID を第 3 の直接参照されているモジュールから参照する場合は、以下を検索することによって検出された最初の宣言と対応されます。
- [ツール] メニューの [参照] ダイアログ ボックスに表示される順序で、直接参照されるプロジェクト。
- 各プロジェクトのモジュール。 プロジェクト内のモジュールに対しては特定の順序がないことに注意してください。
ホスト アプリケーションのオブジェクトの名前 (たとえば、Microsoft Excel の R1C1) を異なるスコープ レベルで再利用することはできません。
ヒント
一般に、名前の競合によって発生するエラーとしては、あいまいな名前、重複する宣言、宣言されていない識別子、見つからないプロシージャなどがあります。 各モジュールを Option Explicit ステートメントで開始して、変数を使用する前に明示的な宣言を強制することで、名前付けの競合や識別子関連のバグが発生する可能性を回避できます。
関連項目
サポートとフィードバック
Office VBA またはこの説明書に関するご質問やフィードバックがありますか? サポートの受け方およびフィードバックをお寄せいただく方法のガイダンスについては、Office VBA のサポートおよびフィードバックを参照してください。