- ベストアンサー
ExcelVBAでスペースキー操作したい
sendkeysで、他のアプリケーションにキー操作を送りたいのですが、チェックボックスをオンにするときの【スペースキーを押す】という操作がうまくいきません。 sendkeys "{SPACE}",true ではだめなのでしょうか? よろしくお願いします。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
こんにちは。 > キー操作を送りたいのは、ある大手メーカー製のERPシステムです そうですか....SendKeys は、 1. ウインドウがアクティブでないとダメ PC によって処理速度が異なります。例えば、ウインドウが開い てアクティブになるまでの速さ。開発時のPC は 1 秒待ってから SendKeys ..で良かったはずなのに、別 PC では 5 秒待たなけれ ばならなかった...ということですね。SendKeys でキー送信して もウインドウが開いてないんです。一例です。 つまり、開発時の PC と同様の動作は別 PC で保証されません。 2. 2000系OS で Numlock が解除される(今はどうなんだろ?) などの問題があって、限られた用途「自分しか使わない」のであれば良い のですが、基本的にオススメできません。SendKeys は最後の手段として 位置づけるのが良いと私は思います。 # 困ったときの SendKeys でもあるんですけどね(´(・)`) Excel VBA を使う理由が特になければ、Wendy02 さんオススメの UWSC が 私も良いと思います。 どうしても VBA で...というのであれば、PostMessage などの API を 使うことを考えてみて下さい。この場合、ウインドウがアクティブなのか どうかは関係なく他アプリケーションを操作可能です。 以下はメモ帳(WinXP付属)を VBA で操作するテストコードです。要は、 ハンドルさえ拾えれば大抵のことは SendKeys でなくとも可能です。 ご参考までに... Option Explicit Private Declare Function FindWindow Lib "user32.dll" Alias "FindWindowA" ( _ ByVal lpClassName As String, _ ByVal lpWindowName As String) As Long Private Declare Function FindWindowEx Lib "user32.dll" Alias "FindWindowExA" ( _ ByVal hWnd1 As Long, _ ByVal hWnd2 As Long, _ ByVal lpsz1 As String, _ ByVal lpsz2 As String) As Long Private Declare Function PostMessage Lib "user32.dll" Alias "PostMessageA" ( _ ByVal hWnd As Long, _ ByVal wMsg As Long, _ ByVal wParam As Long, _ ByVal lParam As Long) As Long Private Declare Sub Sleep Lib "kernel32.dll" ( _ ByVal dwMilliseconds As Long) Private Const WM_CHAR As Long = &H102 Private Const WM_COMMAND As Long = &H111 Private Const WM_CLOSE As Long = &H10 Private Const BM_CLICK As Long = &HF5& Private Const BM_SETCHECK = &HF1 Private Const BST_CHECKED As Long = &H1 Private Const BST_UNCHECKED As Long = &H0 Public Sub Sample() Dim hWnd As Long Dim hWnd_C As Long Dim hWnd2 As Long Dim hWnd2_C As Long Dim strtSend As String Dim i As Long ' クラス名とウインドウ構成は VB 付属の Spy++ で調べました。 ' VECTOR などにも似た様なフリーツールは在ります ' メモ帳起動 MsgBox "他アプリケーション制御のサンプルです。メモ帳を起動します" Application.Visible = False Shell "Notepad.exe", vbNormalNoFocus ' メモ帳のウインドウハンドルを取得 hWnd = FindWindow("Notepad", "無題 - メモ帳") ' メモ帳の文字入力部のコントロールハンドルを取得 hWnd_C = FindWindowEx(hWnd, 0&, "Edit", vbNullString) ' 文字列送信テスト strtSend = "教えて!Goo." MsgBox "メモ帳に文字列「" & strtSend & "」を送信します" For i = 1 To Len(strtSend) Call PostMessage(hWnd_C, WM_CHAR, Asc(Mid$(strtSend, i, 1)), 0&) Next i ' メモ帳のメニューをクリックし「検索」ダイアログを表示 ' 「検索」のコマンドID 21 はリソースハッカーを使って調べました MsgBox "続いて検索ダイアログを表示します", vbInformation Call PostMessage(hWnd, WM_COMMAND, 21&, 0&) ' ダイアログが開くのを待つ(適当 500ミリ秒) Sleep 500& ' 検索ダイアログウインドウハンドル hWnd2 = FindWindow("#32770", "検索") ' チェックボックスのハンドル取得 hWnd2_C = FindWindowEx(hWnd2, 0&, "Button", "大文字と小文字を区別する(&C)") MsgBox "チェックボックスを ON にします" Call PostMessage(hWnd2_C, BM_SETCHECK, BST_CHECKED, 0&) MsgBox "チェックボックスを OFF にします" Call PostMessage(hWnd2_C, BM_SETCHECK, BST_UNCHECKED, 0&) MsgBox "検索文字を送信してみます" hWnd2_C = FindWindowEx(hWnd2, 0&, "Edit", vbNullString) For i = 1 To Len(strtSend) Call PostMessage(hWnd2_C, WM_CHAR, Asc(Mid$(strtSend, i, 1)), 0&) Next i MsgBox "[キャンセル]ボタンをクリックします" hWnd2_C = FindWindowEx(hWnd2, 0&, "Button", "キャンセル") Call PostMessage(hWnd2_C, BM_CLICK, 0&, 0&) MsgBox " メモ帳を閉じます.[保存しますか?]ダイアログは手動で閉じて下さい." Call PostMessage(hWnd, WM_CLOSE, 0&, 0&) Application.Visible = True End Sub
その他の回答 (2)
- Wendy02
- ベストアンサー率57% (3570/6232)
こんにちは。 Excel VBAは、ほとんどExcel内でしか使えません。 簡単な方法では、こんな風にすれば、動くかとは思います。 Application.Wait Now + TimeValue("00:00:02") '待ち時間を置くのは、手動で、Activeアプリケーションを返るためです。 'Activeアプリケーションを換えるには、Win32 APIや、WMIを使用します。 CreateObject("Wscript.Shell").SendKeys " " 'IMEのON/Offの状態に影響を受けます。 ただ、もしも、システムパッケージの前に、Excelを初動させ、プロセスを残したまま稼動させるのは、やめたほうがよいですね。何が起こるか安心できません。Excelは、一定のメモリを占有し、また、自動保存などもあります(切ればよいのですが)。 簡易自動システムをお考えになるなら、今は有名になった、「UWSC」って本まで出ているスクリプト言語があります。画面からコマンドを与えるようなつくりになっていますね。使い方は簡単で、記録マクロも出来ますし、コーディングも出来ます。(最初知った時、作者は日本人ではないと思いました。) このツールの記録マクロでの問題点は、画面のそれぞれのコントロールの位置が重要になるので、画面が動くと、コントロールのクリック等が外れてしまいます。それを避けるには、やはりコーディングによる方法が必要です。これで、1昼夜で、同じ作業を繰り返すことも可能です。 うみうみ屋さん http://www.h7.dion.ne.jp/~umiumi/
- KenKen_SP
- ベストアンサー率62% (785/1258)
こんにちは。KenKen_SP です。 > sendkeys "{SPACE}",true Sendkeys " ",True とか(空白スペースをそのまま送信です) > 他のアプリケーションにキー操作を送りたい... Sendkeys ですか...ちなみにどのアプリケーションなのでしょうか?
補足
KenKen_SPさん、ありがとうございます。 キー操作を送りたいのは、ある大手メーカー製のERPシステムです。 今回、システムを起動し、メニュー画面からCtrl+Fでセッション検索をさせたいと思っているのですが、検索ダイアログボックスの表示まではいけるのに、条件設定のチェックボックスへのOn/Off切り替えがうまくできなくて困っています。基本的にWindows/Unix環境では他のアプリと同じキー操作が使えるようなのですが(実際通常操作だとスペースキーでのOn/Off切り替えも可能)、VBAでは限界ということでしょうか・・・?