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

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

新規登録して質問してみよう
ただいま回答率
85.50%
VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

Q&A

解決済

3回答

3596閲覧

【エクセル初歩的質問】

退会済みユーザー

退会済みユーザー

総合スコア0

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

0グッド

0クリップ

投稿2017/06/25 12:25

編集2017/06/25 15:21

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

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

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

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

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

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

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

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

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

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

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

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

投稿2017/06/25 12:51

akabee

総合スコア1947

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2017/06/25 15:23 編集

akabee 様 前回の質問では、非常に分かりやすい回答ありがとうございました。 terarailのサイトにはまだ慣れておりませんが、フォローさせていただきました。 バーコードリーダーは以下のような商品を使用しております。 【Amazon】USB バーコードリーダー http://amazon.jp/dp/B00WU9NH3Q バーコードリーダーでコードを読み込むと、自動的にエンターという動作が行われるのでVBAは使用しておりません。 一般的にバーコードリーダーというのは、コードを読み込んだ後にエンター(改行)してリスト化されるようなイメージです。 【You Tube】簡単に接続できるバーコードリーダー https://www.youtube.com/watch?v=KO8kSg2S-7Q ※なお、動画のバーコードリーダーでは本体から音が鳴っているのですが、当方の環境下ではそれができない状況でございます。 「C4セル」にカーソルを合わせた状態で製品の裏に付いているバーコードを読み込むと、13ケタの数字(JANコードと呼ばれるもの)が「C4セル」に入力された後に、「C5セル」にカーソルが動きます。 VBAを使用するとすれば、【「C4セル」でエンターを押したら音が鳴る】といった内容になりますでしょうか?
akabee

2017/06/26 01:12 編集

バーコードリーダーの処理は外付けでしたか。自動的に値が入力されて、自動的にエンターされるのですね。 であれば、ttyp03さんが回答されているようにWorksheet_Changeを利用するのが良いと思います。つまり【「C4セル」でエンターを押したら音が鳴る】ではなく【何かワークシートに対して変更が行われた(エンターが押された)ら「C4セル」を確認して問題があるかどうかを確認し、問題なければ音を鳴らす】という処理になります。 ですが、そうすると2点問題があります。 1.Worksheet_Changeはバーコードリーダーを利用せずに手作業でシートを変更した場合などにも実行されますのでそれを前提にした作業としなければならない 2.セルはC4に限らず、C5~C6~と次のセルに進んでいくのだと予想しますので、「今どのセルを処理しているか」が常にExcelで把握できていなければならない。もし手作業で補正するような場合があれば、「今どのセルを処理しているか」も補正できる必要がある。 というようなことです。(このあたりを考慮する必要がありますので、当初回答ではお勧めしませんでした) どちらも、前提条件を工夫すれば問題ないと思われますが、現状の前提条件にマッチしているかどうかが不明確です。 そのあたりはもう少し前提条件を教えて頂けると何か良いアドバイスができると思います。
退会済みユーザー

退会済みユーザー

2017/06/26 04: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
akabee

2017/06/26 06:33

>ですので、毎回入力するセルは「$C$4」となります。 その前提条件は理解しましたが、値が入力されてエンターキーが押されるとC5のセルに移動しますよね。次のデータを読み込むときに、何もしなければC5のセルに入力されてしまうと思いますが、どうやってC4のセルに戻すのでしょうか?(もし、その処理をVBAで組んでいるのなら、そこで音を鳴らせばよいのではないでしょうか?) >では、Worksheet_SelectionChangeを使うというのはいかがでしょうか? バーコードリーダーの読み込み先となるシートに対し手作業がほぼ発生しない業務の仕方にするのであれば、どちらを利用しても特に変わらないと思います。 ただし、手作業が発生する可能性が少しでもあるのであれば、Worksheet_Changeを利用するがより良いと思います。 というのも手作業でそのシートに対し作業を行うことを想定したときに、SelectionChangeはセルを移動したときに、Worksheet_Changeはセルの値を変更したときに実行されますので、後者のほうが動作のタイミングが少なくて済むからです。 できるだけ、本来やりたいことと違うタイミングで無駄な処理は行われないほうが良いと思われるからです。
退会済みユーザー

退会済みユーザー

2017/06/27 01:03

返信おそくなりました。 >何もしなければC5のセルに入力されてしまうと思いますが、どうやってC4のセルに戻すのでしょうか?(もし、その処理をVBAで組んでいるのなら、そこで音を鳴らせばよいのではないでしょうか?) それが一番シンプルですね!しかしエクセルに戻って考えてみると、どうやら無理そうでした。 C4からC5に戻す方法につきましては、やや特殊な動きをしております。 バーコードリーダーで読み取った後、もう一つのデバイス(マウス logicool g700S)で操作をしております。 マウス自体にマクロを組み込んでいるため、ExcelのVBA以外のマクロで動いて、結果としてC4セルに戻ってくる仕組みとなっております。 というわけでその方法は、今回に当てはまりませんでした。 Worksheet_Changeについては今後勉強していきますね! 今回は何が何やら分からなかったのですが、ひとまず解決いたしました。。 akabee様はいつも核心をついた回答で助かっております。 また機会があればその時はよろしくお願い致します。
guest

0

ベストアンサー

この質問は「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

PlaySoundCall すれば再生されます。

注意勧告が目的なら、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 02:30

編集2017/06/26 09:03
hatena19

総合スコア33620

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2017/06/26 04:59

hatena19 様 非常に詳しい解説ありがとうございます。 teratail初心者なのですが、まず回答のレイアウト?が見やすくて驚いております。 (見出し文などがついていてわかりやすいです。) <MP3の再生> APIを利用する方法があるのですね。知りませんでした。 まずは標準モジュール部にAPIの宣言を置かなくてはいけないみたいですね。 <エンターキーで処理をする > Changeイベントを利用する方法を勉強中です。 他の回答者様の答えにもありますように、何かしらの問題が発生するみたいなので、同時に解消していく必要があるようですね。 <バーコードの整合性チェック > 質問以上の内容まで補足していただきありあがとうございます。 目を通させていただきます。 私にとっては非常に難解な内容でした。 せっかく詳しく回答いただいたのですが、残念なことにほとんどが理解できませんでした。 自分がやろうとしたことが今のレベルには追い付いていないことが分かりました。 「hatena19様の今回教えて頂いた内容を全て理解する」を今年の目標として頑張って勉強していきますね!! 本当に丁寧な解説、とても感謝しております。
退会済みユーザー

退会済みユーザー

2017/06/26 06:21

プロフィールからブログ拝見しました。 詳しく書かれておられるのですね。 回答いただいたマクロがいくつかに分かれているのは、一つ目を標準モジュールに組み込むとして、二つ目と三つ目はどこに組み込んだらよいでしょうか? 「シート名」のあるタブ内で右クリックして、出てきたメニューの「コードの表示」をクリック。 ここに二つ目と三つ目のコードを貼り付けたらよいでしょうか?
hatena19

2017/06/26 08:27

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

退会済みユーザー

2017/06/27 00:52

返信遅くなりました。 言われた通り、一つ目のコードと二つ目のコードをコピーさせていただきました。 驚きました!ちゃんと音が出ました! そして、C5に移動したセルの選択がちゃんとC4に戻ってきました!!! 今回求めていたことが実現しました。 ありがとうございます。 P.S フォローさせていただきました。また機会があればその時はよろしくお願い致します。ブログ応援しております。
guest

0

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

VBA

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

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

投稿2017/06/26 00:00

ttyp03

総合スコア16996

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2017/06/26 04:37 編集

以前の質問では、非常に分かりやすい回答ありがとうございました。 フォローさせていただきました。 お仕事中にもかかわらず、ご回答いただきとても感謝しております。 早速サイトを拝見しました。 ...書いてあることのほとんどが理解できませんでした。(笑) ここまで難しいことをしようとしていたんですね。 質問がざっくりしていたので、少しだけ補足させていただきます。 現在、「C4セル」にJANコードを読み込むと、「D4セル」にその商品名がでてきます。 仕組みとしては、10行目以降から数百行にわたりJANコード、商品名、価格、在庫などがリストになっております。 バーコードリーダーを使って「C4セル」にJANコードを打ち込むと、VLOOKUP関数で「E4セル」「F4セル」「G4セル」に、「商品名」「価格」「在庫」の数値が返ってくる仕組みになっております。 ですので、毎回入力するセルは「$C$4」となります。 ※上手く説明することが難しいのですが、「$C$4」で文字を入力したら「C5セル」が選択されるから音を確認しなくても分かると思われると思いますが、ここでは音を出す方法に焦点を当てさせてください。 Worksheet_SelectionChangeを使うというのはいかがでしょうか? 「$C$4」しか使わないので、「C5セル」に選択範囲が変わったことで処理が行われるといったことです。 Private Sub Worksheet_SelectionChange(ByVal Target As Range)   If Target.Address() = "$C$5" Then   ' 再生処理   End If End Sub (参照:Excel マクロ・VBA塾) http://kabu-macro.com/word/a-z/selectiion_change.html
ttyp03

2017/06/26 04:51

えっと、これはhatena19氏へのコメントでしょうか…。私はそこまで難しい回答してないので(^^; いずれにしても、SelectionChangeイベントで目的は達成できるかもしれませんが、イベントの意味が異なるのでChangeイベントを使う方をお勧めします。 その際hatena19氏も回答しているように、エンターキーか否かの判別が必要かもしれません。 ただ厳密にエンターキーか否かで判断せずとも、イベント発生&ブランクではなかったらのような判定でも良いのではと思います。 これはどれくらい厳密に処理したいのかにもよるので、ご自身で判断してください。
退会済みユーザー

退会済みユーザー

2017/06/26 05:07 編集

ttyp03様への返信であっております。 紛らわしいコメントで申し訳ありません。 書いてあることのほとんどが理解できなかったというのは、ttyp03様に教えて頂いたサイトのことでした。 http://excel.syogyoumujou.com/vba/mci.html >SelectionChangeイベントで目的は達成できるかもしれませんが、イベントの意味が異なるのでChangeイベントを使う方をお勧めします。 そうなのですね。 わかりました!調べてみます!
ttyp03

2017/06/26 05:24

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

退会済みユーザー

2017/06/27 00:54

返信遅くなりました。 今回はhatena様の方法で解決いたしました。 まだコードの内容までは分かりませんでしたが、ひとまずコピペで対応させていただきました。 ttyp03様にも感謝しております。 また機会があればその時はよろしくお願い致します。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問