私が読んだことから(BoveyなどによるProfessional Excel Development、および他のソースで)、これに対する標準のVBAソリューションは、1)クラスモジュールを使用して、関数をリストするインターフェイスを定義することです(プロパティ、サブなど) 公開します。2) フォーム モジュールに「Implements」ステートメントを配置し、インターフェイスで宣言されたパブリック ルーチンによってアクセスされるコードを追加します。3) 次に、アプリケーションで、フォーム自体ではなくインターフェースを使用します。
したがって、たとえば iProgressBar という名前のクラス モジュールで、公開したいものをリストします。
Public Property Let Information(ByVal sNew As String)
End Property
Public Property Get Information() As String
End Property
Public Sub UpdateProgress(ByVal dNew As Double)
End Sub
'etc...
それがあなたのインターフェースです。次に、frmProgressBar モジュールの上部に、
Implements iProgressBar
そのステートメントを作成したら、コード ウィンドウの上部にあるドロップダウンを見てください。左のドロップダウンから iProgressBar を選択します。次に、右側のドロップダウンからパブリック要素の 1 つを選択すると、コード ブロック (以下のような) が挿入されます。このブロックでは、プログレス バーの各パブリック要素が何をするかを指定します。
Private Property Let iProgressBar_Information(ByVal str As String)
Me.lblInformation.Caption = str
'Refresh the form
Me.Repaint
End Property
Private Sub iProgressBar_UpdateProgress(ByVal dNew As Double)
'Code to update progress on the form
End Property
次に、アプリケーションにプログレス バーが必要な場合は、変数をクラス インターフェイスとして宣言しますが、フォームのインスタンスをその変数に割り当てます。
Sub Test()
Dim MyProgressBar As iProgressBar
Set MyProgressBar = New frmProgressBar
'More code
'This will work MyProgressBar was dim'ed as iProgressBar, which has an Information property
MyProgressBar.Information = "Running ..."
'This will not work because iProgressBar has no lbl...
MyProgressBar.lblInformation.Caption = "Running ..."
'More code
End Sub
ここでの唯一の制限は、誰かがプロジェクトに参加して、インターフェースではなく直接フォームを使い始めることができるということです。ここでやりたいことを人々に強制する簡単なVBAのみの方法はないと思います。これは、コラボレーションを容易にし、エラーを回避するための VBA の "ベスト プラクティス" にすぎません。(ライブラリをコンパイルする場合、必要な動作を強制するのはおそらく簡単ですが、それでは VBA の外に出てしまいます)。
編集:
実際、あなたが望む行動を強制するためにあなたが取ることができる別のステップがあると思います. TypeOf... Is... 式を使用して、フォームが勝手に開かないようにすることができます。UserForm_Initialize ルーチン内に、次のバージョンを配置します。
If Not TypeOf Me Is iProgressBar Then
'Clever code that will cause initialization to fail.
End If