dポイントプレゼントキャンペーン実施中!

よろしくお願いします
エクセルは2013、WIN8.1です

PCからアンプにUSB接続でスピーカーを鳴らしています
アンプの電源を入れ忘れると次のエラーが出ます
実行時エラー '-2147200966(8004503a)':
'Speak'メソッドは失敗しました:'Speech'オブジェクト 

マクロは次のように書いています
On Error Resume Next
Application.Speech.Speak "test", True

これはハードのエラーなので、エラー処理は無理でしょうか

質問者からの補足コメント

  • WindFallerさん、こんにちは
    これまでにも、高度なテクニックを何度も教えていただいてお世話になっております

    休日の貴重な時間に教えていただきありがとうございます
    早速やってみます
    報告までは時間がかかるかとおもいます
    ありがとうございました

    No.2の回答に寄せられた補足コメントです。 補足日時:2017/09/10 13:13
  • WindFallerさん、こんにちは。自己流ですがマクロできました。

    Call GetSounddevice
    If Range("G97") = "ON" Then
    Application.Speech.Speak "テスト テスト", True
    Else
    MsgBox "SONY OFF"
    End If

    'MsgBox MesStr
    Range("H37") = MesStr
    'F97:接続機器(例えば SONY)
    If InStr(Range("H37"), Range("F97")) Then
    Range("G97") = "ON"
    Else
    Range("G97") = "OFF"
    End If

    No.5の回答に寄せられた補足コメントです。 補足日時:2017/09/12 14:13
  • 文字数の制限で全て書けませんでしたので説明させてください
    'MsgBox MesStr 以下は GetSounddeviceの自己流修正部分です

    Range("G97") = "OFF"
    End If
    この下は
    Set objClassSet = Nothing
    Set objClass = Nothing
    Set objService = Nothing
    Set objLocator = Nothing
    です

      補足日時:2017/09/12 14:29
  • WindFallerさん、大変お世話になっております

    自分なりにエラー処理をしているのですが、よくよく考えてみると
    SONYのアンプがONかOFFか判断するよりも
    「音を鳴らせるサウンドデバイスが1つ以上存在するか」というチェックができれば
    これが一番簡単で機器変更にも対応できるエラー処理のような気がします

    実際、一時SONYを修理に出してオンボードで鳴らしていた時期もありました
    MsgBoxにSONYの文字が無くても、オンボードのサウンドが有効であれば問題ないかと思います

    「音を鳴らせるサウンドデバイスが1つ以上存在するか」というチェックはマクロで
    できるのでしょうか

      補足日時:2017/09/12 18:32

A 回答 (7件)

こんにちは。



おまたせしてすみません。今回は、私自身が、学ばせていただきました。

お書きになっていたコードを私なりに書き換えてみました。
ユーザー定義関数ですが、ちょっと工夫をしてみました。
何も入れない状態ですと、数値を吐き出し、名称を入れると、その名称を調べます。


'//
Sub CheckSoundDevice()
Dim DevName As String
DevName = ""  '"SONY"
If GetSoundDevices(DevName) Then
 Application.Speech.Speak "テスト テスト", True
Else
MsgBox DevName & " OFF"
End If
End Sub

Function GetSoundDevices(Optional ByVal soundDevice As String) As Variant
'空白値ですと、
 Dim MesStr As String
 Dim objLocator As Object
 Dim objService As Object
 Dim objClassSet As Object
 Dim objClass As Object
 Dim iflg As Variant

 'ローカルコンピュータに接続する。
 Set objLocator = CreateObject("WbemScripting.SWbemLocator")
 Set objService = objLocator.ConnectServer
 Set objClassSet = objService.ExecQuery("Select * From Win32_SoundDevice")
 If soundDevice = "" Then
  iflg = objClassSet.Count '数値を出力
 Else
  For Each objClass In objClassSet
   If InStr(1, objClass.Name, soundDevice, vbTextCompare) > 0 Then
    iflg = True 'True/False を出力
   End If
  Next
 End If
 GetSoundDevices = iflg
 Set objClassSet = Nothing
 Set objClass = Nothing
 Set objService = Nothing
 Set objLocator = Nothing
End Function
    • good
    • 0
この回答へのお礼

WindFallerさん、おはようございます
4時ごろまでやっていたのですが寝てしまいました

1、==================

'DevNameがヌルでUSB接続のSNYが電源OFFなら
'Application.Speech.Speak "Deviceは、" & DevName, True
'でエラー停止になるのでSpeech.Speakさせない

ことにしました
以下がそのマクロです

Sub CheckSoundDevice()
  Dim DevName As String
  'DevName = ""
  DevName = Range("H37") 'SONY or 空白 or 他の機器名

  'DevNameがヌルで電源OFFなら
  'Application.Speech.Speak "Deviceは、" & DevName, True で
  'エラー停止になるのでSpeech.Speakさせない
  If GetSoundDevices(DevName) Then
If DevName <> "" Then
    Application.Speech.Speak "Deviceは、" & DevName, True
   Else
MsgBox "デバイス不明でスピーチ中止。H37にSONY(半角大文字)を登録する"
End If
Else
MsgBox DevName & " を ON にする"
End If

End Sub

2、======================
iflgをセルに表示しました

If soundDevice = "" Then
iflg = objClassSet.Count '数値を出力
Range("G37") = iflg
Else

3、さらにNo.5で教えていただいたマクロで、Sub 試聴 を作ってみます
  接続機器がMsgBoxで表示されるので大変貴重なマクロです

私には絶対作れないマクロを親切丁寧に面倒見ていただき大変感謝しています
WindFallerさん作成のマクロを実行するときは、結果が楽しみでいつもドキドキ
です

お礼日時:2017/09/14 07:31

今、読んだだけですが、思わくが当たりましたので、これで出来ます!


ちょっと今、手が離せないことがありますが、後ほど、マクロを纏めてみます。
締めないでください。
    • good
    • 0
この回答へのお礼

こんにちは
No.5の回答の補足をご覧ください
お陰様で順調に動いております

スピーチ前に、その都度マクロをコールすると処理が遅れるかと心配しましたが
全く影響ありません

エクセルマクロでは無理と思ってましたので
ここまでできて感謝感激です

お礼日時:2017/09/12 15:29

試しに、このマクロで、device の Dead or Alive の違いが出るでしょうか?



Sub GetSounddevice()
 Dim MesStr As String
 Dim objLocator As Object
 Dim objService As Object
 Dim objClassSet As Object

 'ローカルコンピュータに接続する。
 Set objLocator = CreateObject("WbemScripting.SWbemLocator")
 Set objService = objLocator.ConnectServer
 Set objClassSet = objService.ExecQuery("Select * From Win32_SoundDevice")

 For Each objClass In objClassSet
  MesStr = MesStr & "Name: " & objClass.Name & vbCrLf
 Next
 MsgBox MesStr
 Set objClassSet = Nothing
 Set objClass = Nothing
 Set objService = Nothing
 Set objLocator = Nothing

End Sub
この回答への補足あり
    • good
    • 0
この回答へのお礼

WindFallerさん、こんばんは
いつも最後まで面倒見ていただきありがとうございます

教えていただいたマクロを早速実行してみると
「objClass の変数が定義されていない」というメッセージが出ましたので
Dim objClass As Object の一行を追加しました

そして再度実行してみました
見事にメッセージボックスが出ました
マクロでここまでできるとは感動ものです

メッセージは次の通りです

アンプの電源 ”入り” で実行すると
Name:SONY USB DAC Amplifire
Name:Realtec High Definition Audio
               OKボタン
のメッセージが出ました

アンプの電源 ”切り” で実行すると
Name:Realtec High Definition Audio
               OKボタン
のメッセージです

サウンド窓の再生タグの表示は次のようになっています
スピーカー
Realtec High Definition Audio
無効

上記のように、オンボードのRealtec High Definition Audioを無効にして
SONY USB DAC Amplifire を通して音がなるように設定しています

見事に、第一段階である、”アンプ電源の入り切り”を検知しています
ありがとうございました

私の知識ではこの先はお手上げです
これから、どういう処理をしたら良いでしょうか

お礼日時:2017/09/12 02:39

すみませんでした。


こちらで再現性が取れないのと、最近、事情があって昼間の数時間しか、本当の集中的な時間が取れないのです。それで、今、二つの方法を考えている最中です、
ひとつは、Win32 API で、再生デバイスを取得する方法と、もうひとつは、WMI に方法はなかったか、情報を取れないかと考えています。ご自身でも、可能かもしれませんね。
ネット検索で、StackOverFlow 掲示板にもあるにはあるのですが、解決策が見えてきません。

必ず、もう一度、可能・不可能の結果はお知らせします。
    • good
    • 0
この回答へのお礼

WindFallerさん、こんばんは
昼の時間帯に教えていただきながら、報告が深夜になってしまい申し訳ありません

また、いつも、目的達成まで何度も教えていただいて恐縮しています

お礼日時:2017/09/12 01:56

maamaaさん、


私がマクロ音痴な故に、恥晒しなことをして仕舞い、反省しています。
大変無礼なコメントを差し上げたことを、深くお詫び申し上げます。

WindFallerさん、
ご指摘、ありがとうございました。
    • good
    • 0
この回答へのお礼

気にしないでください

お礼日時:2017/09/11 03:58

まず、#1のmike_(g)さんへ


>質問内容の何処が Excel と関係があるのでしょうか?

Application.Speech.Speak "test", True
このApplication は、一般的には、Excelのことです。

本題です。
この質問は、
>これはハードのエラーなので、エラー処理は無理でしょうか
つまり、音声装置(sound device)の dead or alive をAPI等を使って検査する方法かとは考えたのですが、Application.Speech ですと、その戻り値がありません。同様の質問は、ネット検索でも見つかるのですが、その解決手段が見当たりません。

そこで、ひとつの提案としては、Speech オブジェクトではなく、同じものを経由を変えてSAPI を使ってみたらどうかと考えています。あいにく、私のところでは、SAPIのStatus など調べてみたものの、出てきませんでした。それに、エラーがでませんので、エラートラップで挟むぐらいしかアイデアがありません。


Sub SpeakTest()
 Dim objSpch As Object
 Dim SAPIVoice As SpVoice '参照設定:Microsoft Speech Object Library
 Set SAPIVoice = New SpVoice
 Const jpSENTENSE As String = "わたしは月のうさぎ"
 Const enSENTENSE As String = "I am Pretty Guardian Salor-Moon"
 Const JP As String = "411"
 Const EN As String = "409"
 On Error Resume Next
 SAPIVoice.Speak "<xml><lang langid=""" & JP & """>" & jpSENTENSE
 SAPIVoice.Speak "<xml><lang langid=""" & EN & """>" & enSENTENSE
 On Error GoTo 0
End Sub
この回答への補足あり
    • good
    • 0
この回答へのお礼

WindFallerさん、親切に教えていただきありがとうございます
仕事の都合で報告がこの時間帯になってしまいました

密かに期待して早速実行してみました
日本語と英語でSpeakしてくれます

ただ残念ながら、”アンプ電源入れ忘れ”に対してエラー処理はしてくれません

下記のエラーメッセージが出ます
実行時エラー '-2147200966(8004503a)':
'Speak'メソッドは失敗しました'IspeechVoice'オブジェクト

素人の私は、「エラーメッセージが出る=エラーと認識している」と
思うのですが、どうやら”On Error Resume Next”の限界のようです

休日の貴重な時間に教えていただきましてありがとうございました

お礼日時:2017/09/11 04:30

質問内容の何処が Excel と関係があるのでしょうか?


「アンプの電源を入れ忘れ」がどうして此処(Excel)と関係ありと思うのですか?
    • good
    • 0
この回答へのお礼

mike_gさん、こんにちは

gooの皆さんにお世話になって作ったマクロを8人で使っておりまして
前々から、「電源入れ忘れでマクロが止まるので対策を取れ」との苦情が有るのですが
私は、「ハードのエラーで無理」と逃げてきたのです

確かに「アンプの電源入れ忘れ」ですから、エクセルの範囲外なのですが
もしや、Application.Speech.Speak "test", True 自体にエラー処理の方法が
有ればと思い質問させていただきました

気分を害したようでお許しください

お礼日時:2017/09/10 13:08

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!