- ベストアンサー
VBAでMsgBoxの位置を指定する方法
- VBAでMsgBoxの位置を指定する方法について質問です。
- 参考にしたページでは、SetWindowsHookEx関数を使用して位置を指定していますが、エラーが発生しています。
- Appオブジェクトについても説明がないため、Object型にしていますが、正しい方法がわかりません。VBAで位置を指定する方法を教えてください。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
mitarashi さんの回答が無ければ投げ出していました。。 あれぇ? メッセージボックスではなくてExcelが移動してしまうよ?? Sub test() SetMsgBox 0, 0 MsgBox "この例では左上に表示されます。" End Sub は、VBE上で実行してはダメなんですね。。 Excelに戻ってマクロの実行で test を行ったら出来ました。 Access2010 だとどうかなと?調べて以下のように加えたら出来ました。 意味は全く理解していません (^^ゞ コピペッタンしただけです。 子供が絵本見ながら脳外科の手術を行っているようなものです orz 'VB6 の App.ThreadID の代わり Private Declare Function GetCurrentThreadId Lib "kernel32" () As Long 'VB6 の App.hInstance の代わり ExcelではApplication.hInstance のみで可、 Access用 Private Const GWL_HINSTANCE = (-6) Private Declare Function GetWindowLong Lib "user32" _ Alias "GetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long) As Long 'HookHandle = SetWindowsHookEx(WH_CBT, AddressOf CBTProc, App.hInstance, App.ThreadID) 'VB6 'HookHandle = SetWindowsHookEx(WH_CBT, AddressOf CBTProc, Application.hInstance, GetCurrentThreadId) 'Excel HookHandle = SetWindowsHookEx(WH_CBT, AddressOf CBTProc, GetWindowLong(hWndAccessApp, GWL_HINSTANCE), GetCurrentThreadId) 'Access
その他の回答 (1)
- mitarashi
- ベストアンサー率59% (574/965)
xl2010で試してみました。 >Dim App As Objectについては、参考のページにはありませんでしたが >エラーになるので勝手にObjectにしました。 このAppはエクセル自体を指すので、これでは駄目です。 App.Hinstanceと、App.ThreadIDを取得して指定する必要があります。 昔のバージョンでやったときは、Hinstanceも、hWndもAPIを用いて取得する必要があったと記憶しておりますが、現在では若干楽になっておりますね。 下記で動作しました。 HookHandle = SetWindowsHookEx(WH_CBT, AddressOf CBTProc, Application.Hinstance, GetCurrentThreadId) ここで、GetCurrentThreadIdは、 Private Declare Function GetCurrentThreadId Lib "kernel32.dll" () As Long を用いています。 最初、Application.hWndから、GetWindowThreadProcessIdで取得したThreadIdでやってみましたが、こちらでは駄目でした。 でもフックをしてまでやることではなく、Userformで実現する方が無難だと存じます。
お礼
フォームを使う手もあるのですね。いろいろ試してみます。ありがとうございました。
お礼
回答ありがとうございました。