ここから本文です

VBAのSendkeysについて

ogn********さん

2010/6/221:49:40

VBAのSendkeysについて

お世話になります。
Sendkeysについてご教授願います。

下記のコードで図の圧縮を開いてます。
そのあと、TABキーをSendkeysで「OK」ボタンまでカーソルを移動してEnterキーを送信したいのですが、どうしてもうまくいきません。

現状は、
下記※1で処理がストップ → OKボタンをマウスでクリックorキャンセル → エクセル画面でセルに対してTAB×4回 → Enter
になってしまいます。

※1の時点で、TAB×4回 → Enter をキーボードで操作はできます。
ということは「図の圧縮」はフォーカスになっているということだと思われるのですが・・・

Application.Wait Now + TimeValue("0:00:05")を※1の部分に挿入してみましたが、それもだめでした・・・

大変申し訳ありませんが、御指南のほど宜しくお願いいたします。


Sub 画像圧縮()
Dim Btn
Set Btn = Excel.Application.CommandBars.FindControl( _
msoControlButton, 6382)
Btn.Execute
'※1・・・・・・・・・「図の圧縮」がフォーカスになっているのに下記のキーが送信されない?
SendKeys "{TAB 4}", True
SendKeys "{Enter}", True
End Sub

閲覧数:
4,632
回答数:
1

違反報告

ベストアンサーに選ばれた回答

foo********さん

2010/6/300:23:15

「図の圧縮」画面のことをモーダルダイアログといいますが、モーダルダイアログを開くと、それを閉じるまで次のステップは実行されません。つまり、「Btn.Execute」によってダイアログが開きますが、次のステップである「SendKeys」はダイアログが閉じられるまで実行されません。

この処理を実現するには、ダイアログを開いたスレッドとは別のスレッドでSendKeysする必要があります。↓のコードは、SetTimerを呼んだ500ミリ秒後に別のスレッドでTimerProcを実行するものです。TimerProcが実行されるまでに「図の圧縮」ダイアログが確実に表示されている必要があります。状況によって500ミリ秒以内に図の圧縮ダイアログが表示されない可能性があるので完璧ではありませんが、適当に時間を調整すれば現実的にはほぼ問題ないでしょう。

Private TimerId As Long

Private Declare Function SetTimer Lib "user32" (ByVal hWnd As Long, ByVal nIDEvent As Long, ByVal uElapse As Long, ByVal lpTimerFunc As Long) As Long
Private Declare Sub KillTimer Lib "user32" (ByVal hWnd As Long, ByVal nIDEvent As Long)

Public Sub 画像圧縮()
Dim Btn

TimerId = SetTimer(0&, 500&, 0&, AddressOf TimerProc)

Set Btn = Excel.Application.CommandBars.FindControl(msoControlButton, 6382)
Btn.Execute
End Sub

Public Sub TimerProc(hWnd As Long, uMsg As Long, idEvent As Long, dwTime As Long)
KillTimer 0&, TimerId

SendKeys "{TAB 4}", True
SendKeys "{Enter}", True
End Sub

質問した人からのコメント

2010/6/3 08:05:46

降参 有り難うございます。
バッチリうまくいきました。
正直あきらめかけていただけにとてもうれしいです。

また宜しくお願いいたします。

みんなで作る知恵袋 悩みや疑問、なんでも気軽にきいちゃおう!

Q&Aをキーワードで検索:

Yahoo! JAPANは、回答に記載された内容の信ぴょう性、正確性を保証しておりません。
お客様自身の責任と判断で、ご利用ください。
本文はここまでです このページの先頭へ

「追加する」ボタンを押してください。

閉じる

※知恵コレクションに追加された質問は選択されたID/ニックネームのMy知恵袋で確認できます。

不適切な投稿でないことを報告しました。

閉じる