LoginSignup
0
0

More than 1 year has passed since last update.

【VBA】シートモジュール内でPrivateキーワードを使用する場合の注意

Posted at

はじめに

シートモジュール内でPrivateキーワードを付けたプロシージャの呼び出しに失敗したので、記事に残しておきます。
同じモジュール内であっても、オブジェクト名やMeキーワードを付けると、プロシージャを呼び出すことができないみたいです。

標準モジュール

'@標準モジュールModule1
Private Sub TestPrivate()
    Debug.Print "private"
End Sub

Sub Test1()
    TestPrivate '=> private
End Sub

Sub Test2()
    Module1.TestPrivate '=> private
End Sub

モジュール名を付けても付けなくても、プロシージャを呼び出すことができました。

シートモジュール

'@シートモジュールSheet1
Private Sub TestPrivate()
    Debug.Print "private"
End Sub

Sub Test1()
    TestPrivate '=> private
End Sub

Sub Test2()
    Sheet1.TestPrivate
    '=> コンパイルエラー:メソッドまたはデータメンバーが見つかりません。
End Sub

Sub Test3()
    Me.TestPrivate
    '=> コンパイルエラー:メソッドまたはデータメンバーが見つかりません。
End Sub

オブジェクト名やMeキーワードを付けてプロシージャを呼び出すと、コンパイルエラーが発生します。
他のモジュールからプロシージャを呼び出したような動きになっているみたいです。
ちなみにブックモジュールでも同様の結果となりました。

クラスモジュール

'@クラスモジュールClass1
Private Sub TestPrivate()
    Debug.Print "private"
End Sub

Public Sub Test1()
    TestPrivate
End Sub

Public Sub Test2()
    Me.TestPrivate
End Sub
'@標準モジュールModule1
Sub Test1()
    Dim cl As Class1
    Set cl = New Class1

    cl.Test1 '=> private
End Sub

Sub Test2()
    Dim cl As Class1
    Set cl = New Class1

    cl.Test2
    '=> コンパイルエラー:メソッドまたはデータメンバーが見つかりません。
End Sub

シートモジュールと同様、Meキーワードを付けてプロシージャを呼び出すと、コンパイルエラーが発生します。

おわりに

シートモジュール内で不必要にMeキーワードをたくさん書いていたため、このような失敗をしてしまいました。
詳細はよくわかりませんが、シート(オブジェクト)モジュールについて注意しなければならない、というよりは、特定のオブジェクトを持たない標準モジュールの方が特殊なのかもしれませんね。
ちなみにプロシージャだけでなく、変数も同じような挙動をとります。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0