プロが教えるわが家の防犯対策術!

 Internet Explorer で、「ダウンロードの表示」のDialogウィンドウをショートカット(Ctrl + J )を使って表示させたいのですが、Excel VBA で以下のコードで試したのですが、うまくいきません。どういうコードを書いたらよいのでしょうか?アクセスキーを使った方法では、「ツール」で N  に該当するのが「ダウンロードの表示」と「Send To Note」の2つあって起動できません。

 よろしくお願いします。



Public Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)

Public Declare Function PostMessage Lib "user32" Alias "PostMessageA" _
(ByVal hWnd As Long, ByVal wMsg As Long, ByVal wParam As Long, _
ByVal lParam As Long) As Long

Public Const WM_KEYDOWN = &H100
Public Const WM_KEYUP = &H101

Public Const VK_CONTROL = &H11
Public Const VK_J = &H4A

Public Const navOpenInNewTab = &H800

Sub Test()
Dim objIE As Object

Dim hWnd_objIE As Long
Dim Ret As Long

'IE起動
Set objIE= CreateObject("InternetExplorer.Application")
objIE.Visible = True

objIE.navigate "https://www.google.co.jp/", navOpenInNewTab

Do While objIE.Busy = True Or objIE.readyState <> 4
DoEvents
Loop


'objIEのhWnd取得

hWnd_objIE = objIE.hwnd 'IEの親ウィンドウのhWnd取得する


'hWnd_objIE のウィンドウにPostMessageする

Ret = PostMessage(hWnd_objIE, WM_KEYDOWN, VK_CONTROL, 0)

Ret = PostMessage(hWnd_objIE, WM_KEYDOWN, VK_J, 0)

Sleep 100

Ret = PostMessage(hWnd_objIE, WM_KEYUP, VK_CONTROL, 0)

Ret = PostMessage(hWnd_objIE, WM_KEYUP, VK_J, 0)


End Sub

A 回答 (4件)

SendKeysはアクティブウィンドーに対しての動作なので、電卓がアクティブになっている場合はキーストロークは電卓に送られます



SendKeysで電卓を操作する例
http://www.atmarkit.co.jp/ait/articles/0709/12/n …

IEの操作にかぎらず常にアクティブなウィンドーに対しての動作になります、複数のウィンド操作が必要な場合はSendKeysを実行する前に対象のウィンドをアクティブにする必要があります


SendKeysの便利なところは

VBS で IEを使用して楽天市場にログインしてみた(ken3memo 三流君)
http://d.hatena.ne.jp/ken3memo/20110721/1311244241

この場合はページのHTMLソースからテキストボックスの名前(name)を調べておく必要が有る

ただ、楽天のログインページは開いた時点でユーザー名の入力ボックスにターゲットが移っている状態なのでSendKeysを利用して

ページが表示されたら

SendKeys "ユーザー名"
SendKeys "{TAB}"
SendKeys "パスワード"
SendKeys "{ENTER}"

を実行するだけでログインが出来る、ページの体裁が変わると対応はできなくなるのが欠点ですが

まあ、これは余分な説明だったけど
    • good
    • 0
この回答へのお礼

 アクティブウィンドウに対しての操作は希望していなかったのですが、以後の回答がなく、一応SendKeysで操作もできるので、ベストアンサーとします。
 他の回答も含め、忙しい中、回答くださった方に御礼申し上げます。

お礼日時:2013/12/01 03:01

No1です



>他の作業に支障はないのでしょうか?

ちょっと質問の意図が理解できないのですが?

SendKeys "^j", True

これはアクティブなウィンドーに対し[Ctrl]+Jのキーストロークを送っているだけ

ダウンロードの表示なら

SendKeys "%{X}N", True

でも実行可能

アクティブウィンドーに対しての動作なので、他の作業には影響しないと思いますが、何が不安なのでしょうか?
    • good
    • 0
この回答へのお礼

 回答ありがとうございます。

 前の例・・・他の作業(別ウィンドウでIE操作)が可能なコード  という例がよくありませんでした。他の作業をIEでなく、メモ帳や電卓操作をマクロ実行中に行っていた場合、ActiveWindowがIEでなく、メモ帳や電卓に移った場合に支障をきたさないかを心配しております。

 分かりにくい例や表現で申し訳ないです。

お礼日時:2013/11/13 04:30

ご質問自体の操作の『「Send To Note」の2つあって』という所が、私は分かっていないのですが、PostMessage で、最初、Ctrl + Jを送った後に、その子Windowの中の操作と違いますか?



そうしたら、二番目の

Sleep 100
Ret = PostMessage(hWnd_objIE, WM_KEYUP, VK_CONTROL, 0)
Ret = PostMessage(hWnd_objIE, WM_KEYUP, VK_J, 0)

hWnd_objIEは、違っていると思います。もう一度、子Windowのハンドルを取得しなおさないといけないような気がしますね。その他にも、objIEのオブジェクトで、ExecWB定数でダウンロードする方法もあるような気がします。ただし、実行そのもののキーは、やっぱりWin32APIになるかもしれません。

想像で申し訳ありませんが、"SendKey"は、最上位にあるWindow操作する可能性が高いので、Windowを前面に持ってくるか、Windowのハンドルを取らないと、うまく行かない可能性がありますね。そうすると、結果的に、Win32APIに頼らざるを得ないはずです。
    • good
    • 0

SendKeysじゃなにか不都合があるのかな?




Sub Test()
Dim objIE As Object

Dim hWnd_objIE As Long
Dim Ret As Long

'IE起動
Set objIE= CreateObject("InternetExplorer.Application")
objIE.Visible = True

objIE.navigate "https://www.google.co.jp/", navOpenInNewTab

Do While objIE.Busy = True Or objIE.readyState <> 4
DoEvents
Loop

SendKeys "^j", True

End Sub
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。
 SendKeysで動きました。
自分としては、マクロ実行中でも他の作業(別WindowでIE操作など)が可能なコードを作りたいのですが、他の作業に支障はないのでしょうか?
 私が調べたところでは、SendkeysはActiveWindowに対してキーストロークを渡すとありました。  http://officetanaka.net/excel/vba/statement/Send …

他の作業に支障の出ないコードの例を教えてください。
 
API初心者で、質問ばかりで申し訳ありません。

お礼日時:2013/11/12 04:38

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!