次の方法で共有


DLL 関数の呼び出し後のエラー情報を取得する

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

DLL 関数で発生する実行時エラーは、VBA で発生する実行エラーとは異なり、エラー メッセージ ボックスが表示されません。実行時エラーが発生すると、DLL 関数はエラー発生を通知する値を返しますが、エラーの発生が原因で VBA コードの実行が中止されることはありません。

Windows API のいくつかの関数では、実行時エラーのエラー情報が保管されます。C/C++ プログラミングを行う場合、GetLastError 関数を使用して、最後に発生したエラーの情報を取得することが可能です。ただし、VBA では、GetLastError 関数は不正確な結果を返す可能性があります。VBA で DLL エラーの情報を取得するには、VBA の Err オブジェクトの LastDLLError プロパティを使用します。LastDLLError プロパティは発生したエラー数を返します。

メモ   LastDLLError プロパティを使用するには、各エラーに対応するエラー番号を確認する必要があります。この情報は、Win32API.txt ファイルには含まれていませんが、Microsoft Developer Network の Web サイト (https://www.microsoft.com/japan/developer/) にある Microsoft Platform SDK から無償で入手できます。

次の例では、Windows API の関数を呼び出した後で、LastDLLError プロパティを使用する方法を示しています。PrintWindowCoordinates プロシージャはウィンドウのハンドルを取得し、GetWindowRect 関数を呼び出します。GetWindowRect は、ウィンドウの長方形の高さを RECT データ構造に入力します。無効なハンドルを渡すとエラーが発生し、そのエラー番号は LastDLLError プロパティを使用して確認することができます。

  Declare Function GetWindowRect Lib "user32" (ByVal hwnd As Long, _
               lpRect As RECT) As Long

Type RECT
      Left As Long
      Top  As Long
      Right  As Long
      Bottom As Long
End Type

Const ERROR_INVALID_WINDOW_HANDLE   As Long = 1400
Const ERROR_INVALID_WINDOW_HANDLE_DESCR As String = "無効なウィンドウ ハンドル"

Sub PrintWindowCoordinates(hwnd As Long)
   ' ウィンドウの左右上下の位置をピクセル単位で表示します。
   
   Dim rectWindow As RECT
   
   ' ウィンドウ ハンドルを渡し、データ構造を空にします。
   ' 関数が 0 を返すと、エラーが発生します。
   If GetWindowRect(hwnd, rectWindow) = 0 Then
      ' LastDLLError を確認し、無効なハンドルが渡されて
      ' エラーが発生した場合は、ダイアログ ボックスを表示します。
      If Err.LastDllError = ERROR_INVALID_WINDOW_HANDLE Then
         MsgBox ERROR_INVALID_WINDOW_HANDLE_DESCR, _
            Title:="エラー!"
      End If
   Else
      Debug.Print rectWindow.Bottom
      Debug.Print rectWindow.Left
      Debug.Print rectWindow.Right
      Debug.Print rectWindow.Top
   End If
End Sub

PrintWindowCoordinates プロシージャは、Office 2000 Developer CD-ROM の ODETools\V9\Samples\OPG\Samples\CH10 サブフォルダに含まれる MiscAPIFunctions.xls の modWindowCoordinates モジュールにあります。

アクティブ ウィンドウの座標を取得するには、GetActiveWindow 関数を使用してアクティブ ウィンドウのハンドルを返し、その結果を上の例で定義されたプロシージャに渡します。GetActiveWindow を使用するには、次の Declare ステートメントを含めます。

  Declare Function GetActiveWindow Lib "user32" () As Long

[イメディエイト] ウィンドウに、次の行を入力します。

  ? PrintWindowCoordinates(GetActiveWindow)

エラー メッセージを作成するには、乱数長整数型が含まれるプロシージャを呼び出します。