http://oshiete.goo.ne.jp/qa/5253604.html
を参考に、http://homepage1.nifty.com/rucio/main/technique/ …をやってみたのですが
うまくいきません。
検証はエクセル・アクセス2007で行いました。
//////////////////////////////////////////////////////////////////
Option Explicit
Dim App As Object
Private Declare Function SetWindowsHookEx Lib "user32" Alias "SetWindowsHookExA" _
(ByVal idHook As Long, _
ByVal lpfn As Long, _
ByVal hmod As Long, _
ByVal dwThreadId As Long) As Long
Private Declare Function UnhookWindowsHookEx Lib "user32" _
(ByVal hHook As Long) As Long
Private Declare Function SetWindowPos Lib "user32" _
(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 wFlags As Long) As Long
Const WH_CBT = 5
Const HCBT_ACTIVATE = 5
Public Const SWP_NOSIZE = &H1 '「サイズを指定しない」オプション
Public Const SWP_NOZORDER = &H4 '「Zオーダーを指定しない」オプション
Public Const SWP_NOACTIVATE = &H10
Dim HookHandle As Long '元のCBTProcプロシージャへのハンドル
Dim m_Left As Long 'メッセージボックスのX座標
Dim m_Top As Long 'メッセージボックスのY座標
Public Sub SetMsgBox(Left As Long, Top As Long)
m_Left = Left
m_Top = Top
HookHandle = SetWindowsHookEx(WH_CBT, AddressOf CBTProc, App.Hinstance, App.ThreadID)
End Sub
Private Function CBTProc(ByVal nCode As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
Dim Ret As Long
If nCode = HCBT_ACTIVATE Then
Ret = SetWindowPos(wParam, 0, m_Left, m_Top, 0, 0, SWP_NOSIZE Or SWP_NOZORDER Or SWP_NOACTIVATE)
Ret = UnhookWindowsHookEx(HookHandle)
End If
CBTProc = Ret
End Function
//////////////////////////////////////////////////////////////////
を標準モジュールに貼りつけました。
Dim App As Objectについては、参考のページにはありませんでしたが
エラーになるので勝手にObjectにしました。
そしてこのコードを書いた標準モジュールに
Sub test()
SetMsgBox 0, 0
MsgBox "この例では左上に表示されます。"
End Sub
を足しました。
そして実行すると、
HookHandle = SetWindowsHookEx(WH_CBT, AddressOf CBTProc, App.Hinstance, App.ThreadID)
の部分で
オブジェクト変数または With ブロック変数が設定されていません。(Error 91)
になります。
VBAでの位置の指定方法を教えてください!!!
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
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で実現する方が無難だと存じます。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Access(アクセス) Vba Userformを前面に出すについて 3 2022/04/15 12:29
- Visual Basic(VBA) いつもお世話になっております、VBAで教えて頂きたいのですが 2 2022/05/05 22:20
- Excel(エクセル) 【マクロ】スクショ印刷がうまく動かない件 5 2022/12/06 17:37
- Visual Basic(VBA) VBAで質問ですが、皆さんはどの様に導き出しているのでしょうか? 6 2022/05/03 21:53
- Visual Basic(VBA) batからexeを実行し戻り値を受け取る バッチからEXEの結果を受け取りたいのですが、 下記のバッ 1 2023/07/04 15:13
- Visual Basic(VBA) 別シートから年齢別の件数をカウントしたいの続き 5 2023/01/24 00:16
- Excel(エクセル) VBAの指示の内容 昨日こちらでご教示頂いたのですが初心者な為、一つ一つの指示が何をやっているのかわ 2 2022/10/25 18:08
- Visual Basic(VBA) batからexeを実行し戻り値を受け取る EXEの実行内容の結果によって、戻り値を0か1かで返したい 1 2023/07/04 16:40
- Visual Basic(VBA) VBA処理追加 こちらでご教示頂いたのですが回答完了させてしまいましたのでこちらからまた質問させてく 2 2022/10/27 09:57
- Visual Basic(VBA) VBA 別ブックからの転記の高速化について VBA 別ブックからの転記の高速化についてご教授下さい。 19 2022/07/26 13:07
このQ&Aを見た人はこんなQ&Aも見ています
-
性格の違いは生まれた順番で決まる?長男長女・中間子・末っ子・一人っ子の性格の傾向
同じ環境で生まれ育っても、生まれ順で性格は違うものなのだろうか。家庭教育研究家の田宮由美さんに教えてもらった。
-
エクセルVBAで、MsgBox やInputBox は、画面の中央以外に表示させたい。
Excel(エクセル)
-
msgboxの表示位置
Visual Basic(VBA)
-
Excel VBAメッセージボックスの表示位置が右下になってしまう
Excel(エクセル)
-
-
4
Inputboxの表示位置(VBA)
Excel(エクセル)
-
5
VBAにてメッセージボックスを最前面に表示させる
その他(プログラミング・Web制作)
-
6
VBAで保存しないで閉じると空のBookが残る
Excel(エクセル)
-
7
メッセージボックスを前面に表示させるには?
Visual Basic(VBA)
-
8
メッセージボックスに表示する文字を大きくしたい
Excel(エクセル)
-
9
VBAでエクセルシートを更新(リフレッシュ)する方法を教えて下さい。
Excel(エクセル)
-
10
Excel-VBAでInputBox+Pulldownは可能??
Visual Basic(VBA)
-
11
エクセルVBAのフォームを最前面にする方法を教えてください。
Visual Basic(VBA)
-
12
エクセルVBAでUserFormを起動した時
Excel(エクセル)
-
13
フォントの大きさ
Visual Basic(VBA)
-
14
【VBAユーザーフォームで閉じるボタンを表示したくない】
Visual Basic(VBA)
-
15
エクセルVBA テキストボックスへのセットフォーカスについて
Visual Basic(VBA)
-
16
エクセルのラベルの値(文字列)を垂直方向で中央揃えにするには?
Excel(エクセル)
-
17
VBAでユーザーフォームの表示を確認
Visual Basic(VBA)
-
18
Vba Userformを前面に出すについて
Access(アクセス)
-
19
ExcelVBAでPDFを閉じるソース
その他(Microsoft Office)
-
20
ユーザーフォーム上にアイコンの表示
Visual Basic(VBA)
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
smartvisionで録画失敗が頻発
-
Excel:アドイン(ThisWorkbook)...
-
エクセルVBAでNumLockキーの状...
-
ワークシートのコピーVBAでうま...
-
別シートのマクロを実行する方法
-
Application.Runエラー(1004)
-
エクセルVBAで、ボタンの文字を...
-
ExcelのVBAでDisplayalertsで警...
-
エクセルのマクロボタンが編集...
-
access2010 コマンドまたはアク...
-
プロシージャが大きすぎます!
-
Access終了時にマクロまたはVBA...
-
シート保護を掛けたまま並べ替...
-
別シートのトグルボタンを指定...
-
アクセスでauto_openは使えない?
-
Workbook_Openを起動時以外に呼...
-
マクロとモジュールの違いを教...
-
オートシェイプの黄色いハンド...
-
アクセス:検索フォームボタンに...
-
ExcelVBAで右クリックメニュー...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
エクセルVBA フォームShowでオ...
-
エクセルVBAでNumLockキーの状...
-
vbaでmsgboxの位置を指定
-
【Excel】BeforeCloseを毎回呼...
-
VBAが得意な方 助けてください...
-
エクセルのダブルクリックで
-
Pic16f690でpwm信号を作る。c言...
-
smartvisionで録画失敗が頻発
-
HULFT完了コードについて
-
PHPかCGIか迷っています
-
フォームを作成すると同時にイ...
-
ExcelのVBでタイピングゲームも...
-
ラウザ経由でエクセルVBAを実行...
-
Excel:アドイン(ThisWorkbook)...
-
エクセル2003のマクロでコマン...
-
エクセルVBAでワークシートのコ...
-
別シートのマクロを実行する方法
-
エクセルのマクロボタンが編集...
-
Application.Runエラー(1004)
-
Access終了時にマクロまたはVBA...
おすすめ情報