- ベストアンサー
エクセルのVBAで
MsgBoxが画面の中央でなく、任意の位置におきたいのですが、InputBoxは位置指定できるのに? 何かいい方法があれば教えてください。 よろしくお願いいたします。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
以前はユーザーフォームでメッセージボックスを作って自由な位置に表示していました。 ユーザーフォームに ラベルを配置・・・メッセージ表示用 ボタンを配置・・・必要な個数を配置し選択する 必要ならラベルにアイコンイメージを読み込む ユーザーフォームのCaptionの変更、メッセージ長に対応してユーザーフォームの幅変更 横位置、縦位置を指定し動かす(Moveメソッド使用) 押したボタンにより処理の分岐 などを処理するユーザー定義関数を作り、関数内でメッセージボックスの変わりのユーザーフォームを表示します。 MsgBoxの引数に対応するようにアイコンを読み込んだり、引数によりボタンの個数を変えたりして、はまり込んで結構遊べました。しかし、近ごろは堂々と画面の真ん中に出しています。本来の処理より指定位置に出すことにイッショウケンメイになってたりして・・・。邪魔だったら動かせばいいと思うようになりました。当り障りのない場所に表示すると忘れられたりします・・・ ご参考に。
その他の回答 (1)
- baka
- ベストアンサー率83% (15/18)
Excel 2000 以降でしたら SetWindowsHookEx 関数を使えば可能ですが、#1 の方法がわかりやすくていいと思いますし、そもそも位置を気にしないほうがいいと思います。 参考までにサンプルを紹介しておきます。標準モジュールに次を記述し、実行は VBE からではなく Excel から行ってください。ユーザーフォームに記述する場合、ウィンドウハンドルの取得は FindWindow("ThunderDFrame", Caption) となります。 Option Explicit Public Const GWL_HINSTANCE = (-6) Public Const WH_CBT = 5 Public Const HCBT_ACTIVATE = 5 Public Const SWP_NOSIZE = &H1 Public Const SWP_NOZORDER = &H4 Public Const SWP_NOACTIVATE = &H10 Public Declare Function SetWindowsHookEx Lib "user32.dll" Alias "SetWindowsHookExA" (ByVal idHook As Long, ByVal lpfn As Long, ByVal hMod As Long, ByVal dwThreadId As Long) As Long Public Declare Function UnhookWindowsHookEx Lib "user32.dll" (ByVal hhk As Long) As Long Public Declare Function FindWindow Lib "user32.dll" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long Public Declare Function GetWindowLong Lib "user32.dll" Alias "GetWindowLongA" (ByVal hWnd As Long, ByVal nIndex As Long) As Long Public Declare Function SetWindowPos Lib "user32.dll" (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 uFlags As Long) As Long Public glngHook As Long Public glngX As Long Public glngY As Long Public Function MsgBoxHookProc(ByVal uMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long If uMsg = HCBT_ACTIVATE Then SetWindowPos wParam, 0, glngX, glngY, 0, 0, SWP_NOSIZE Or SWP_NOZORDER Or SWP_NOACTIVATE UnhookWindowsHookEx glngHook End If MsgBoxHookProc = False End Function Public Sub test() glngX = 10 'ピクセル単位で指定します glngY = 10 glngHook = SetWindowsHookEx(WH_CBT, AddressOf MsgBoxHookProc, GetWindowLong(FindWindow("XLMAIN", Application.Caption), GWL_HINSTANCE), 0) MsgBox "任意の位置にメッセージボックスを表示します。", vbInformation End Sub
補足
ありがとうございました。