| 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)
エラー メッセージを作成するには、乱数長整数型が含まれるプロシージャを呼び出します。