サイトについて      連絡先   検索

VBA スコープ

はじめに

Excel VBA マクロのスコープを紹介します。

スコープとは変数や関数などを参照できる範囲のことで、Public, Private, Dim があります。

関数の中だけで使用できたり、他のファイルから使用できるように設定できます。

  • 目次
    • スコープとは
    • Dim 変数の使い方
    • Private 変数の使い方
    • Public 変数の使い方
    • 関数のスコープ
    • その他のスコープ
    • まとめ

スコープとは

変数や関数を参照できる範囲を「スコープ」と言います。スコープには次の種類があります。

スコープを省略すると、何になるのかはそれぞれ違います。混同しないように省略しないのをオススメします。

Dim 変数の使い方

関数の中に Dim で変数を宣言します。その関数でのみ参照できます。関数の処理を抜けると変数は削除されます。この変数のことを「ローカル変数」と言います。

Dim は関数には使えません。変数にのみ使用できます。

ローカル変数をカウントアップする関数を何度実行しても、結果は変わりません。


Sub 実行()
    Call サブ ' 1
    Call サブ ' 1 カウントは増えません
End Sub

Sub サブ()
    Dim ローカル As Integer

    ローカル = ローカル + 1
    Debug.Print(ローカル)
End Sub ' 関数の処理を抜けるとローカル変数は削除される

これは関数の処理を抜けるとローカル変数は削除されるためです。次に同じ関数を実行するときに、ローカル変数の値は初期化されています。

また他の関数からはローカル変数を参照できないので、同じ名前の変数を宣言できます。


Sub 実行1()
    Dim 変数 As String

End Sub

Sub 実行2()
    Dim 変数 As String ' 実行1 の変数とは別の変数です

End Sub

このように、その関数内でのみ使用する変数を作成したいときに Dim を使用します。

Private 変数の使い方

他の関数より上に Private で変数を宣言します。そのファイル内で参照できます。シートなどクラスに宣言したときは、そのインスタンスが削除されない限り値は残ります。


Private プライベート As Integer

Sub 実行()
    Call カウントアップ ' 1
    Call カウントアップ ' 2
    Call カウントダウン ' 1
    Call カウントダウン ' 0
End Sub

Sub カウントアップ()
    プライベート = プライベート + 1
    Debug.Print(プライベート)
End Sub

Sub カウントダウン()
    プライベート = プライベート - 1
    Debug.Print(プライベート)
End Sub

このように複数の関数で同じ変数を使いたいときや、関数を抜けても値を残したいときに Privcate を使用します。

関数の外でも Dim を使って変数を宣言できます。そのときは Private と同じ扱いになります。ローカル変数と混同するので Private を使用します。

Public 変数の使い方

他の関数より上に Public で変数を宣言します。すべてのファイルから参照できます。シートなどクラスに宣言したときは、そのインスタンスが削除されない限り値は残ります。この変数のことを「グローバル変数」と言います。

ファイル名.変数名のように、変数の前にそのファイル名を入力して参照します。標準モジュールの変数は、ファイル名を付けなくても参照できます。

Public 変数を宣言したファイルの中からは変数名だけで参照できます。あえてファイル名を付けたいときはMe.変数名のように Me を付けます。Me は自身のインスタンスを表しています。ただし標準モジュールには Me を付けられません。

Sheet1 のコード


Public パブリックシート As Integer

Sub 実行シート()
    ' 別のファイルの変数
    Module1.パブリック標準 = 1  ' 標準モジュールの変数を参照する
    パブリック標準 = 2          ' 標準モジュールの変数は、変数名だけでも参照できる
    
    ' 自身の変数
    パブリックシート = 3        ' 宣言したファイルの変数は、変数名だけで参照できる
    Me.パブリックシート = 4     ' 宣言したファイルの変数は、Me を付けても参照できる
    Sheet1.パブリックシート = 5 ' 宣言したファイル名でも参照できるが、通常は Me を付ける
End Sub

標準モジュール1 のコード


Public パブリック標準 As Integer

Sub 実行標準()
    ' 別のファイルの変数
    Sheet1.パブリックシート = 1 ' Sheet1 の変数を参照する
    パブリックシート = 2        ' エラー、ファイル名がないので参照できない

    ' 自身の変数
    パブリック標準 = 3          ' 宣言したファイルの変数は、変数名だけで参照できる
    Me.パブリック標準 = 4       ' エラー、標準モジュールに Me は使用できない
    Module1.パブリック標準 = 5  ' 宣言したファイル名でも参照できる
End Sub

いろいろな参照方法がありますがファイル名.変数名またはMe.変数名で参照するのがオススメです。Public 変数であることを意識できます。

注意点

同じ名前の Public 変数を複数のファイルに宣言できます。その時どのファイルの変数が参照されているかを意識する必要があります。


' Sheet1 のコード
Public パブリック As Integer

Sub 実行シート()
    パブリック = 1             ' Sheet1 の変数
    Module1.パブリック標準 = 2 ' 標準モジュールの変数
End Sub

' 標準モジュール1 のコード
Public パブリック As Integer

Sub 実行標準()
    パブリック = 1        ' 標準モジュールの変数
    Sheet1.パブリック = 2 ' Sheet1 の変数
End Sub

混同しないためにもファイル名.変数名形式で参照するのをオススメします。

また同じファイル内でも Public と Dim や Private と Dim で同じ名前の変数を宣言できます。混同しないためにも同じ名前の変数は宣言しないようにします。


Public パブリック As Integer

Sub 実行()
    Dim パブリック As Integer

    パブリック = 1    ' ローカル変数
    Me.パブリック = 2 ' Public 変数
End Sub

関数のスコープ

関数のスコープの使い方は変数と同じです。Dim は使用できません。Public や Private 変数などの下に宣言します。

Sheet1 のコード


Sub 実行シート()
    ' 別のファイルの関数
    Call Module1.パブリック標準   ' 標準モジュールの関数を呼び出す
    Call パブリック標準           ' 標準モジュールの関数は、関数名だけでも呼び出せる
    
    ' 自身の関数
    Call パブリックシート         ' 宣言したファイルの関数は、関数名だけで呼び出せる
    Call Me.パブリックシート      ' 宣言したファイルの関数は、Me を付けても呼び出せる
    Call Sheet1.パブリックシート  ' 宣言したファイル名でも呼び出せるが、通常は Me を付ける
End Sub

Public Sub パブリックシート()
    
End Sub

Private Sub プライベートシート()
    
End Sub

標準モジュール1 のコード


Sub 実行標準()
    ' 別のファイルの関数
    Call Sheet1.パブリックシート  ' Sheet1 の関数を呼び出す
    Call パブリックシート         ' エラー、ファイル名がないので呼び出せない
    
    ' 自身の関数
    Call パブリック標準           ' 宣言したファイルの関数は、変数名だけで呼び出せる
    Call Me.パブリック標準        ' エラー、標準モジュールに Me は使用できない
    Call Module1.パブリック標準   ' 宣言したファイル名でも呼び出せる
End Sub
  
Public Sub パブリック標準()
    
End Sub

Private Sub プライベート標準()

End Sub

Public や Private を省略したときは Public 関数になります。


Sub 省略シート() ' Public になる
    
End Sub

変数と同様に混同しないためにもファイル名.関数名形式で呼び出すのをオススメします。

その他のスコープ

定数や固定長文字列や配列や構造体を Public で宣言するには、標準モジュールにする必要があります。Sheet1 などのクラスには宣言できません。


' 標準モジュールのコード
Public Const 定数 As Integer = 1

Public 固定長 As String * 3 

Public 配列() As String

Public Type 構造体
    a As Integer
End Type

' Sheet1 などのクラスに宣言するとエラーになる

エラー 定数、固定長文字列、配列、ユーザー定義型および Declare ステートメントは、オブジェクト モジュールのパブリック メンバーとしては使用できません。」や「エラー オブジェクト モジュール内では、パブリック ユーザー定義型は定義できません。」が発生します。

まとめ

Public がすべてのファイルから参照できるので便利だと思いがちですが、なるべく狭い範囲のスコープを使用します。どこからでも参照できることは、逆にどこからでも不具合を発生させられることにもつながります。その時デバッグ作業がとても大変になります。

関数に引数を渡す方法を覚えると Public 変数で宣言していたものを Private 変数にできるようになります。

最初は Dim 次に Private、最後に Public といったように、できるだけ狭いスコープでコードが作成できないかを試します。

  • 目次
    • スコープとは
    • Dim 変数の使い方
    • Private 変数の使い方
    • Public 変数の使い方
    • 関数のスコープ
    • その他のスコープ
    • まとめ