ユーザー定義型を渡す

Microsoft Office 2000/Visual Basic プログラマーズ ガイド   

多くの DLL 関数では、あらかじめ定義された形式でデータ構造を渡す必要があります。VBA から DLL 関数を呼び出すときは、関数に対応するように定義したユーザー定義型を渡します。

ユーザー定義型を渡すタイミング、およびコードに含める必要のあるデータ型の定義は、関数の Declare ステートメントで確認することができます。通常、データ構造を必要とする引数は、"long ポインタ" として宣言されます。long ポインタは、32 ビットの数値で、メモリ内のデータ構造をポイントします。long ポインタで一般的に使用されているプリフィックスは "lp" です。また、引数のデータ型はデータ構造の名前になります。

次の GetLocalTime および SetLocalTime 関数の Declare ステートメントを参照してください。

  Private Declare Sub GetLocalTime Lib "kernel32" (lpSystem As SYSTEMTIME)
Private Declare Function SetLocalTime Lib "kernel32" (lpSystem As SYSTEMTIME) As Long

いずれの関数も、日付と時刻情報が含まれるデータ構造の SYSTEMTIME 型の引数を取得します。次は、SYSTEMTIME 型の定義です。

  Private Type SYSTEMTIME
      wYear          As Integer
      wMonth         As Integer
      wDayOfWeek     As Integer
      wDay           As Integer
      wHour          As Integer
      wMinute        As Integer
      wSecond        As Integer
      wMilliseconds  As Integer
End Type

データ構造を関数に渡すには、次の例のように、SYSTEMTIME 型の変数を宣言する必要があります。

  Private sysLocalTime As SYSTEMTIME

GetLocalTime 関数を呼び出すとき、関数に SYSTEMTIME 型の変数を渡すと、データ構造にはローカルの現在の年、日、曜日、時間、分、秒、およびミリ秒を表す数値が入力されます。次の例は、GetLocalTime を呼び出して現在の時間を示す値を返す Property Get プロシージャです。

  Public Property Get Hour() As Integer
   ' 現在の時刻を取得し、時間を返します。

   GetLocalTime sysLocalTime
   Hour = sysLocalTime.wHour
End Property

SetLocalTime を呼び出す際も SYSTEMTIME 型の変数を渡しますが、まず、データ構造の 1 つまたは複数の要素の値を渡します。たとえば、次の Property Let プロシージャは、ローカル システム時刻の時間値を設定します。まず、Property Let プロシージャは、GetLocalTime を呼び出して、ローカル時刻の現在の値をデータ構造である sysSystem 内に取得します。次に、データ構造の要素である sysLocalTime.wHour の値を、Property プロシージャに渡された引数値に更新します。最後に、GetLocalTime で取得した値に新しい時間値を加算した値を含む SetLocalTime を呼び出し、同じデータ構造に渡します。

  Public Property Let Hour(intHour As Integer)
   ' すべての値を最新にするために現在の時刻を取得し、
   ' ローカル時刻の時間を設定します。
   
   GetLocalTime sysLocalTime
   sysLocalTime.wHour = intHour
   SetLocalTime sysLocalTime
End Property

Hour プロパティ プロシージャは、Office 2000 Developer CD-ROM の ODETools\V9\Samples\OPG\Samples\CH10 に含まれる System.xls の System クラス モジュールにあります。

メモ   GetLocalTime および SetLocalTime 関数は、GetSystemTime および SetSystemTime 関数に似ています。主な相違点は、GetSystemTime 関数と SetSystemTime 関数では、グリニッジ標準時の時刻を使用する点です。たとえば、アメリカの西海岸でローカル時刻が午前 0:00 のとき、グリニッジ標準時では午前 8:00 で、8 時間の時差があります。GetSystemTime 関数は、現在時刻として午前 8:00 を返しますが、GetLocalTime 関数は午前 0:00 を返します。

クラス モジュールにおける Property プロシージャの作成については、第 9 章「カスタム クラスとオブジェクト」を参照してください。