VBAのDeclareで外部のWindows API関数を呼び出す方法をわかりやすく解説

スポンサーリンク
スポンサーリンク

Declareの概要

外部のWindows API関数を呼び出す VBAの予約語

Declare

概要 Declare ステートメントは、VBAでWindows APIなどの外部ライブラリ関数を使用するために宣言するためのキーワードです。これを使うことで、VBAからOSの機能を直接利用することができます。

わかりやすく説明 VBAからWindowsの機能を使うために、外部関数を宣言する命令。

  • Windows APIなどの外部関数をVBAで使用できるようにする。
  • DLL(動的リンクライブラリ)内の関数を呼び出せる。
  • Excel VBAで高度な機能(ファイル操作・画面制御など)を実装できる。

Declareの基本的な使い方

以下の例では、Windows APIの GetTickCount 関数をVBAから呼び出します。

Declare PtrSafe Function GetTickCount Lib "kernel32" () As Long

Sub ShowTickCount()
    MsgBox "システム起動からのミリ秒: " & GetTickCount()
End Sub

解説:

  • Declare PtrSafe Function: 64ビット環境に対応した外部関数の宣言。
  • Lib "kernel32": Windowsの kernel32.dll 内の関数を使用。
  • GetTickCount: システムが起動してからのミリ秒を取得。

64ビット環境対応のDeclare

VBAでWindows APIを使う場合、32ビット版と64ビット版の違いに対応するために PtrSafe を追加する必要があります。

#If VBA7 Then
    Declare PtrSafe Function GetTickCount Lib "kernel32" () As Long
#Else
    Declare Function GetTickCount Lib "kernel32" () As Long
#End If

解説:

  • #If VBA7 Then: VBA7(Office 2010以降)ならPtrSafeを使う。
  • #Else: VBA6(古い環境)では通常のDeclareを使う。

Windows APIを使ったメッセージボックスのカスタマイズ

Windows APIの MessageBox 関数を使って、カスタマイズされたメッセージボックスを表示できます。

Declare PtrSafe Function MessageBox Lib "user32" Alias "MessageBoxA" ( _
    ByVal hWnd As Long, ByVal lpText As String, ByVal lpCaption As String, ByVal uType As Long) As Long

Sub CustomMessageBox()
    Dim result As Long
    result = MessageBox(0, "カスタムメッセージボックス", "タイトル", 1)
    
    If result = 1 Then
        MsgBox "OK が押されました"
    End If
End Sub

解説:

  • MessageBox: Windows標準のメッセージボックスを表示。
  • Alias "MessageBoxA": ANSI版のAPI関数を指定。
  • uType = 1: OKボタンとキャンセルボタンを表示。

Excel VBAでのDeclareの活用

Excelのウィンドウを最前面にするWindows APIの利用例です。

Declare PtrSafe Function SetForegroundWindow Lib "user32" (ByVal hWnd As Long) As Long
Declare PtrSafe Function FindWindow Lib "user32" Alias "FindWindowA" ( _
    ByVal lpClassName As String, ByVal lpWindowName As String) As Long

Sub BringExcelToFront()
    Dim hWnd As Long
    hWnd = FindWindow("XLMAIN", Application.Caption)
    If hWnd <> 0 Then
        SetForegroundWindow hWnd
    End If
End Sub

解説:

  • FindWindow: Excelウィンドウのハンドルを取得。
  • SetForegroundWindow: Excelを最前面に表示。

Declareの制限と注意点

  • 64ビット環境ではPtrSafeが必須: 32ビット環境のVBAと互換性を持たせるために対応が必要。
  • 間違ったAPIの呼び出しはクラッシュの原因: APIを誤って使用するとVBAが強制終了することがある。
  • Windows APIの仕様変更に注意: OSのバージョンによっては使用できないAPIがある。

よくある質問

Q: Declare でエラーが出るのはなぜですか?
A: 64ビット環境では PtrSafe を追加する必要があります。
Q: Declare で呼び出す関数の一覧はどこで確認できますか?
A: Microsoftの公式ドキュメントや win32api.txt などのリファレンスを参照してください。
Q: Declare は何のために使うのですか?
A: VBA単体ではできない高度な機能(ウィンドウ操作・ファイル管理など)を実行するために使います。

まとめ

  • Declare ステートメントは、VBAから外部のWindows APIを利用するために使う。
  • PtrSafe を付けることで、64ビット環境でも動作するようになる。
  • Windows APIを活用すると、VBAでは実現できない機能を実装可能。
  • 誤ったAPIの使い方をするとVBAがクラッシュする可能性があるため注意が必要。