• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:vbaでmsgboxの位置を指定)

VBAでMsgBoxの位置を指定する方法

このQ&Aのポイント
  • VBAでMsgBoxの位置を指定する方法について質問です。
  • 参考にしたページでは、SetWindowsHookEx関数を使用して位置を指定していますが、エラーが発生しています。
  • Appオブジェクトについても説明がないため、Object型にしていますが、正しい方法がわかりません。VBAで位置を指定する方法を教えてください。

質問者が選んだベストアンサー

  • ベストアンサー
  • nicotinism
  • ベストアンサー率70% (1019/1452)
回答No.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

TWOAWZFHUH
質問者

お礼

回答ありがとうございました。

その他の回答 (1)

  • mitarashi
  • ベストアンサー率59% (574/965)
回答No.1

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で実現する方が無難だと存じます。

TWOAWZFHUH
質問者

お礼

フォームを使う手もあるのですね。いろいろ試してみます。ありがとうございました。

関連するQ&A