DLL 関数をラップする
Microsoft Office 2000/Visual Basic プログラマーズ ガイド |
DLL 関数を頻繁に呼び出す場合、クラス モジュールに複数の関数をカプセル化してその処理を簡易化することができます。1 つまたは複数の DLL 関数を呼び出すプロパティまたはメソッドを作成すると、VBA で一般的なオブジェクト指向の方法で DLL 関数を使用できます。DLL 関数の宣言および呼び出しは複雑でエラーが発生しやすい作業であるため、DLL 関数への呼び出しを一括して再利用可能なオブジェクトにまとめることにより、API を呼び出すたびにこの作業を繰り返すことがなくなります。
DLL 関数の呼び出しをクラス モジュールにカプセル化する際、これらの関数に対する VBA インターフェイスが定義されます。この過程は、関数を "ラップする" と呼ばれます。関数自体は変更されませんが、関数を呼び出す方法が簡略化されます。DLL 関数をラップする作業は追加の手順になりますが、関数を繰り返し呼び出す場合は、結果的には有効な作業であると言えます。
DLL 関数をラップする簡単なクラスについては、Office 2000 Developer CD-ROM の ODETools\V9\Samples\OPG\Samples\CH10 サブフォルダに含まれる System.xls の System クラス モジュールを参照してください。このクラスは、この章で説明されている GetLocalTime、SetLocalTime、および GetTempPath などのいくつかの関数をラップします。System クラスの新しいインスタンスを作成し、結果のオブジェクトを使用してシステムに関する情報を設定または取得することができます。
Year、Month、Day、Hour、Minute、および Second プロパティの Property Get プロシージャは GetLocalTime 関数を呼び出します。GetLocalTime 関数は、ローカル時刻の現在の各値を SYSTEMTIME データ構造に返します。Property Get プロシージャによって現在値が返されることを確実にするために、Property Get プロシージャが実行されるたびに GetLocalTime が呼び出されます。
また、各プロパティの Property Let プロシージャは、GetLocalTime を呼び出してデータ構造に現在値を入力します。続いて、プロシージャは、データ構造の適切な要素を更新し、データ構造全体を SetLocalTime に渡してローカル システム時刻を変更します。
Hour プロパティの Property Get および Property Let プロシージャは、この章の「ユーザー定義型を渡す」で示されています。
DLL 関数に対してオブジェクト指向のインターフェイスを作成したら、ラッパー クラスの新しいインスタンスを作成し、そのプロパティおよびメソッドを使用できます。次の例は、System オブジェクトの Hour、Minute、および Second プロパティを使用してダイアログ ボックスにローカル システム時刻を表示します。
Sub DisplayLocalSystem()
Dim sysLocal As System
Dim strMsg As String
Dim dteTime As Date
' System クラスの新しいインスタンスを作成します。
Set sysLocal = New System
With sysLocal
' System オブジェクトの Hour、Minute、および
' Second プロパティを使用して日付値を返します。
dteTime = TimeSerial(.Hour, .Minute, .Second)
strMsg = "現在のローカル システム時刻 : " _
& CStr(dteTime)
MsgBox strMsg
End With
End Sub
このプロシージャは、Office 2000 Developer CD-ROM の ODETools\V9\Samples\OPG\Samples\CH10 サブフォルダにある modDisplaySystem モジュールにあります。
System クラスを拡張してほかのシステムに関連するプロパティおよびメソッドを含めることができます。たとえば、異なる定数で GetSystemMetrics 関数を呼び出す追加のプロパティを加える場合などがあります。
カスタム オブジェクトを作成する際の詳細については、第 9 章「カスタム クラスとオブジェクト」を参照してください。