VBAでビープ音(警告音)を鳴らす方法【Beep関数(API)】

VBAでマクロを作っている時に「この操作をされた時には警告音を鳴らしたいな」という場面に出くわすことはないでしょうか?
Windowsには標準機能としてビープ音(警告音)を鳴らす機能がありますが、ExcelをはじめとしたVBAではこの機能を呼び出すことができ、マクロ内で使用することができます。
という訳で今回はWindows APIを利用してビープ音(警告音)を鳴らす方法を解説していきます。
今回学ぶことのできる内容は以下のとおりです。
Windows APIについて
Beep関数の使い方
Beep関数を使ってビープ音(警告音)を流す方法
Beep関数とは
VBAでビープ音(警告音)を鳴らすにはWindows APIのBeep関数を使います。
Sleep 関数 (synchapi.h) – Win32 apps – Microsoft Learn
・Beep関数 : 指定した周波数の音を、指定した時間だけ鳴らす
周波数はヘルツ単位で37(0x25)から32,767(0x7FFF)までの値を指定し、時間はミリ秒単位で指定します。(※1000ミリ秒=1秒)
Windowsのシステム音の音量が小さかったり消音になっていると鳴らしても聞こえないため注意が必要です。ビープ音が鳴らない場合は、音量ミキサーを開き[システム音]を確認しましょう。
ほとんどの場合、システム音のみが小さかったり消音になっているはずです。
Windows APIとは
このBeep関数はWindows APIで用意されているものでVBAとは別のものです。Windows APIとは簡単にいえばWindowsに用意されている機能がまとまっているセットのようなものです。
Windows APIにはBeep関数以外にも様々な関数があり、VBA上でそれらを呼び出すことで、Windowsに用意されている様々な機能を使用することができます。(たとえばマウスを操作したり、指定した秒数だけ処理を止めることができます)
ちなみに名前からわかると思いますが、Windows APIではWindowsの機能を呼び出しているだけので基本的にはWindows以外のOSでは使用することはできません。
Beep関数の使い方
Beep関数を使うにははじめに「Windous APIの関数を使うよ」と宣言する必要があります。
※宣言をしないと各関数は使えずエラーになるので書き忘れに注意しましょう。
使用しているWindowsが32bitか64bitかによって宣言時に書く内容が変わってきます。
以下のどちらかをコードの一番初め(Option Explicitの次の行あたり)に書いておくことで、そのモジュール内で各関数を使うことができるようになります。
Declare PtrSafe Function Beep Lib “kernel32” _
(ByVal dwFreq As Long, ByVal dwDuration As Long) As Long
Declare Function Beep Lib “kernel32” _
(ByVal dwFreq As Long, ByVal dwDuration As Long) As Long
※操作環境のbitと構文があっていないとエラーになるので注意しましょう。
上記のどちらを書けばいいかわからない場合は以下のコードをコピペして、モジュールの最上部に書いておきましょう。
この構文を書いておくことで自動的に使うことのできる方の構文が使用されます。
VBE上では使えない方の構文が赤色で表示される場合がありますが、実行に影響はありません。
Beep関数の構文
Beep関数の構文は非常にシンプルで以下のように書きます。
Beep 音の周波数, 鳴らす時間
第一引数には「音の周波数」、第二引数には「鳴らす時間」を入力します。
音の周波数はヘルツ(Hz)、
鳴らす時間は1秒の1/1000である「ミリ秒」で指定します。
たとえば周波数が「262」(音階でいうド)を2秒鳴らすのであれば「Beep 262, 2000」というように入力します。もちろん秒だけでなく「Beep 262, 500」と書いて500ミリ秒(1秒の半分)だけ鳴らすこともできます。※代表的な音階の周波数はサンプルコードに記載しているのでそちらを参照下さい。
Beep関数サンプルコード
実際にVBAマクロとして使用する場合は以下のように書きます。以下のコードを実行すると、ビープ音の「ドレミファソラシド」が500ミリ秒(1秒の半分)間隔で順番に鳴ります。
まとめ
今回はWindows APIを使ってビープ音(警告音)を鳴らす方法についてでした。
ユーザーが誤った操作、意図しない操作をしたときの警告音などに使うと有効です。
Windowsには他にも多くのシステム音が存在していおり、それらは「wav」ファイルで存在します。
同APIの「mciSendString関数」を使うことで、指定した音楽ファイル(wav/mp3など)を流すこともできるので、ビープ音で物足りない場合はコチラの関数も利用してみて下さい。
また、サンプルコードでは音階を鳴らしてみましたが、実際にメロディーとして鳴らしたい場合は同APIのMIDI操作をするための関数(MIDI関数)の方が有効です。ビープ音はあくまでも警告音のため、ビープ音が鳴っている最中に他のシステム音を鳴らすことが出来ませんし、機械的な音しか出せないのでメロディーを作るのには向いていません。
MIDI関数を使用すれば、ピアノの音やバイオリンの音のように音色を変えられるだけでなく、音の強弱や和音(複数の音を同時にならすこと)を再現することができるので、VBAで曲を作ったり流したい場合はそちらの関数も参照してみて下さい。