クラスのPrivateメソッドもイミディエイトで実行できる

クラスのPrivateメソッドもイミディエイトで実行できる

再び超小ネタ。

クラスモジュールの準備

クラスモジュールを作る。

リスト1 クラスモジュール
'オブジェクト名は"HiddenBooks"'
Private Function isHiddenBook( _
                   ByVal targetBook As Workbook) As Boolean
  isHiddenBook = True
  If targetBook.IsAddin Then Exit Function
  Dim i As Long
  For i = 1 To targetBook.Windows.Count
    If targetBook.Windows(i).Visible Then _
      isHiddenBook = False: Exit Function
  Next
End Function

isHiddenBookというメソッドを1つ書いただけ。

PredeclaredIdをTrueにする

イミディエイトで実行することを考えて、PredeclaredIdTrueにする。

一旦、クラスモジュールHiddenBooksをエクスポートして、エディタで開く。

んで、上の方を

f:id:akashi_keirin:20180922124937j:plain

こんなふうにする(8行目です。)。

デフォルトでは、

Attribute VB_PredeclaredId = False

になっているので、「False」を「True」に書き換えて保存、再びインポートするだけ。

これで、インスタンス化しなくても[クラス名].[メソッド・プロパティ名]でメソッドやプロパティにアクセスできる。

実験

イミディエイト・ウインドウに

?HiddenBooks.isHiddenBook(Workbooks("PERSONAL.XLSB"))

と入力して[Enter]をぶっ叩くと、

f:id:akashi_keirin:20180922124947j:plain

このように、意図どおりの結果が出る。

「だから何?」と言われても、特に意見はありません。

ちなみに

クラス外から呼ぶのは

f:id:akashi_keirin:20180922130152j:plain

当然不可能ですw