怠日記

写真・金魚・昆虫・プログラミングの趣味を語るサイトです。似たようなことをnoteにも書いたり書いてなかったり。

VBAからWin32 APIを利用する | Declareステートメント

Win32 API は Windows が提供する API のこと。
Win32 API を利用することで、VBA の機能だけでは実現できない、Windows の機能やリソースに直接アクセスするといった処理ができるようになる。

利用方法

VBA から Win32 API を利用するためには、モジュールの宣言セクションで API を宣言する。
API の宣言には Declare ステートメントを使う。

'値を返さない場合
Declare PtrSafe Sub 〈関数名〉 Lib "〈DLL名〉" ([引数リスト])

'値を返す場合
Declare PtrSafe Function 〈関数名〉 Lib "〈DLL名〉" ([引数リスト]) As 〈戻り値のデータ型〉
  • DLL名: 関数が含まれている DLL の名前(拡張子は入力不要)
  • 引数リスト: 関数に渡す引数を指定

たとえば User32.dll にある MessageBoxA 関数を宣言するときは次のようになる。

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

関数を呼び出すときは、次のように書く。

MessageBoxA 0, "Hello, World!", "テスト", 0

異なる名前で呼び出せるようにするときは Alias を使って定義する。

Declare PtrSafe Sub 〈別名〉 Lib "〈DLL名〉" Alias "〈本来の関数名〉" ([引数リスト])

たとえば MessageBoxA 関数を MessageBox で呼び出せるようにするには、次のように宣言する。

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

関数を呼び出すときは、次のように書く。

MessageBox 0, "Hello, World!", "テスト", 0

サンプルコード

次のコードは、VBA から Win32 API の MessageBoxA 関数を呼び出すプログラムの全文である。

標準モジュールを新しく作り、コードをそのまま貼り付ければ動かせる。

Option Explicit

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

Sub Main()

    MessageBoxA 0, "Hello World!", "テスト", 0

End Sub

↓ 実行すると、メッセージボックスが表示される