はじめに
オブジェクト指向プログラミング (OOP) を使用する利点の 1 つは、コードの再利用性です。 これを行う一般的な方法は、Set 変数 = New ClassName 構文を使用して、既に定義されているクラスのオブジェクトをインスタンス化することです。 VBA プログラマは、アプリケーション プラットフォーム内の任意のオブジェクトを使用するたびに、このようなオブジェクトを使用します。 たとえば、Excel の Workbook オブジェクト、PowerPoint の Presentation オブジェクト、Word の Document オブジェクトなどがあります。 さらに、VBA プログラマは、特殊な種類のクラスに属するオブジェクトであるユーザーフォームを使用します。 これらのオブジェクトはすべて、VBA 開発者のプロジェクトの外部にあるライブラリで定義されます。 [ツール] |をクリックします参照。。。 メニュー項目を使用して、Visual Basic Editor (VBE) が開発者に代わって自動的に確立する外部ライブラリの一覧を表示します。
このヒントでは、Microsoft によって作成された外部ライブラリ内のカスタム クラスにアクセスする方法について説明します。 次に使用する例は Excel 2003 に基づいていますが、ヒントは VBA をサポートし、バージョン 2000 以降に適用される他の MS Office 製品に適用されます。
これは中間レベルと高度なレベルのヒントであり、VB(A) プログラミングで特定の快適性レベルを想定しています。
ある VBA プロジェクトが別の VBA プロジェクトのクラス モジュールで宣言されているオブジェクトにアクセスするには、2 つの異なるセットアップ手順が必要です。 最初のセットは、クラス モジュールが宣言されているプロジェクトの外部で使用できるようにし、オブジェクトをインスタンス化する手段を提供します。 2 番目のセットは、クライアント プロジェクトがこのクラスを使用する方法を扱います。
クラス定義を含むプロジェクトを設定する
既定では、クラス モジュールには Instancing プロパティが Private に設定されています。 つまり、クラスの定義を含むプロジェクトのみが、そのクラスのオブジェクトをインスタンス化できます。 VBA がサポートする唯一の選択肢は Public であり、作成できません。 つまり、外部プロジェクトではこのクラスのオブジェクトを使用できますが、インスタンス化することはできません。 奇妙に思われるかもしれませんが、そうなります。 プロパティを既定値から変更する方法は、VBE プロジェクト エクスプローラーでクラス モジュールを選択し、目的のクラス モジュールを選択し、プロパティ ウィンドウにアクセス (必要に応じて F4 を使用して表示)、 インスタンス化プロパティを2-PublicNotCreatable に変更することです。
このヒントの例に従うには、クラス モジュールを作成し、 clsEmployee という名前を付けて、その Instancing プロパティを変更し、次のコードを追加します。
Option Explicit
Dim sName As String
Property Get Name() As String
Name = sName
End Property
Property Let Name(uName As String)
sName = uName
End Property
次に、クラスのインスタンス化プロパティが PublicNotCreatable であるため、プロジェクトはクライアントがオブジェクトをインスタンス化する方法を提供する必要があります。 標準モジュールに新しい関数を追加します。
Option Explicit
Public Function New_clsEmployee() As clsEmployee
Set New_clsEmployee = New clsEmployee
End Function
ここで、clsEmployee は目的のクラスの名前です。 また、これはプライベート モジュールにしないでください。
1 つの最終的な変更により、ライフが少し簡単になります。 プロジェクトの名前を既定の VBAProject から ClassProvider に変更します。 これを行うには、VBE プロジェクト エクスプローラーでプロジェクトを選択し、[ツール] |VBAProject プロパティ... |[全般] タブ| [プロジェクト名] フィールドに 「ClassProvider」と入力します。
たとえば、このファイルを クラス Provider.xlsとして保存します。
次に、クライアント プロジェクトに移動します。
エクスポートされたクラスを使用するプロジェクトを設定する
クライアント プロジェクトでは、他の外部ライブラリ (ユーザーフォームなど) で定義されているクラスと同じように、1 つのキーの違いを持つクラスが非常に多く使用されます。 そのクラスのオブジェクトをインスタンス化できないため、上記で宣言したNew_clsEmployee() 関数を使用する必要があります。 他の外部ライブラリと同様に、早期バインディングと遅延バインディングのどちらを使用するかを決定します。 次のコードは両方を示しています。 早期バインディング コードを使用するには、クライアント プロジェクトに参照を含める必要があります (ツール |References...) をクラス Provider.xls ファイルに格納します。
Option Explicit
Sub UseExportedClass_EarlyBinding()
Dim anEmployee As ClassProvider.clsEmployee
Set anEmployee = ClassProvider.New_clsEmployee
anEmployee.Name = "Tushar Mehta"
MsgBox anEmployee.Name
End Sub
Sub UseExportedClass_LateBinding()
Dim anEmployee As Object
Set anEmployee = Application.Run("'g:\temp\class provider.xls'!new_clsEmployee")
anEmployee.Name = "Tushar Mehta"
MsgBox anEmployee.Name
End Sub
最後のメモ
外部ライブラリは、通常は保存されるファイルである必要はありません。 アプリケーション固有のアドイン (サフィックス .xla または .ppa で保存されたファイルなど) に含めることができます。 このようなアドインは、通常のファイル |を介して開かないことを忘れないでください。開く。。。 メソッドが読み込まれますが、ツール |アドイン... コマンド。