ゆんの業務改善ブログ

①生産性向上 ②業務改善 ③自動化 について情報発信しています。VBAプログラムは本当の初心者から他のアプリケーションを呼び出して使う上級者的な使い方まで幅広いレベルで解説していきます。

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

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

目次

Windows APIを使う

APIとは何か~OLEとの違い~

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 Learnより引用)

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

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