はじめに
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で実現できることの幅が劇的に広がります。最初は難しく感じるかもしれませんが、まずは簡単な関数を呼び出すことから始めて、その強力な機能を体験してみてください。
