作りながら学ぶ!エクセルVBAマクロ超入門(2) 音を奏でるExcelマクロ(抽選器マシーンシリーズ機能追加①)
Excel VBAマクロの基本構文がひと通り入っていて、超入門レベルの初心者の方々におススメの「抽選器マシーン」マクロを前回紹介しました。
やってみるとさらにやってみたいことがどんどん出てくるということで紹介した「当選確定したときにファンファーレを鳴らせないか?」。これを今回のテーマとして取り上げ、機能を追加することにしました。
例によって実際に作業している様子をYouTube動画として公開しましたので、最後に紹介しますが、音を奏でるExcelマクロはこのブログでは取り上げたことがないので、補足も含めて、あらためて説明したいと思います。
スポンサーリンク
音声ファイルを再生するPlaySound関数
音声ファイルを再生するのにおススメなのはPlaySound関数。ただし、このPlaySound関数は、Windowsのライブラリにある機能をExcelで使用するということなので、VBAマクロの関数として、あらかじめ呼び出しておく必要があります。それが、API宣言。
APIは、Application Programming Interface の略。
【準備】PlaySound関数を使うためのAPI宣言
下記がPlaySound関数を使うための宣言文。
Public Declare Function PlaySound Lib "winmm.dll" Alias "PlaySoundA" ( _ ByVal pszSound As String, _ ByVal hmod As Long, _ ByVal fdwSound As Long _ ) As Long Public Const SND_ASYNC = &H1 |
PlaySound関数を詳しく調べてみると、「非同期再生や同期再生」「繰り返し再生」「サウンドの停止」などなどいろんなキーワードとともに説明がありますが、ここではシンプルに、音声ファイルを再生することを目的にしていますので、あまり深く考えず、とりあえずコピペで先に進みましょう。
音声ファイルが無事に再生できることを確認したあとで、いろいろな機能を詳しく調べ、試行錯誤してみるのが、マクロ制作のモチベーション維持と学びの効果が高いと思います。
何はともあれ、音がならないことには始まりませんからね。
【かんたん解説】PlaySound関数の使い方
音声ファイルを再生するPlaySound関数は次の通り。
PlaySound wrkSndFile, 0, SND_ASYNC |
0 と SND_ASYNC は特に気にせず、そのまま(ちなみに、SND_ASYNCはAPI宣言のところで値を定義しています)。重要なのは、wrkSndFile(変数)。ここには音声ファイル名を記載すればよいのですが、コンピュータのどこに保存されているか、すなわち、フルパスが必要となります。
フルパス付きで音声ファイルを指定すれば、どんな方法でも構いません。簡単なのは直打ちして指定することですが、PCが変わるなどして保管先のフルパスが少しでも異なると音声が出てこなくなります。
なので、いかなる状況でも正しく動作させるには工夫が必要です。
今回、想定しているのは、音声ファイルが、このエクセルファイルと同じフォルダに保管されているケース。これであれば、フォルダごと移動させることさえ徹底しておけば、特に問題は発生しません。
ということで、音声ファイルが、このエクセルファイルと同じフォルダに保管されているケースでフルパスの取得手順を紹介します。
フルパス付きのファイル名を作成する
フルパス付きのファイル名 wrkSndFile は下記のように取得することとします。
wrkSndFile = ThisWorkbook.Path & f_sound |
ThisWorkbook.Path はこのExcelブックの保存先のフルパスを返します。あらかじめ、f_sound にファイル名を入れておき、「&」を使って文字列を合体させることで、フルパス付きのファイル名ができあがります。
ファイル名の頭に¥マークを入れるのを忘れないで!こうしないと、フルパスとファイル名が区別できずにくっついてしまいます。
ドレミファソラシド音を発生させるBeepAPIメソッド
BeepAPIメソッドを使えば、音階を奏でることも可能です。これもまた、Windowsのライブラリから、あらかじめ呼び出しておく必要があります。
スポンサーリンク
【準備】BeepAPIメソッドを使うためのAPI宣言
下記がPlaySound関数を使うための宣言文。
Declare Function BeepAPI Lib "kernel32.dll" Alias "Beep" _ (ByVal dwFreq As Long, ByVal dwDuration As Long) As Long |
これもまた、あまり深く考えず、とりあえずコピペで先に進みましょう。
【かんたん解説】BeepAPIメソッドの使い方
ドレミファソラシド音を再生するBeepAPIは次の通り。
BeepAPI ( dwFreq , dwDuration ) |
dwFreq :周波数 Hz(37~32767Hz)
dwDuration:音の鳴動時間 ms
音の周波数(Hz)と鳴動時間(ms)を指定することで、音を奏でることができます。基準音(ラ)の周波数は440Hzで、それを基準にドレミファソラシドが決まってきます。
音階と周波数の関係は奥が深く、周波数が倍になると1オクターブ上の音階になるなどいくつかの特徴があります。これについては、説明すると長くなるので、別の機会に紹介したいと思います。
参考までに1オクターブ分の周波数を載せておきます!
音階 | 周波数 Hz |
ド | 261.626 |
ド# | 277.183 |
レ | 293.665 |
レ# | 311.127 |
ミ | 329.628 |
ファ | 349.228 |
ファ# | 369.994 |
ソ | 391.995 |
ソ# | 415.305 |
ラ | 440.000 |
ラ# | 466.164 |
シ | 493.883 |
ド | 523.251 |
音を奏でるには、Callステートメントで呼び出します。
Call BeepAPI(440, 200) |
周波数を変えてみたり、鳴動時間を変えてみたり、いろいろやってみると面白いですよ。
このほか動画では、
・ファイルのフルパスの確認
・「おめでとうメッセージ」の表示/非表示
なども紹介していますので、是非みてみてくださいまし。
実践!エクセルVBAマクロ超入門02 効果音を入れて盛り上げる!(抽選器マシーンシリーズ機能追加①)
スポンサーリンク