Chapter2-13 適用範囲(スコープ)

適用範囲(スコープ)


プロシージャの中で宣言された変数や定数は、どこからでも参照できるわけではありません。また、あるモジュールのプロシージャも、必ずしもどこからでも呼び出せるわけではありません。変数やプロシージャは、宣言する場所や宣言の仕方によって、通用する範囲が変わります。その範囲のことを「適用範囲(スコープ)」といいます。


以下に、スコープの例をいくつか説明します。
ここでのポイントは「Public」「Private」です。前者は広範囲のスコープを持ち、後者はある限られたスコープとなります。これらを特に指定しない場合も、自動的にいずれかのスコープとなります(基本的にはPublicかPrivateを明示した方がよい)。


■プロシージャ内の変数/定数
Sub Sample_Proc()

  Dim strData As String
  Dim iintLoop As Integer
  Const PAI = 3.14

  〜〜〜〜〜〜〜〜
  〜〜〜〜〜〜〜〜

End Sub


プロシージャ内で宣言された変数や定数は、そのプロシージャ内でのみ有効です。呼び出されるたびに初期化(数値はゼロ、文字列は長さゼロ)され、プロシージャを抜けるとすべて破棄されます。


■Static宣言された変数
Sub Sample_Proc()

  Static strData As String

  〜〜〜〜〜〜〜〜
  〜〜〜〜〜〜〜〜

End Sub


「Static」で宣言された変数は、そのプロシージャ内でのみ有効です。ただし、そこで代入された値はプロシージャを抜けても保持されており、再呼び出ししたときも、初期化されずに前回終了時の値となっています。


■標準モジュールのDeclarationsセクションでPublic宣言された変数/定数
Option Compare Database
Option Explicit

Public pstrData As String
Public Const PAI = 3.14


そのモジュール内はもとより、フォーム/レポート、他の標準モジュールからも、その名前のまま、参照や代入が可能です。


■標準モジュールのDeclarationsセクションでPrivate宣言された変数/定数
Option Compare Database
Option Explicit

Private pstrData As String
Private Const PAI = 3.14
Dim iintLoop As Integer
Const ERRNUM = 3


そのモジュール内でのみ有効です。同じモジュール内であれば、どのプロシージャからも参照・代入が可能ですが、他のモジュールからは扱えません。DimやConstのみで宣言された場合も、Privateと同じ扱いとなります。


■標準モジュールでPublic宣言されたプロシージャ
Public Sub Sample_Proc()

  〜〜〜〜〜〜〜〜
  〜〜〜〜〜〜〜〜

End Sub


フォームやレポートを含む、データベース内のすべてのモジュールから呼び出し可能です。Functionプロシージャであれば、クエリの演算フィールドから呼び出すこともできます。Publicを省略しても同様の扱いになります。


■標準モジュールでPrivate宣言されたプロシージャ
Private Sub Sample_Proc()

  〜〜〜〜〜〜〜〜
  〜〜〜〜〜〜〜〜

End Sub


そのモジュール内からのみ呼び出し可能です。


■フォーム等のクラスモジュールでPublic宣言された変数やプロシージャ
Option Compare Database
Option Explicit

Public pstrData As String

Public Sub Sample_Proc()

  〜〜〜〜〜〜〜〜
  〜〜〜〜〜〜〜〜

End Sub


これらは、変数やプロシージャ名の前にクラスモジュール名を付けることで、他のモジュールから参照や代入が可能となります。たとえば”顧客マスタ”フォームのモジュールであれば、「Form_顧客マスタ.pstrData」や「Form_顧客マスタ.Sample_Proc」のように指定することで呼び出すことができます。(クラスモジュールについては後述します)


■フォーム等のクラスモジュールでPrivate宣言された変数やプロシージャ
Option Compare Database
Option Explicit

Private pstrData As String

Private Sub Sample_Proc()

  〜〜〜〜〜〜〜〜
  〜〜〜〜〜〜〜〜

End Sub


そのクラスモジュール内でのみ有効です。PublicもPrivateも付けない場合、変数/定数はPrivateの扱いになり、プロシージャはPublicの扱いになります。
| Index | Prev | Next |

 

Copyright © T'sWare All rights reserved