VBA 添付型フィールドにwavファイルをセットし効果音を鳴らす

MSACCESS_eyecatch
SBMJOB

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での効果音再生実装概要

STEP
適切なテーブルに添付型フィールドを作成してそこにwavファイルを複数添付しておく。

添付型フィールドを適当なテーブルに作成してそこにあらかじめ準備しておいたwavファイルを追加しておく。(複数でもOK)アプリケーション全体の環境設定を管理するテーブルが適切です。

まずはテーブルに添付がたフィールドを作成してwavファイルを保管します。

そのフィールドにwavファイルを追加する。今回は二つ

クリップマークの後ろの括弧内に2と表示されていれば、二つのファイルが添付されています。

STEP
アプリケーションの起動時、STEP①で添付したファイルをTempフォルダーに書き出す。

フォームを開く時に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
STEP
APIをcallし指定した効果音を再生する。

出力したフルパスをグローバル変数にセットしておき必要な場面で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
STEP
後始末

最後に閉じるフォームに作成したTempフォルダ内のテストフォルダを削除する機能を必要に応じて実装する。今回はそのまま放置します。納品先でのルールに従うとよいでしょう。情報管理部門に問い合わせすればポリシー教えてくれるはずです。

再生ボタン

Sound1 PlayとSound2 Playボタンを押すとそれぞれ効果音が再生されます。

まとめ

組み込み実装レベルはそう難しくはないのですが、ユーザーの環境に合わせられるかが問題になってきます。情報管理部門のポリシーやOfficeのバージョンによってコーディングを少し手直しする必要があると思います。

開発側からすれば効果音を出す事自体は簡単ですが、ユーザー側からすると作業の終了単位ごとに音が再生されると作業の正確性が向上したりとQC活動での確認点として利用できるなど幅が広がります。ユーザーに音源を作ってもらうのも一つの方法と思われます。

スポンサーリンク

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

システム開発SE・アプリ開発・デバッガー等々なんでもやる猫の下僕です。現在は凶暴猫にカタカタ動く手を狙われながらキーボードを打っています。かなりゆるい性格なのでコメントやメッセージお気軽に〜お仕事のご依頼もお気軽にぃ〜

スポンサーリンク

コメント

コメントする

CAPTCHA


目次