質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

87.59%

【エクセル初歩的質問】

解決済

回答 3

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 2,745
退会済みユーザー

退会済みユーザー

エクセル2016を使用しています。

「Sheet3」の「C4セル」に数値を入力してエンターキーを押したら、2秒程のMP3ファイルを再生する方法はありますでしょうか?

バーコードリーダーでバーコードを読み込むと、数値が入力されてエンターキーが押されます。
今回の質問は、バーコードの読み取り漏れを防ぎたいという目的です。

ちなみにMP3ファイルの保存先パスは以下のとおりです。

C:\Users\PC\Music\iTunes\iTunes Media\Music

この下にある「abc」というファイルだと仮定します。

よろしくお願い致します。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 3

+2

【「Sheet3」の「C4セル」に数値を入力してエンターキーを押したら】ということを条件にするのは難しいです。(できなくはありません)

それよりも、【バーコードリーダーでバーコードを読み込むと、数値が入力されてエンターキーが押されます。】という動作はVBAで行っているのではないでしょうか?
その動作の最後に、音を鳴らす処理を実行するのでは不十分でしょうか?

次に任意のMP3ファイルを実行するという動作についてですが、これもEXCEL内だけでもできなくはないと思いますが、通常は外部のメディアプレイヤー(Windows Media Player等)を呼び出して再生することになるかと思います。
目的が「バーコードの読み取り漏れを防ぎたい」ということなのでしたら、やりたいことはバーコードリーダーの操作者が、きちんと読み取れたか読み取れなかったかを音によって判断したいということですよね?
であれば、音の種類はこだわらなくても良いかと思いますので、VBA標準の音を鳴らす処理を用いてはどうでしょうか?→参考リンク

私の提案としては、「数値が入力されてエンターキーを押す」という動作を定義しているVBAのコードに対して、エンターキーを押す処理の次にBeep音を鳴らすというコードを入れる、ということです。これならスピーディーに実装できそうです。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/06/26 13:29

    ご返信ありがとうございます。
    前提条件が説明不十分でしたね。

    現在、「C4セル」にJANコードを読み込むと、「D4セル」にその商品名がでてきます。
    仕組みとしては、10行目以降から数百行にわたりJANコード、商品名、価格、在庫などがリストになっております。

    バーコードリーダーを使って「C4セル」にJANコードを打ち込むと、VLOOKUP関数で「E4セル」「F4セル」「G4セル」に、「商品名」「価格」「在庫」の数値が返ってくる仕組みになっております。

    ですので、毎回入力するセルは「$C$4」となります。
    (バーコードリーダーの説明をしようと動画を張りつけましたら、かえって混乱を招いてしまいました。)

    ※上手く説明することが難しいのですが、「$C$4」で文字を入力したら「C5セル」が選択されるから音を確認しなくても分かると思われると思いますが、ここでは音を出す方法に焦点を当てさせてください。

    2番目の問題は解消されましたでしょうか?

    Worksheet_Changeについて調べました。
    なるほど、【ワークシートに対して変更が行われた】ことに対して処理されるのですね。
    そうなってくると確かに1番目の問題が出てきますね。

    では、Worksheet_SelectionChangeを使うというのはいかがでしょうか?
    「$C$4」しか使わないので、「C5セル」に選択範囲が変わったことで処理が行われるといったことです。

    (参照:Excel マクロ・VBA塾)
    http://kabu-macro.com/word/a-z/selectiion_change.html

    キャンセル

  • 2017/06/26 15:33

    >ですので、毎回入力するセルは「$C$4」となります。
    その前提条件は理解しましたが、値が入力されてエンターキーが押されるとC5のセルに移動しますよね。次のデータを読み込むときに、何もしなければC5のセルに入力されてしまうと思いますが、どうやってC4のセルに戻すのでしょうか?(もし、その処理をVBAで組んでいるのなら、そこで音を鳴らせばよいのではないでしょうか?)

    >では、Worksheet_SelectionChangeを使うというのはいかがでしょうか?
    バーコードリーダーの読み込み先となるシートに対し手作業がほぼ発生しない業務の仕方にするのであれば、どちらを利用しても特に変わらないと思います。
    ただし、手作業が発生する可能性が少しでもあるのであれば、Worksheet_Changeを利用するがより良いと思います。
    というのも手作業でそのシートに対し作業を行うことを想定したときに、SelectionChangeはセルを移動したときに、Worksheet_Changeはセルの値を変更したときに実行されますので、後者のほうが動作のタイミングが少なくて済むからです。
    できるだけ、本来やりたいことと違うタイミングで無駄な処理は行われないほうが良いと思われるからです。

    キャンセル

  • 2017/06/27 10:03

    返信おそくなりました。

    >何もしなければC5のセルに入力されてしまうと思いますが、どうやってC4のセルに戻すのでしょうか?(もし、その処理をVBAで組んでいるのなら、そこで音を鳴らせばよいのではないでしょうか?)

    それが一番シンプルですね!しかしエクセルに戻って考えてみると、どうやら無理そうでした。

    C4からC5に戻す方法につきましては、やや特殊な動きをしております。
    バーコードリーダーで読み取った後、もう一つのデバイス(マウス logicool g700S)で操作をしております。
    マウス自体にマクロを組み込んでいるため、ExcelのVBA以外のマクロで動いて、結果としてC4セルに戻ってくる仕組みとなっております。

    というわけでその方法は、今回に当てはまりませんでした。

    Worksheet_Changeについては今後勉強していきますね!
    今回は何が何やら分からなかったのですが、ひとまず解決いたしました。。

    akabee様はいつも核心をついた回答で助かっております。
    また機会があればその時はよろしくお願い致します。

    キャンセル

checkベストアンサー

+1

この質問は「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」セルにエラーなく商品名が表示されているかどうか、で読み込まれたバーコードが正しいかどうか判断しています。

完全な判定ではないですが、通常の運用なら問題はないと思われます。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/06/26 13:59

    hatena19 様

    非常に詳しい解説ありがとうございます。
    teratail初心者なのですが、まず回答のレイアウト?が見やすくて驚いております。
    (見出し文などがついていてわかりやすいです。)

    <MP3の再生>
    APIを利用する方法があるのですね。知りませんでした。
    まずは標準モジュール部にAPIの宣言を置かなくてはいけないみたいですね。

    <エンターキーで処理をする >
    Changeイベントを利用する方法を勉強中です。
    他の回答者様の答えにもありますように、何かしらの問題が発生するみたいなので、同時に解消していく必要があるようですね。

    <バーコードの整合性チェック >
    質問以上の内容まで補足していただきありあがとうございます。
    目を通させていただきます。

    私にとっては非常に難解な内容でした。
    せっかく詳しく回答いただいたのですが、残念なことにほとんどが理解できませんでした。

    自分がやろうとしたことが今のレベルには追い付いていないことが分かりました。

    「hatena19様の今回教えて頂いた内容を全て理解する」を今年の目標として頑張って勉強していきますね!!

    本当に丁寧な解説、とても感謝しております。

    キャンセル

  • 2017/06/26 15:21

    プロフィールからブログ拝見しました。
    詳しく書かれておられるのですね。

    回答いただいたマクロがいくつかに分かれているのは、一つ目を標準モジュールに組み込むとして、二つ目と三つ目はどこに組み込んだらよいでしょうか?

    「シート名」のあるタブ内で右クリックして、出てきたメニューの「コードの表示」をクリック。
    ここに二つ目と三つ目のコードを貼り付けたらよいでしょうか?

    キャンセル

  • 2017/06/26 17:27

    一つ目のコード(MP3再生)は標準モジュールに。
    二つ目(Worksheet_Change)と三つ目(Application.OnKey)のコードは、両方コピーする必用はなく、どちらの方法も採用するか決めて、採用した方のコードをコピーしてください。とりあえず、二つ目(Worksheet_Change)の方でいいと思います。(3つ目は現状の質問者さんのスキルでは難解かも)
    コピーする場所は、『「シート名」のあるタブ内で右クリックして、出てきたメニューの「コードの表示」をクリック。』でOKです。

    キャンセル

  • 2017/06/27 09:52

    返信遅くなりました。

    言われた通り、一つ目のコードと二つ目のコードをコピーさせていただきました。
    驚きました!ちゃんと音が出ました!
    そして、C5に移動したセルの選択がちゃんとC4に戻ってきました!!!

    今回求めていたことが実現しました。
    ありがとうございます。

    P.S フォローさせていただきました。また機会があればその時はよろしくお願い致します。ブログ応援しております。

    キャンセル

+1

Changeイベントで処理すれば良いと思います。

Private Sub Worksheet_Change(ByVal Target As Range)
    ' C4セルか?
    If Target.Column = 3 And Target.Row = 4 Then
        ' 再生処理
    End If
End Sub


ただ音の再生は方法が色々あるので、「VBA mp3 再生」などで検索してみてください。
以下のサイトはなんとなくしっかり作り込んでそうな感じでした。
http://excel.syogyoumujou.com/vba/mci.html
※職場で回答していて音が出せない環境なので、実際に使えるかは試しておりません。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/06/26 14:06 編集

    ttyp03様への返信であっております。
    紛らわしいコメントで申し訳ありません。

    書いてあることのほとんどが理解できなかったというのは、ttyp03様に教えて頂いたサイトのことでした。
    http://excel.syogyoumujou.com/vba/mci.html


    >SelectionChangeイベントで目的は達成できるかもしれませんが、イベントの意味が異なるのでChangeイベントを使う方をお勧めします。

    そうなのですね。
    わかりました!調べてみます!

    キャンセル

  • 2017/06/26 14:24

    あ、私への回答であってましたか。失礼。
    再生の方法は、私の紹介したものでも良いですし、hatena氏が紹介している
    mciSendStringでもなんでも良いと思います。
    コピペで動けば中身の詳細まで把握する必要はないと思いますよ。

    キャンセル

  • 2017/06/27 09:54

    返信遅くなりました。

    今回はhatena様の方法で解決いたしました。
    まだコードの内容までは分かりませんでしたが、ひとまずコピペで対応させていただきました。

    ttyp03様にも感謝しております。
    また機会があればその時はよろしくお願い致します。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 87.59%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る