【VB6・VBAメモ】MsgBox最前面表示

メッセージダイアログが背面に表示され

メッセージダイアログが背面に表示される・・・

VB6・VBAでメッセージダイアログを表示する場合はMsgBox関数を使用するかと思います。
これを使用した際に他アプリケーションの背面にメッセージダイアログが表示されてしまって困ったことはないでしょうか?

私もVB6の画面から呼び出したExcelVBAのMsgBoxがVB6画面の背面に表示され、
顧客からはフリーズしたとクレームがきて困ったことが多々・・・(タスクバーにはメッセージの表示はあるのにね;)

私が検証した限りではExcelウィンドウを非表示にした状態でMsgBox関数を使用すると発生するようです。
なんとなくWindowsVista+Office2007になった辺りから発生している気がします。

vbMsgBoxSetForegroundでは最前面表示されない

実はMsgBox関数の第2引数の定数(VbMsgBoxStyle列挙体)にはvbMsgBoxSetForegroundというものが存在します。
名前からしてこれを指定すれば最前面表示しそうなものですが、これでは動作しないようです。
どうやらExcel内の画面で最前面に表示しているだけで、他アプリケーションの画面より前面には表示してくれないようです。

'[NG例]メッセージダイアログは最前面されない'
Call MsgBox("メッセージ", vbMsgBoxSetForeground)

vbSystemModalを使用する

MsgBox関数の第2引数の定数(VbMsgBoxStyle列挙体)にはvbSystemModalというものも存在します。
vbSystemModalを指定すると他アプリケーションの画面より前面に表示されるようです。

'メッセージダイアログが最前面表示される'
Call MsgBox("メッセージ", vbSystemModal)

MsgBoxが最前面表示される

※私の試した限りでは大丈夫でしたが、もしかしたら対応できないパターンもあるかもしれません。

ボタン種類の設定と併用する場合

なお、MsgBox関数の第2引数は[はい][いいえ]などのボタン設定なども兼ねていますが、
こちらも論理和(OR)で一緒に設定すれば問題なく動作します。(引数に関してはMsgBox関数の記事を参考にしてください)

'ボタン設定との併用も可能'
Call MsgBox("メッセージ", vbYesNo Or vbSystemModal)

ボタン種類の設定と併用



コメント
コメントする








    
この記事のトラックバックURL
トラックバック