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