Excel VBAでのクラスモジュール、標準モジュールのスコープまとめ(Friend, PublicNotCreatableなど)

More than 3 years have passed since last update.


まえがき

自ブック(プロジェクト内)でコードを書く分にはあまり意識することはありませんが、下請けクラスやモジュールをぱんぱんに詰め込んだExcel VBAアプリケーションをブックごと「はいどうぞ」と提供するのは、なんとなく、ユーザに変なところまで覗き見られる気持ち悪さがあるものです。

できれば、ユーザには直接利用できるファンクションだけ公開しておいて、その他の処理は隠したい。そういう時、機能ごとにアドイン分割+参照設定などを行います。


いきなりまとめ

下の表は、Private, Publicなどのスコープによって参照可否がどのようにコントロールされるかをまとめたものです。

無題.png


標準モジュール

標準モジュールのPublicメソッドは、クラスからでも他プロジェクトからでも、あらゆるところから無制限に見えます。


クラスモジュール

クラスモジュールの場合、Instancingプロパティによって他プロジェクト(参照元)からの参照可否をコントロールできます。


  • Privateにすると参照元からクラスを利用することはできません。

  • PublicNotCreatableにすると、参照元からクラスを利用することができますが、インスタンスの生成は参照先でやる必要があります。(つまり、参照先にcreateメソッドなんかを作っておいて、生成させたインスタンスを戻り値で受ける必要がある)

クラス変数を直接ユーザーから見える場所に晒したくなければクラスモジュールはPrivateにしてしまい、処理のインタフェースとしてPublicなFunctionを用意しておく、といったやり方がありそうです。特にユーザーがサブクラスを使ってカスタマイズする可能性のあるツールなんかはPublicなFunctionをバチっと整備しておいて、その枠内でやってもらい、クラス変数は隠してしまった方がよさそうです。