• ベストアンサー

ExcelVBAでスペースキー操作したい

sendkeysで、他のアプリケーションにキー操作を送りたいのですが、チェックボックスをオンにするときの【スペースキーを押す】という操作がうまくいきません。 sendkeys "{SPACE}",true ではだめなのでしょうか? よろしくお願いします。

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

  • ベストアンサー
  • KenKen_SP
  • ベストアンサー率62% (785/1258)
回答No.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)
回答No.2

こんにちは。 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)
回答No.1

こんにちは。KenKen_SP です。 > sendkeys "{SPACE}",true Sendkeys " ",True とか(空白スペースをそのまま送信です) > 他のアプリケーションにキー操作を送りたい... Sendkeys ですか...ちなみにどのアプリケーションなのでしょうか?

korn333
質問者

補足

KenKen_SPさん、ありがとうございます。 キー操作を送りたいのは、ある大手メーカー製のERPシステムです。 今回、システムを起動し、メニュー画面からCtrl+Fでセッション検索をさせたいと思っているのですが、検索ダイアログボックスの表示まではいけるのに、条件設定のチェックボックスへのOn/Off切り替えがうまくできなくて困っています。基本的にWindows/Unix環境では他のアプリと同じキー操作が使えるようなのですが(実際通常操作だとスペースキーでのOn/Off切り替えも可能)、VBAでは限界ということでしょうか・・・?