はじめに
VBAは非常に高機能な言語ですが、時には「PCのスピーカーから音を鳴らしたい」「特定ウィンドウの情報を取得したい」といった、Excelの標準機能だけでは実現できない、よりOSに近いレベルの操作が必要になることがあります。
このような高度な機能を実現するために、VBAからWindows API (Application Programming Interface) を呼び出すことができます。Windows APIは、Windows OS自身が外部のプログラム(VBAなど)に提供している、OSの機能を利用するための膨大な関数の集まりです。
このAPI関数をVBAで利用可能にするための「架け橋」となるのが Declare
ステートメントです。この記事では、Declare
ステートメントの基本的な構文と、それを使って簡単なAPI関数を呼び出す方法を解説します。
Declare
ステートメントの基本構文とサンプルコード
ここでは、PCの内部スピーカーからビープ音を鳴らす、kernel32.dll
に含まれる Beep
というAPI関数を例に解説します。
Declare
ステートメントは、モジュールの最上部(Sub
などのプロシージャよりも前)に記述する必要があります。
完成コード
'--- モジュールの最上部にAPI関数を宣言 ---
' 64bit/32bit両対応のDeclareステートメント
#If VBA7 Then
' Beep関数をVBA内で "SystemBeep" という名前で使えるように宣言
Declare PtrSafe Function SystemBeep Lib "kernel32" ( _
ByVal dwFreq As Long, _
ByVal dwDuration As Long _
) As Boolean
#Else
Declare Function SystemBeep Lib "kernel32" ( _
ByVal dwFreq As Long, _
ByVal dwDuration As Long _
) As Boolean
#End If
' 宣言したAPI関数を呼び出すマクロ
Sub PlayBeepSound()
' 周波数 523Hz (ドの音) を、300ミリ秒間鳴らす
Call SystemBeep(523, 300)
End Sub
Declare
ステートメントの解説
Declare PtrSafe Function SystemBeep Lib "kernel32" (ByVal dwFreq As Long, ByVal dwDuration As Long) As Boolean
この一行を、各要素に分解して見ていきましょう。
Declare
: これから外部の関数を宣言することを示します。PtrSafe
: 64bit版のOffice環境で、この宣言が安全であることを示すキーワードです。#If VBA7 Then ...
という条件付きコンパイルと組み合わせることで、古い32bit版Excelとの互換性を保ちます。現代のExcel VBAでは、必須のおまじないと考えてください。Function
: 呼び出すAPIが値を返す場合はFunction
、返さない場合はSub
を指定します。SystemBeep
: VBAのコード内で、このAPI関数を呼び出す際に使う名前です。元の関数名(Beep
)と違う名前を自由に付けられます(Alias
句を使わない場合)。Lib "kernel32"
: その関数が、どのライブラリファイル(DLL)に含まれているかを指定します。kernel32.dll
は、メモリ管理やプロセス制御など、Windowsの根幹をなす機能が集められた、最も基本的なライブラリの一つです。( ... )
: API関数が受け取る引数を定義します。ByVal
: 引数を「値渡し」で渡すことを示します。APIの引数は、ほとんどの場合ByVal
を使います。dwFreq As Long
: 引数名とそのデータ型を定義します。APIのドキュメント(MSDNなど)を見て、正しいデータ型を指定する必要があります。
As Boolean
: API関数が返す値のデータ型を指定します。
まとめ
今回は、VBAからWindows APIを呼び出すための Declare
ステートメントの基本を解説しました。
Declare
ステートメントは、VBAに外部の関数を認識させるための宣言文。PtrSafe
は、64bit版Officeとの互換性のために必須。Lib
で、関数が含まれるDLLファイルを指定する。- 引数や戻り値のデータ型を正確に定義することが非常に重要。
Windows APIを使いこなせば、VBAで実現できることの幅が劇的に広がります。最初は難しく感じるかもしれませんが、まずは簡単な関数を呼び出すことから始めて、その強力な機能を体験してみてください。