
いつもお世話になっております。
フォームにコマンドボタンを1つ配置たエクセルと、別にメモ帳を立上げています。
コマンドボタンを押す度にメモ帳 → VBAのフォーム → メモ帳とアクティブなアプリを切り替えて
行きたいです。
次のプログラムで試してみましたが、うまく切り替わりません。手動でALT + TABを押すと毎回切り替
わるのですが、VBAではうまく動作しません。単純なプログラムのためどこが間違っているのか見当が
つきません。よろしくご指導おねがいいたします。(Windows10 Excel 2016 64Bit)
'フォームモジュール
Private Sub UserForm_Initialize()
Dim ret As Long
Dim formHWnd As Long
formHWnd = FindWindow("ThunderDFrame", Me.Caption)
ret = SetWindowPos(formHWnd, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE Or SWP_NOSIZE)
Application.WindowState = xlMinimized
End Sub
Private Sub CommandButton1_Click()
SendKeys "%({TAB})"
End Sub
'標準モジュール
Declare PtrSafe Function FindWindow Lib "user32" Alias "FindWindowA" _
(ByVal lpClassName As String, ByVal lpWindowName As String) As Long
Declare PtrSafe Function SetWindowPos Lib "user32" _
(ByVal hwnd As LongPtr, ByVal hWndInsertAfter As LongPtr, _
ByVal X As LongPtr, ByVal Y As LongPtr, ByVal cX As LongPtr, _
ByVal cY As LongPtr, ByVal uFlags As LongPtr) As Long
Public Const SWP_NOMOVE = &H2
Public Const SWP_NOSIZE = &H1
Public Const HWND_TOPMOST = -1
Sub Auto_Open()
Application.WindowState = xlMinimized
UserForm1.Show vbModeless
End Sub
No.1ベストアンサー
- 回答日時:
具体的な現象がよく分からないのですが、コードから推測されるトラブルについて解説します。
・ウィンドウサムネイルが瞬間的に表示
Alt + Tab でのウィンドウ切替えは、Alt を Press しながらでの Tab の Down Up の繰り返しとなるだけに SendKeys では無理です。
少し動作は異なりますが、Ctrl + Alt + Tab で先ずウィンドウサムネイルを表示し、Tab または Shift + Tab でウィンドウを選択後に Enter で決定とした方が良いと思います。
・エラー発生
FindWindowA関数の戻り値は Win32型の HWND型 (メモリへの参照アドレスが格納される構造体のポインタ) です。
また、SetWindowPos関数の引数 hWndInsertAfter のデータ型は Win32型で HWND型ですが、今回は HWND_TOPMOST定数を使いますので VBA では Long型になります。モニタ座標は Win32型の int型 なので、同じく Long型です。
FindWindowA関数 | Microsoft Docs (英語)
https://docs.microsoft.com/en-us/windows/win32/a …
SetWindowPos関数 | Microsoft Docs (英語)
https://docs.microsoft.com/en-us/windows/win32/a …
' Excel 64Bit, 32Bit 共通コード。お好みでアレンジしてください。
' コード中の #If Win64 Then は Excel が 64Bit版かどうかを判定。
' Windows10 Excel 2007 (32Bit版のみ) で動作確認済み。
' Sleep関数の時間指定はミリ秒単位で少し長めに設定。
' フォームモジュール
Option Explicit
Private Sub UserForm_Initialize()
#If Win64 Then
Dim formHWnd As LongPtr
#Else
Dim formHWnd As Long
#End If
Const windowClassName As String = "ThunderDFrame"
formHWnd = FindWindow( _
windowClassName, _
Me.Caption)
Const HWND_TOPMOST As Long = -&H1
Const X As Long = 0
Const Y As Long = 0
Const cX As Long = 0
Const cY As Long = 0
Const SWP_NOMOVE As Long = &H2
Const SWP_NOSIZE As Long = &H1
Call SetWindowPos( _
formHWnd, _
HWND_TOPMOST, _
X, _
Y, _
cX, _
cY, _
SWP_NOMOVE Or SWP_NOSIZE)
Application.WindowState = xlMinimized
End Sub
Private Sub CommandButton1_Click()
Dim WshShell As Object
Set WshShell = CreateObject("WScript.Shell")
With WshShell
.SendKeys "^(%{TAB})"
Call Sleep(150)
.SendKeys "{TAB}"
Call Sleep(50)
.SendKeys "{ENTER}"
End With
Set WshShell = Nothing
End Sub
Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)
Application.WindowState = xlNormal
End Sub
' 標準モジュール
Option Explicit
#If Win64 Then
Public Declare PtrSafe Function FindWindow Lib "user32" _
Alias "FindWindowA" ( _
ByVal lpClassName As String, _
ByVal lpWindowName As String _
) As LongPtr
Public Declare PtrSafe Sub SetWindowPos Lib "user32" ( _
ByVal hwnd As LongPtr, _
ByVal hWndInsertAfter As Long, _
ByVal X As Long, _
ByVal Y As Long, _
ByVal cX As Long, _
ByVal cY As Long, _
ByVal uFlags As Long _
)
Public Declare PtrSafe Sub Sleep Lib "kernel32" ( _
ByVal ms As Long _
)
#Else
Public Declare Function FindWindow Lib "user32" _
Alias "FindWindowA" ( _
ByVal lpClassName As String, _
ByVal lpWindowName As String _
) As Long
Public Declare Sub 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 uFlags As Long _
)
Public Declare Sub Sleep Lib "kernel32" ( _
ByVal ms As Long _
)
#End If
Sub Auto_Open()
Application.WindowState = xlMinimized
UserForm1.Show vbModeless
End Sub
大変ご丁寧なご指導ありがとうございました。勉強になりました。
>Ctrl + Alt + Tab で先ずウィンドウサムネイルを表示し、Tab または Shift + Tab で
>ウィンドウを選択後に Enter で決定とした方が良いと思います。
知らなかったです。またSleepをいれることも気が付かなかったです。
但しSleepを何mSceにするかは、PCの処理能力によっても変える必要があ
ると思い処理能力のことなる複数のPCで利用することを考えると、汎用的
ではないかなと思いました。
質問後、自分でも色々調べましたがSendKeysは不安定であまり評判が良くな
い記事が多くみられました。
なのでこれから以前自分でも使用実績のあるkeybd_eventを使って試してみ
ようと思います。ありがとうございました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Access(アクセス) Vba Userformを前面に出すについて 3 2022/04/15 12:29
- Visual Basic(VBA) Vba LongPtrについて教えてください 2 2022/08/19 11:14
- Excel(エクセル) 【マクロ】スクショ印刷がうまく動かない件 5 2022/12/06 17:37
- Visual Basic(VBA) batからexeを実行し戻り値を受け取る バッチからEXEの結果を受け取りたいのですが、 下記のバッ 1 2023/07/04 15:13
- Visual Basic(VBA) batからexeを実行し戻り値を受け取る EXEの実行内容の結果によって、戻り値を0か1かで返したい 1 2023/07/04 16:40
- Visual Basic(VBA) VBAで質問ですが、皆さんはどの様に導き出しているのでしょうか? 6 2022/05/03 21:53
- Visual Basic(VBA) 【Excel VBA】自動メール送信の機能追加 5 2022/09/29 12:53
- Visual Basic(VBA) VBA 別ブックからの転記の高速化について VBA 別ブックからの転記の高速化についてご教授下さい。 19 2022/07/26 13:07
- Visual Basic(VBA) いつもお世話になっております、VBAで教えて頂きたいのですが 2 2022/05/05 22:20
- Visual Basic(VBA) 【変更】ファイルを閉じてダイアログで保存した時、更新したシートだけの処理の実行をする 5 2022/03/26 18:31
このQ&Aを見た人はこんなQ&Aも見ています
-
VBAで、なぜかSendkeyが効きません。
PowerPoint(パワーポイント)
-
ExcelVBAでスペースキー操作したい
Excel(エクセル)
-
VBAでの SendKeysの変数指定方法
Excel(エクセル)
-
-
4
VBSでのSendKeysでの画面の最小化
その他(プログラミング・Web制作)
-
5
エクセル:マクロ「Application.CutCopyMode = False」って?
Excel(エクセル)
-
6
エクセルVBAで SendKeys {TAB}""
Excel(エクセル)
-
7
Excelのセルにユーザー名を表示する方法
Excel(エクセル)
-
8
【sendkeysメソッドが動かずに苦慮しております】
Visual Basic(VBA)
-
9
メッセージボックスを前面に表示させるには?
Visual Basic(VBA)
-
10
Enterキーでマクロを起動さす。
その他(ソフトウェア)
-
11
エクセルでセルにユーザー名を表示させる関数は?
Excel(エクセル)
-
12
sendkeysにてALT+CTRL+INSERTを同時に行いたい
Visual Basic(VBA)
-
13
VBAでループ内で使う変数名を可変にできないか。
Visual Basic(VBA)
-
14
マクロ 実行ボタンを押さずに常に実行
Excel(エクセル)
-
15
AppActivateの使い方
PowerPoint(パワーポイント)
-
16
エクセルVBAで、MsgBox やInputBox は、画面の中央以外に表示させたい。
Excel(エクセル)
-
17
SQL文で パラメータが少なすぎます エラー
Access(アクセス)
-
18
【VBA】 Alt+PrintScreenにてアクティブウィンドウのスクショを貼付する方法
Excel(エクセル)
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
ユーザー定義関数に#NAME?が返...
-
VBAで別モジュールへの変数の受...
-
vba userFormのSubを標準モジュ...
-
モジュールとクラスの違いって...
-
エクセルVBAでシートモジュール...
-
Excel VBA 定義されたプロージ...
-
モジュールからフォームのボタ...
-
VBAで旧字体を異字体に一括で変...
-
大量の標準モジュールを解放す...
-
acwzlibとは?
-
VBAのモジュールについて教えて...
-
'Range'メソッドは失敗しました
-
Excel VBA 『Call』で呼び出す...
-
Excelシート内セル記述の違いに...
-
xoops myAlbum-Pで画像がアッ...
-
VBのフォームモジュールと標準...
-
プログラムでノッチフィルタの...
-
AddressOf と同じ機能を持った...
-
VBIDEで未使用の変数の抽出
-
【Excel VBA】標準モジュールに...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Excel VBAでリンク切れをチェッ...
-
Excel VBAで、ユーザーフォーム...
-
ユーザー定義関数に#NAME?が返...
-
vba userFormのSubを標準モジュ...
-
Excel VBA 定義されたプロージ...
-
モジュールとクラスの違いって...
-
モジュールの最大数はいくつな...
-
VBAで別モジュールへの変数の受...
-
Excel VBA 『Call』で呼び出す...
-
エクセルVBAでシートモジュール...
-
VBでグローバル変数を宣言するには
-
【vba】フォームに書いてあ...
-
SendKeysの使い方について
-
モジュールからフォームのボタ...
-
VBAで旧字体を異字体に一括で変...
-
モジュールとは何ですか
-
ExcelでTelnetを動かしたい
-
標準モジュールを削除したい。(...
-
VBA This Workbookモジュール...
-
Access VBA標準モジュールにつ...
おすすめ情報