【VBA】Windows APIの使い方入門!Declareステートメントの書き方を徹底解説

目次

はじめに

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

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

私が勉強したこと、実践したこと、してることを書いているブログです。
主に資産運用について書いていたのですが、
最近はプログラミングに興味があるので、今はそればっかりです。

目次