[[20120506173123]] 『メデイアプレーヤーをバックグランドで使う方法』(マルコ) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『メデイアプレーヤーをバックグランドで使う方法』(マルコ)
初心者ですがよろしくお願いいたします。
セルの値が一定の値に達したときにwavファイルを鳴らしたり、オブジェクトのボタンを操作するとwavファイルが鳴るシートを作りました。
私のパソコンVISTAとExcel2007では問題なく使えているのですが、
職場のパソコン、セブンとExcel2010ではメディアプレーヤーが手前に表示されてしまい、一度エクセルをクリックしないとボタンの操作ができない状態になっています。
自作の警報音など、数種類のwavファイルを使うのでメディアプレーヤーは必要だと思うのですが、メディアプレーヤーをバックグランドで使える方法、またはそれに代わる方法などがありましたらお教え願います。

 >セブンとExcel2010ではメディアプレーヤーが手前に表示されてしまい
 この辺りの説明をもう少し、詳細にされてみては? いかがですか?

 そもそもこのメディアプレーヤーコントロールをどこに配置しているのですか?
 ユーザーフォームですか? シートですか?

 この現象になるオペレーションの記述は必要ですよ!!

 Excel2007で正常に作動していて、2010では、作動しないブックを作成する
 作成手順を記述してみては? いかがですか

 ichinose


ichinose様
さっそくのお返事ありがとうございます。
初心者ですので言葉がよくわからないことと、長文を避けるために省略しすぎたことをお詫びいたします。

そもそもこのファイルは30秒に一回動作させるマクロを使って、特定のセルの値が一定の値を超えたときに
「警報1」(wav)を、さらにその値を超えたときに「警報2」(wav)を鳴らすものです。
そして警報を解除するときにマクロを登録したボタンをクリックするのですが、その際にも誤操作防止のた
めに「確認音」(wav)を鳴らすというものです。

wavファイルはシートに貼り付けてあります。
「挿入」→「オブジェクト」→「ファイルから」の順で挿入しました。

>メディアプレーヤーコントロールをどこに配置しているのですか?ユーザーフォームですか? シートですか?
このあたりが自分でもよくわかりませんので、マクロの記述を添付します。

  If Range("X97").Value = 0 Then
    Range("A1").Select
    ElseIf Range("X97").Value = 1 Then
    Range("A396:Y398").Select         この部分に警報の内容を示す文と挿入したwavファイルを貼り付けています
    ActiveSheet.Shapes("Object 24").Select  「Object 24」は挿入したwavファイルです。
    Selection.Verb Verb:=xlPrimary       これがメディアプレーヤーの部分だと思いますが、この学校で示された例をそのまま貼り付けました
    ElseIf Range("X97").Value = 2 Then
    Range("A399:Y401").Select
    ActiveSheet.Shapes("Object 25").Select
    Selection.Verb Verb:=xlPrimary

    End If
End Sub

これを自宅のパソコン(VISTAとExcel2007)で作成しました。
警報が鳴り出すと画面上にメディアプレーヤーが出ますが、一度エクセルをクリックする
とエクセルがアクティブになり、以後警報が鳴ってもメディアフレーヤーが手前に表示さ
れることもなく、エクセルがアクティブのままです。

それが職場のパソコン(セブンとExcel2010)では警報が鳴り出すたびにメディアプレーヤー
がエクセルより手前に出て、メディアプレーヤーがアクティブのままになります。

メディアプレーヤーは手前に表示されてもかまいませんが、メディアプレーヤーがアク
ティブの状態のままになると、警報を解除するボタンを操作するのにエクセルをアクティ
ブにする操作が増えるため、ダブルクリックのような形になってしまいます。
その解決方法をおたずねします。

初心者の説明でわかりずらいかと思いますが、よろしくお願いいたします。


 試行1

 Sub test2()
  If Range("X97").Value = 0 Then
     Range("A1").Select
  ElseIf Range("X97").Value = 1 Then
     Range("A396:Y398").Select
     ActiveSheet.OLEObjects("Object 24").Verb Verb:=xlPrimary
  ElseIf Range("X97").Value = 2 Then
     Range("A399:Y401").Select
     ActiveSheet.OLEObjects("Object 25").Verb Verb:=xlPrimary
  End If
  Application.WindowState = xlMinimized
  Application.WindowState = xlMaximized
 End Sub

 これをまず、試してみてください。尚、VBEは閉じた状態で試してください。

 これで駄目なら、APIですが、Win7と仰ってるので面倒かなあ・・・。
 因みにこれは、サウンドオブジェクトですね

 色々やってだめなら、メディアプレーヤーコントロールの使用も考慮してみましょう。

 ichinose


ichinose様

お世話になります。
さっそく自宅のパソコンで試してみました。

ActiveSheet.OLEObjects("Object 24").Verb Verb:=xlPrimary
ここの記述でデバックがかかってしまいました。

ActiveSheet.Shapes("Object 24").Select  

    Selection.Verb Verb:=xlPrimary
とりあえず元の記述に戻して 
 Application.WindowState = xlMinimized
  Application.WindowState = xlMaximized
を付け加えてみました。

自宅のパソコンでは正常に動作していますので、これを職場のパソコンで試してみます。
本日は泊り勤務になりますので、明日の夜にご報告いたします。

ありがとうございました。


ichinose様
上記のデバックの件は私のミスでした。
Sub test2()を実行したところ正常に動作しました。
変更箇所だけを書き直したときにデバックが出ましたので、おそらく私の入力ミスだったと思います。
これから職場のパソコンで試してみます。
失礼いたしました。  マルコ

ichinose様
昨日はありがとうございました。
さっそく職場のパソコンで試してみましたが、残念ながらだめでした。
画面は瞬時最小化になるのですが、メディアプレーヤーは手前に表示され、アクティブのままでした。
画面を切り替えることでうまくいくと思ったのですが、残念です。

これは素人の思いつきですが、メディアプレーヤーを閉じる方法はあるものでしょうか?
エクセルを常に手前に表示する方法は、この学校でみつけて試したことがあります。手前に表示されてもエク
セルがアクティブにならないので諦めましたが、エクセルを常に手前に表示させ、警報が鳴り終わったあとに
メディアプレーヤーを閉じれば、エクセルがアクティブになるのでは・・・ と、素人的に考えました。
もっともメディアプレーヤーの閉じ方がまったく見当もつかないのですが…

>これで駄目なら、APIですが
>メディアプレーヤーコントロールの使用も考慮してみましょう

シートとフォームの違いもわからない素人ですが、できるかぎりついていきますので、ご指導いただけました
ら幸いです。
よろしくお願いいたします。


 試行2
 Option Explicit
 Public Declare Function SetWindowPos Lib "USER32" (ByVal hWnd As Long, ByVal hWndInsertAfter As Long, _
        ByVal X As Long, ByVal Y As Long, _
         ByVal cx As Long, ByVal cy As Long, _
        ByVal wFlags As Long) As Long
 Public Const walways = -1 '常に手前にセット
 Public Const wreset = -2  '解除
 Public Const wdisp = &H40 '表示する
 Public Const w_SIZE = &H1 'サイズを設定しない
 Public Const w_MOVE = &H2 '位置を設定しない
 Sub Excelを常に手前に設定()
    Dim hWnd As Long
    hWnd = Application.hWnd
    Call SetWindowPos(hWnd, walways, 0, 0, 0, 0, wdisp Or w_SIZE Or w_MOVE)
 End Sub
 Sub Excelを常に手前に設定解除()
    Dim hWnd As Long
    hWnd = Application.hWnd
    Call SetWindowPos(hWnd, wreset, 0, 0, 0, 0, wdisp Or w_SIZE Or w_MOVE)
 End Sub

 Sub test3()
  Excelを常に手前に設定
  If Range("X97").Value = 0 Then
     Range("A1").Select
  ElseIf Range("X97").Value = 1 Then
     Range("A396:Y398").Select
     ActiveSheet.OLEObjects("Object 24").Verb Verb:=xlPrimary
  ElseIf Range("X97").Value = 2 Then
     Range("A399:Y401").Select
     ActiveSheet.OLEObjects("Object 25").Verb Verb:=xlPrimary
  End If
  Excelを常に手前に設定解除
 End Sub

 尚、私が確認できないので試してください。
 Win7では、32APIでエラーになる件

http://officetanaka.net/excel/excel2010/011.htm

 対処法がありますから、これを参考に試してみてください。

 ichinose


ichinose様
お世話になります。

Sub test3()の前に「手前に設定」というオプションが付けられるのですね。
これだけでもいい勉強になりました。ありがとうございます。
これも職場で試してみます。
ちなみに本日も泊り勤務になりますので、明日以降のご報告となります。

いつも本当にありがとうございます。


ichinose様
お世話になります。

試行2の結果ですが、理解に苦しむ結果となりました。
最初はうまくいったと思ったのですが…
メデイァプレーヤーが起ちあがる前にSub test3()を実行すると、エクセルが手前のまま警報が鳴り、メディアプレーヤー
はエクセルの背面で、エクセルがアクティブの状態でした。まさに私の望む状態でした。
しかし、その状態(エクセルが手前でアクティブ、メディアプレーヤーは背面)でSub test3()を再度実行すると、
なぜかメディアプレーヤーが手前になりアクティブになってしまいます。

ちなみに自宅のパソコン(VISTA)ではまったく逆で、メディアプレーヤーが起ちあがる前にSub test3()を
実行すると、メディアプレーヤーが手前に出て、メディアプレーヤーが起ちあがっている状態でSub test3()
を実行すると、エクセルが手前でアクティブになります。

このマクロを「試行2」の後の
Option Explicit
から
Excelを常に手前に設定解除

 End Sub
までを標準モジュールのModule9に一まとめにしているのですが、それが原因でしょうか?
Module9の中では
Option Explicit
Sub Excelを常に手前に設定()
Sub Excelを常に手前に設定解除()
Sub test3()
に分かれていて、この中の Sub test3()を実行しています。

だれかに意見を聞く前に、自分で考えて実行してから聞くのが筋ではありますが、何分にも私の理解を
はるかに超えておりますので、ichinose様に頼りきっております。
ご迷惑をおかけいたしますが、よろしくお願いいたします。


 実際に私がデバッグできれば、よいのですが、細かいテストが出来ないので
 こっちの方がはやいかなあ

 ここからは、仕様を変えるのでマルコさん側でも検討して頂かなくてはなりません。

 今までは、サウンドオブジェクトを鳴らすという仕様でしたが、
 今度は、Wavファイルを鳴らすという仕様です。
 よって、WAVファイルも一緒に必要になります。

 Declare Function sndPlaySound Lib "winmm.dll" Alias "sndPlaySoundA" (ByVal lpszSoundName As String, ByVal uFlags As Long) As Long
 '0: 同期
 '1: 非同期
 'APIの宣言↑
 Sub 試行3()
   Dim ifile$
   '↓フルパスサウンドファイル名
   ifile$ = ThisWorkbook.Path & "\何かのWAvファイル.wav"
  sndPlaySound ifile$, 1
 End Sub

 常に外部にwavファイルが必要になる点が異なってきます。

 ichinose


ichinose様

お世話になります。
ただいま私は遅いゴールデンウイークということで休暇をとっております。
すぐに試すことができませんので、報告はしばらくお待ちください。

先日、私なりにもいろいろと試してみました。
以前ichinoseさんがほかの方へアドバイスされていた、メディアプレーヤーコントロールというのにもチャレンジ
しましたが、メディアプレーヤーの貼り付け方がわからない・・・という初心者レベルの挫折をしました。
今回のAPIというのも早速試してみます。

現在このファイルはXPパソコンで試用として活用しています。これで成果が認められれば予算もついて専用
パソコンを購入できるのですが、新品のパソコンを使ったとたんに使用できなくなるのでは話になりませんので
困っておりました。
いつも本当にお世話になります。 ありがとうございます。


ichinose様

お世話になります。
先ほど帰宅しましたので、自宅のパソコンで試してみました。
試行3の場合、
>常に外部にwavファイルが必要になる点が異なってきます。
と、ありますが、現在試しているbookのどこかにwavファイルを挿入するということでしょうか。
ちなみに

 ifile$ = ThisWorkbook.Path & "\何かのWAvファイル.wav"
この部分を
 ifile$ = ThisWorkbook.Path & "C:\音声案内\1.wav"    ←音声案内というフォルダ内の1というwavファイル
としたのですが、試行3を実行しても何の反応もありません。何かのWAvファイル というのは鳴らしたいwav
ファイルのリンク先ではだめなのでしょうか。
よろしくお願いいたします。

  マルコ


 まず、

 sub check1()
   msgbox ThisWorkbook.Path & "C:\音声案内\1.wav"
 end sub

 同じモジュールに上記のコードをコピーして、表示されるパスを確認してください

 正しいパスが表示されていますか?

 api sndPlaySoundは、存在しないWAVファイルを指定してもプログラムは
 止まりません。

 これで再度、検討してみてください

 ichinose

   


ichinose様

お世話になります。
試行3は成功しました。
作成したエクセルファイルとWAVファイルを同じフォルダに入れなければだめだったのですね。
初歩的なミスでつまづいてしまいました。
明日、試行3を職場のパソコンで試してみます。
ありがとうございました。


ichinose様

お世話になります。 マルコです。

試行3は職場のパソコン(Win7とExcel2010)でも正常に動作しました。
現在自宅パソコンでメディアプレーヤーの部分を修正しています。
まずAPIの宣言をして、メディアプレーヤーの部分
ActiveSheet.OLEObjects("Object 24").Verb Verb:=xlPrimary
を下記のように書き換えたところ、うまく警報を出すことができました。

 Dim ifile$
   '↓フルパスサウンドファイル名
   ifile$ = ThisWorkbook.Path & "\何かのWAvファイル.wav"
  sndPlaySound ifile$, 1

ichinoseさんには親切丁寧に教えていただきましてありがとうございます。
私にとってAPIというものはまだ「秘密の呪文」の域ですが、教えていただいたことを参考にいろいろな場面で
応用してまいります。

このたびは本当にありがとうございました。


コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.