質問: エクセル2016を使用しています。 「Sheet3」の「C4セル」に数値を入力してエンターキーを押したら、2秒程のMP3ファイルを再生する方法はありますでしょうか? バーコードリーダーでバーコードを読み込むと、数値が入力されてエンターキーが押されます。 今回の質問は、バーコードの読み取り漏れを防ぎたいという目的です。 ちなみにMP3ファイルの保存先パスは以下のとおりです。 C:\Users\PC\Music\iTunes\iTunes Media\Music この下にある「abc」というファイルだと仮定します。 よろしくお願い致します。
回答: この質問は「MP3の再生」と「エンターキーで処理」の2点ありますね。 MP3の再生 まずMP3の再生に関しては、外部プレイヤー(Windows Media Player等)を呼び出して再生する方法とAPIを利用する方法があります。 前者だとプレイヤー自身が立ち上がってしまうので後者をお薦めします。 標準モジュールに下記をコピーしてください。 ``` Private Declare 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 Sub PlaySound() Dim SoundFile As String, rc As Long SoundFile = "C:\Users\PC\Music\iTunes\iTunes Media\abc.mp3" If Dir(SoundFile) = "" Then MsgBox SoundFile & vbCrLf & "がありません。", vbExclamation Exit Sub End If SoundFile = Chr(34) & SoundFile & Chr(34) 'スペース対策 rc = mciSendString("Open " & SoundFile, "", 0, 0) rc = mciSendString("Play " & SoundFile & " wait", "", 0, 0) rc = mciSendString("Close " & SoundFile, "", 0, 0) If rc <> 0 Then MsgBox rc & " のエラーです" End If End Sub ``` `PlaySound` を `Call` すれば再生されます。 注意勧告が目的なら、Beep でビープ音を鳴らすというのでもいいかと。 エンターキーで処理をする エンターキーで何らかの処理をさせるには、他の方の回答にもありますワークシートのChangeイベントが簡単でしょう。 ``` Private Sub Worksheet_Change(ByVal Target As Range) If Target.Address = "$C$4" Then PlaySound 'MP3 再生処理 End If End Sub ``` ただし、Enterキー以外でも反応してしまいます。Deleteキーや貼り付けなどの操作でワークシートのデータが変更されたときに反応します。 Enterキーのみに反応させたい場合は、Application.OnKey を使うといいでしょう。 ``` 'Enterキーにマクロを割り当て Sub Onkey_Set() Application.OnKey "~", "PressEnter" End Sub 'デモ(Sheet1のセルA1のみで機能させる) Sub PressEnter() If ActiveCell.Address = "$C$4" Then PlaySound 'MP3 再生処理 End If SendKeys "~" End Sub 'Enterキーを元の機能に戻す Sub Onkey_Off() Application.OnKey "~" End Sub ``` OnKeyに割り当てると、すべてのシートのセルでエンターキーが無効になってしまうので、SendKeysでエンターキーを送る処理を追加しています。 バーコードの整合性チェック 今回の要件がバーコードリーダーで正しくバーコードが読み取れているかどうかのチェックが最終目的だと思われますが、チェックデジットを利用する方法があります。 JANコードのチェックデジットを計算する関数 ~ Access VBA自作関数 - Office Tanabe バーコードリーダーでの読み取りエラーや、うっかりユーザーが編集してしまったりなども考慮すると、Worksheet_Change でデータが更新されたときに、チェックデジットを使って正しいバーコードかどうかをチェックして、正しくない場合に、警告音をだすというような仕様にするのがいいのではないでしょうか。 補足説明 詳細な仕様が判明したようでので、それに合わせて補足です。 判明している仕様。 * 「C4セル」にバーコードリーダーからJANコードを読み込む。 * 毎回入力するセルは「C4」となる。 * 「C4」をキーワードにして「D4」セルにVLOOKUPで表品名を表示している。 MP3再生のコードは、Windows APIの関数を参照してVBAから呼び出しているだけです。 参照するコードは理解するのは難しいかもしれませんが、そういう魔法の呪文だと思って、コピーして使えばいいでしょう。そのままコピーして標準モジュールに貼り付けてください。 今回の仕様なら、ワークシートのChangeイベントを使う方法でも問題ないでしょう。 その場合のコード例。 ``` Private Sub Worksheet_Change(ByVal Target As Range) If Target.Address = "$C$4" And ActiveCell.Address = "$C$5" Then If Not IsError(Range("D4").Value) Then PlaySound 'MP3 再生処理 Range("C4").Select End If End If End Sub ``` コピー先は『「シート名」のあるタブ内で右クリックして、出てきたメニューの「コードの表示」をクリック。』して表示された場所です。 Enterキーの判定は、Changeイベントの発生したセル(Target.Address)、移動先のセル(ActiveCell.Address)で判定しています。 さらに、「D4」セルにエラーなく商品名が表示されているかどうか、で読み込まれたバーコードが正しいかどうか判断しています。 完全な判定ではないですが、通常の運用なら問題はないと思われます。