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