Win 7でのMsgBox関数(VBA)

解決


熊谷隆史  2010-10-20 12:04:58  No: 102605  IP: 192.*.*.*

こんにちは。
Windows 7になってVBA(Excel2010)のMsgBox関数でシステムサウンドが
鳴らなくなったのですが、これは何か明確な理由があるのでしょうか。

内部の呼び出しはMessageBoxAのはずなのに(TaskDialogに変更されたわけでもないですし)。
最もこちらも鳴りませんが。

# MsgBox関数の直前にMessageBeep APIを呼び出す関数を作れば済む話ではありますが。

編集 削除
シー  2010-10-21 16:41:40  No: 102606  IP: 192.*.*.*

メッセージボックスのサウンドは、OS側の設定で関連付けられています。
「コントロールパネル」→「サウンド」の設定から、
サウンドタブの設定を確認してみてください。
ここで音声が割り付けられていないと、鳴りません。

また、Msgbox側にQuestion、Informationなどのアイコンが何も設定されていない場合は鳴らすことができないかもしれません。
(設定項目に見当たらないため)

編集 削除
魔界の仮面弁士  2010-10-21 18:16:12  No: 102607  IP: 192.*.*.*

サウンドについては、以前のバージョンから鳴る環境と鳴らない環境がありましたが、
それが OS 依存なのか Office バージョン依存なのかは調べていません。
かつては、Excel / Word / Access 間でも差異がありましたね。


> これは何か明確な理由があるのでしょうか。
私は情報を持ち合わせていません。どうなのでしょうね。
何らかの要因があって鳴らないのか、意図的にそのように変更したのか。。。

鳴らない方が嬉しいという意見もあるようですけれど。
http://officetanaka.net/excel/excel2010/021.htm


> 内部の呼び出しはMessageBoxAのはずなのに
Excel はどうだか分かりませんが、少なくとも過去の Access はそうではありませんでした。
2000 を境に仕様が変更されてはいますが、今でも Eval 経由で MsgBox を呼び出すと、
Access では OS 標準と異なるメッセージボックスが表示されます。


> # MsgBox関数の直前にMessageBeep APIを呼び出す関数を作れば済む話ではありますが。
作ってみました。関数名は意図的に MsgBox のままにしています。Office 2010 では未検証。
VB4 や Office 97 あたりで使う場合は、「As 列挙型」→「As Variant」の方が良いかも。

Option Explicit

'Vista 環境では KB951119 適用推奨
#If Win64 Then
   Declare PtrSafe Sub MessageBeep Lib "User32" (ByVal uType As Long)
#Else
   Declare Sub MessageBeep Lib "User32" (ByVal uType As Long)
#End If

Public Function MsgBox(Prompt As Variant, _
        Optional Buttons As VbMsgBoxStyle = vbOKOnly, _
        Optional Title As Variant, _
        Optional HelpFile As Variant, _
        Optional Context As Variant) As VbMsgBoxResult

    Dim uType As Long
    uType = CLng(Buttons And &HF0)
    Select Case uType
        Case vbCritical, vbQuestion, vbExclamation, vbInformation
            MessageBeep uType
        Case Else
            MessageBeep 0&
    End Select

    If IsMissing(HelpFile) Or IsMissing(Context) Then
        MsgBox = VBA.Interaction.MsgBox(Prompt, Buttons, Title)
    Else
        MsgBox = VBA.Interaction.MsgBox(Prompt, Buttons, Title, HelpFile, Context)
    End If
End Function

編集 削除
熊谷隆史  2010-10-22 12:49:37  No: 102608  IP: 192.*.*.*

シーさん、回答ありがとうございます。
件の設定項目を確認しましたが問題なさそうでした。

魔界の仮面弁士さん、回答ありがとうございます。
> Excel はどうだか分かりませんが、少なくとも過去の Access はそうではありませんでした。
> 2000 を境に仕様が変更されてはいますが、今でも Eval 経由で MsgBox を呼び出すと、
> Access では OS 標準と異なるメッセージボックスが表示されます。
Access97は独自のダイアログを出していたのは承知していましたが、
現在は違う様な気が致します。

> 'Vista 環境では KB951119 適用推奨
こちらは知りませんでした。
x64版も考慮したコードを載せて頂きましてありがとうございます。
プロの方が書かれるとさすがに、洗練されてますね。

APIの仕様変更を受けてラッパーであるMsgBox関数も
鳴らなくなったと解釈してましたが
Win 7に限らず、以前の環境でも鳴らない事があるのですね。

編集 削除