VBAで「このページから移動しますか」というダイアログを閉じる

 前回の続きでもありますが、ブラウザでページを閉じようとしたり、他のページに移動しようとした時に、「このページから移動しますか」というダイアログが表示される場合がありますが、VBAでスクレイピングしようとした時に邪魔になったりします。

Pythonとかでやるのであれば、リンク先のURLを直接GETして、BeartifurSoupに放り込むだけなので、ページ遷移とか気にしなくていいんでしょうが、VBAだとIEを間接的に操作して行うので、このダイアログをなんとか閉じなければいけないようです。

WindowsAPIから、SetForeGroundWindow とSendKeysを使用して、無理やりENTERキーとか、スペースキーを押してやるという方法もありますが、その瞬間フォーカスを奪われてしまうので、VBAを走らせながら、他の作業を同時にやってたりすると、ちょっとストレスになってしまいます。

というわけで、VBAからなんとかこのダイアログを閉じる方法を探してみましたが、微妙にうまく動作しないので、あれこれと組み合わせたりちょっと修正を加えたりした結果です。


 ObjIE.Document.Script.SetTimeout "javascript:open('about:blank', '_self'),close();",10

 Application.Wait Now() + TimeValue("00:00:01")

 hWnd = FindWindow(vbNullString, "Winows Internet Explorer")

 If hWnd <> 0 Then

    PostMessage hWnd, &H111&, vbOk, 0

 End If


もちろん、WindowsAPI の FindWindow とPostMessage をしようしているので、それぞれDeclare で宣言しておく必要があります。

"Winows Internet Explorer" の部分はもちろん IE の場合なので、このあたりは環境によって変更が必要でしょう。

いろいろ見て回ったので、どこのサイトかわからなくなってしまいましたが、VBA からHTML上のボタンを押して遷移するときに、コントロールがシステムに取られてしまうので、PostMessage がうまく動作しないため、javascript を使用してリンクをクリックしてやるという方法が書かれていたのですが、私としては、HTML上のリンクから移動したいのではなく、直接リンクはされていない別のページを取得したかったので、javascript でページを閉じるという動作になっています。

ん?なんか話が違うな。別のページを取得するんじゃないのか?って感じですが、普通に ObjIE.Navigate でページ遷移してやれば、普通に PostMessage が通ります。

あと、1秒待つという動作をいれてますけど、これって必要ないのかな?まあ、よくわからないけど入れておきます。

あと前回のエントリの続きですが、やはり ObjIE は、宣言しなおしたりせずに使いまわして、Navigate で遷移していくというのが良いようです。

コメント

このブログの人気の投稿

VBAでOutlookメールのフォントを変更する

システムのシャットダウンは既にスケジュールされています

VBA 引数として渡す変数とその宣言