Mutable_Yunの業務改善ブログ

VBA勉強中の非エンジニア会社員向けのブログです。業務改善についても触れています。

VBA Windows APIを使う手順(調べる→宣言する→使う)

VBAでWindows APIを使う方法を解説します。今回はWindowsの機能を使って音を鳴らします。

目次

APIとは何か

APIとはApplication Programming Interfaceの略で、他のアプリケーションの機能のことです。 VBA OLEを使ってメールを配信するでOLEという技術をつかってOutlookのクラスを参照してメールを送信する方法を解説しました。APIは他のアプリの機能を使う点で似ています。違うのはOLEは他のアプリのクラス(オブジェクト)を借りてくるのに対して、APIは機能(SubプロシジャやFunctionプロシジャ)を借りてくるところです。

VBAのオブジェクト指向ではメソッドはオブジェクトに含まれているSubプロシジャやFunctionプロシジャです。SubプロシジャやFunctionプロシジャは機能を提供していますよね。このようにひとまとまりの機能を借りてくるのがAPIです。他のアプリで使われているプロシジャを借ります。

APIを使う手順

VBAでAPIを使うための説明に移ります。基本的な流れは下記の通りです。

  1. 使いたい機能のAPIを調べる
  2. 調べた結果分かったライブラリを使う宣言を行う
  3. ライブラリに含まれた関数を使う

OLEの場合は、オブジェクトを生成する必要がありました。一方、APIの場合は機能を借りてくるのでオブジェクトを生成するという手順はありません。その代わり使う機能が含まれているライブラリを「使います」と宣言する必要があります。

上記の手順について順に説明します。

使いたい機能のAPIを調べる

APIはVBAの機能ではない為、関数名を覚えていません。そのため調べる技術が必要です。調べる方法さえ分かればあとは使うだけです。調べるところが一番大変です。

実際に調べる

今回はWindowsが持っている音を鳴らす機能を借りる事を考えます。リンク先をクリックしてVBAで使える Windows APIの一覧をテキストデータでダウンロードします。

Download Office 2010 Help Files: Win32API_PtrSafe with 64-bit Support from Official Microsoft Download Center

今回は使い方の流れを学ぶことが目的なので、比較的簡単なBeepを調べてみます。音を鳴らす機能です。
Ctrl+FでBeepを検索すると、下記にあたりました。

Declare PtrSafe Function Beep Lib "kernel32" _
    (ByVal dwFreq As Long, ByVal dwDuration As Long) As Long

ダウンロードした「Declare statements」では一行で書かれています。ここで2行にしたのは単に途中で折れ曲がると見にくいためです。

調べた結果分かったライブラリを使う宣言を行う

宣言するといってもこのままコピペすればOKです。私はプログラミングの勉強でコピペするべきでない、という考えですが、このAPIの宣言はコピペしてOKです。覚える必要ないためです。宣言する部分がどのようになっているのか見てみます。

Declareステートメント

一単語目のDeclareをマイクロソフトの公式ドキュメントで調べると、下記の記述がありました。

ダイナミックリンクライブラリ(DLL) 内の外部プロシージャへの参照を宣言するために、モジュールレベルで使用します。
Declare ステートメント (VBA) | Microsoft Docsより引用)

DLLというのがライブラリです。ライブラリは機能の集まりで、その機能がプロシージャと呼ばれるものです。つまり、Declareはお目当ての機能が入っているライブラリを参照する宣言をしている、ということです。

PtrSafeキーワード

PtrSafeキーワードは32ビット版でも64ビット版でも使うことができるようにするためのおまじないです。正確な解説は上記引用部分のURLをご参照ください。(Ctrlを押しながら左クリックで別タブで開くことができます。)

具体的な宣言の方法

宣言セクションで宣言します。宣言セクションは一番上のプロシジャよりさらに上の部分です。変数の宣言を強制している方は、Option Explicitの下に書くとよいです。

Option Explicit

Declare PtrSafe Function Beep Lib "kernel32" _
    (ByVal dwFreq As Long, ByVal dwDuration As Long) As Long
    
Sub APIを使うプロシジャ()
  'ここにAPIを使うプロシジャを書く
End Sub

ライブラリに含まれた関数を使う

それでは実際に使ってみましょう。機能(SubプロシジャやFunction)を呼び出せばいいのでCallステートメントで呼び出して使います。Beepは音を鳴らす関数なので、音の高さと音の長さを指定します。引数のところにdwFreqとかいてあり、Freqは振動数を表すFrequency、Durationは継続の意味なので、そこに数値を指定します。dwDurationの単位はミリ秒です。ラ(440Hz)の音を1秒(1000ミリ秒)流してみます。

Option Explicit

Declare PtrSafe Function Beep Lib "kernel32" _
    (ByVal dwFreq As Long, ByVal dwDuration As Long) As Long
    
Sub APIを使うプロシジャ()
  Call Beep(440, 1000)
End Sub

聴力検査のような音が出れば成功です。音の高さと長さが設定できれば、曲をエクセルから流すこともできますね!?

まとめ

まとめます。

  • 手順は調べる⇒宣言する⇒使うの3ステップ
  • 一番難しいのは調べるところ。宣言はコピペするだけ。使うのは呼び出すだけ

まずはVBA向け公式のAPI一覧をダウンロードしてみましょう!
再掲:VBA向け公式のAPI一覧のダウンロード先