Accessで効果音を使用する事って自動化のフロー終了時に実装を依頼される事ありますよね。音源の用意とか手間がかかりますが実装も頭を悩ませます。この記事では納品時に手間がかからないような実装方法をご紹介します。
Accessで効果音を鳴らすには二つ方法があります。
- 効果音ファイルをOLEオブジェクトとして扱う方法
- APIを使って効果音ファイルを再生する方法
OLEオブジェクトとして再生する方法
フォームにwavファイルを挿入して以下のコードを実行する
Private Sub cmdWave_Click()
oleSound.Action = acOLEActivate
End Sub
ちなみにwavファイル再生時にMediaPlayerの画面がポップアップされるのでいまいち使い勝手がよくありません。
APIで効果音を鳴らす方法
・mciSendString
・PlaySound
などなど使う方法があります。
効果音ファイルの設置について
AccessDBファイルを現場環境に納品する時にOLEオブジェクトバージョンはDBファイルに包括されているので問題ありませんが,APIバージョンの場合はwavファイルをフルパスで指定するのでDBファイルとwavファイルを別で納品して、ユーザーの環境に合わせてwavファイルを設置しなければいけません。
APIバージョンもあらかじめテーブル内にwavファイルを保持しておいて、使うときにTempフォルダに展開してからそのフルパスを使ってAPIにフルパスを渡して再生すれば、納品時に複数ファイルにならないし、設置環境にわざわざwav保管用のフォルダを作らなくても済むんじゃないかと考えました。(まぁTempフォルダに保管フォルダ作りはするんですけどね)
APIでの効果音再生実装概要
添付型フィールドを適当なテーブルに作成してそこにあらかじめ準備しておいたwavファイルを追加しておく。(複数でもOK)アプリケーション全体の環境設定を管理するテーブルが適切です。
まずはテーブルに添付がたフィールドを作成してwavファイルを保管します。
そのフィールドにwavファイルを追加する。今回は二つ
クリップマークの後ろの括弧内に2と表示されていれば、二つのファイルが添付されています。
フォームを開く時にFSOでユーザーのtempフォルダーを取得しそこに保管用フォルダーを作成する。
上記保管用フォルダーにテーブルに保管しておいた添付ファイル(wavファイル達)を.SaveToFileで出力する。
グローバル変数とAPI定義宣言 これはご使用のOfficeのバージョン等によって書き換えてください。
Public beepSound1DirectoryPath As String
Public beepSound2DirectoryPath As String
#If Win64 Then
Public Declare PtrSafe Function mciSendString Lib "winmm.dll" Alias "mciSendStringA" _
(ByVal lpstrCommand As String, ByVal lpstrReturnString As String, _
ByVal uReturnLength As Long, ByVal hwndCallback As Long) As Long
#Else
Public Declare Function mciSendString Lib "winmm" Alias "mciSendStringA" _
(ByVal lpstrCommand As String, ByVal lpstrReturnString As String, _
ByVal uReturnLength As Long, ByVal hwndCallback As Long) As Long
#End If
FSOでtempフォルダのパスを取得してそこに保管用のフォルダを作成し添付データを出力する。
Public Function test()
On Error Resume Next
Dim fso As New FileSystemObject 'FSO
Dim f As Folder 'Folder
Dim newFolderName As String '新規作成するフォルダ名
Dim newDirectoryPath As String '新規作成するフォルダのフルパス
Set f = fso.GetSpecialFolder(TemporaryFolder) 'Tempフォルダーパスの取得
newFolderName = "TestFolder" 'このAccess用のtempフォルダ名
newDirectoryPath = f & "\" & newFolderName
beepSound1DirectoryPath = newDirectoryPath & "\sound1.wav"
beepSound2DirectoryPath = newDirectoryPath & "\sound2.wav"
If Dir(newDirectoryPath, vbDirectory) = "" Then
fso.CreateFolder newDirectoryPath
End If
Set fso = Nothing
'添付型カラムから添付したファイルをTempフォルダに出力する。
Dim DB As DAO.Database
Dim R1 As Recordset
Set DB = CurrentDb()
Set R1 = DB.OpenRecordset("テーブル1")
R1.MoveFirst
Do Until R1.EOF
With R1("AddData").Value 'AddDataカラムのそれぞれのValueに添付データが入っている
While Not .EOF
.Fields("FileData").SaveToFile newDirectoryPath 'FileDataに添付データが入っている。
'FileNameでnewDirectoryPathに保存される。
.MoveNext
Wend
End With
R1.MoveNext
Loop
R1.Close
DB.Close
Set R1 = Nothing
Set DB = Nothing
End Function
出力したフルパスをグローバル変数にセットしておき必要な場面でmciSendStringをcallして音を再生する。
Private Sub コマンド5_Click()
Call mciSendString("play " & beepSound1DirectoryPath, "", 0, 0)
End Sub
Private Sub コマンド3_Click()
Call mciSendString("play " & beepSound2DirectoryPath, "", 0, 0)
End Sub
最後に閉じるフォームに作成したTempフォルダ内のテストフォルダを削除する機能を必要に応じて実装する。今回はそのまま放置します。納品先でのルールに従うとよいでしょう。情報管理部門に問い合わせすればポリシー教えてくれるはずです。
再生ボタン
Sound1 PlayとSound2 Playボタンを押すとそれぞれ効果音が再生されます。
まとめ
組み込み実装レベルはそう難しくはないのですが、ユーザーの環境に合わせられるかが問題になってきます。情報管理部門のポリシーやOfficeのバージョンによってコーディングを少し手直しする必要があると思います。
開発側からすれば効果音を出す事自体は簡単ですが、ユーザー側からすると作業の終了単位ごとに音が再生されると作業の正確性が向上したりとQC活動での確認点として利用できるなど幅が広がります。ユーザーに音源を作ってもらうのも一つの方法と思われます。
コメント