[三流君] [VBAで楽しく] [VBA IE 操作]

三流君VBA:IE .Navigate about:blankで空白ページ表示 禁断の制御文GOTO文

概要:
objIE.Navigate "about:blank"
で空白のページを表示してから、
正常に移動されなかったら、禁断の制御文?GoTo文を使って再度読み込みに行く、
そんなサンプルです。(あまりキレがないけど)
※Vistaだと、.Navigate about:blank 空白ページからすぐに処理するとエラーになったりするけど。。。


※メルマガ記事ではオブジェクトの参照設定をしていませんができれば、下記を参考に参照設定してください。
[Microsoft Internet Controls,Microsoft HTML Object Library を参照設定する](このほうが開発時、操作時に楽)
また、VistaとIE7の場合は、 [IE7 操作 Vistaで失敗]も参考にしてください。

リンク 分類: [Document(文章)からデータを取得] / [Form入力処理] / [Linkリンク情報] / [Image画像情報] / [Frameフレーム処理] サンプル: [IEを使ったVBAのサンプル] / [小さなVBAでIE操作のコード]

メルマガ発行内容

やっと、下記、メルマガで発行した内容です。何かの参考となれば幸いです。
過去のメルマガ[IE操作系の記事一覧]もヨロシクです。

IE .Navigate about:blankで空白ページ表示 禁断の制御文GOTO文

こんにちは。AB型の変わり者 三流プログラマーのKen3です。

今回は、
objIE.Navigate "about:blank" で空白のページを表示する
と
禁断の制御文?GoTo文
を少し書いてみます。

自分でも読み返すとあまり参考にならないのですが、
せっかく書いたので発行しちゃいます。

読者の声:あっ、そのネタ知ってるよ。内容は・・・だろ?
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

またまたぁ・・・先に心の中でネタ先読みしないでよ。
タイガー アンド ドラゴンの客じゃないんだからさ

/* * 1. 今回のキッカケ */

下記の質問を http://www.ken3.org/vba/backno/vba050.html から、いただく。 ---- >WebBrowserを使ってある登録Webページに多量な登録データを自動で登録するツール >を作っているのですが、まれにページ移動がうまく行かず、ループを途中で抜けて >しまいます。ちゃんと期待するURLのページが開かれているのかチェックしているの >ですが、それでもダメみたいです。何かこのような現象を回避する方法があれば >ご教授頂きたいです。宜しくお願いします。 ---- ご教授なんて言葉は嫌いなんだけど・・・といつもの口癖は置いといて、 ^^^^^^ ページが正確に表示されたかの確認かぁ、、、どこで判断するんだろ???

/* * 2..ReadyState <> READYSTATE_COMPLETE を見るとか?? */

よく私が手抜きで使っている方法 Do While objIE.Busy = True DoEvents Loop だと、無限ループだったり、 フレームや広告を読み終わった時点で.Busy=Falseとなったり不安定かな? '↑これだけだと、別のフレーム読み込んだだけで、完了になる 'そこで、ステータスを見ないといけないんですね。 '.ReadyState = READYSTATE_COMPLETE Do While objIE.ReadyState <> 4 '4の完了以外ループ '何もしないループ(笑) DoEvents Loop ↑こんな感じで、.ReadyState <> 4 以外を待つのも1つの手だったりするし。 手抜きは良くないよ、手抜きは。

/* * 3.究極の手抜き?n秒待つ */

タイミングによっては、.ReadyState見ててもおかしな動きをする時があるので (ホントかよ、ガセネタばら撒くなよ、このうそつき君が) 手抜きで、データ読み込み指示後n秒待ってみたり。 objIE.Navigate "" & strURL 'アドレスを渡し表示する '1秒表示を待つ 無駄にループさせる time10 = DateAdd("s", 1, Now()) Do While True DoEvents If time10 < Now() Then Exit Do '時刻のチェック Loop '表示完了まで待つ 最大9秒待つ time10 = DateAdd("s", 9, Now()) Do While objIE.Busy = True DoEvents If time10 < Now() Then Exit Do '時刻のチェック DoEvents Loop objIE.stop と、反応が安定しているwebサイトが相手の時はこんなこともよくやってます。

/* * 4.空白ページの表示 */

真っ白なページ、 CreateObject("InternetExplorer.application") したばかりの何もしていない空白ページ
Sub OPEN_IE()
   Dim objIE   As Object
   Set objIE = CreateObject("InternetExplorer.application")
   objIE.Visible = True
End Sub
この初期状態にいつも持って行きたいなぁと思ったことありませんか? 単純に、 objIE.Navigate "" でOKだろと思ったアナタ、不正解です。 これだとページが見つからないと怒ってきます。 で、正解は、 .Navigate "about:blank" ^^^^^^^^^^^^^^^^^^^^^^^ これで何も無い空白ページを表示する(空白ページに移動する)ことができます。 まぁ、何かの時、使ってみてください。 じゃなくって、この空白ページに移動を使って、

/* * 5.飛ぶ前に必ず空白ページにする そんな姑息な一手 */

objIE.Navigate "about:blank" 'ブランクを表示 で ブランクページを表示することができます。 ※空白の何も無いページ。 これを利用して、 目的のページに飛ぶ前にブランクページを表示させ、 ループ待ちの後、ページがブランクのままかチェックしてます。 ※ページがブランク=読み込み失敗と判断する objIE.Navigate "about:blank" '空白ページを表示 objIE.Navigate "" & strURL 'アドレスを渡し表示する みたいに上記2行をいつもペアで使う。 .Navigate "about:blank" これで瞬時に空白・ブランクページになる。 .Navigate "" & strURL で読み込み開始、 ここで何かしらの原因でページを読めない時はブランクページのままなので、 If objIE.Document.URL = "about:blank" Then ↑こんな感じで、ドキュメントのURLがabout:blankのままかチェックすれば、  ページが読み込まれたか?(空白以外に切り替わったか?)がチェックできます。 ※私、ADSL回線なのですが、10分以上連続処理していると途中よく切れるので、  せっかく自動巡回してても、タイムアウトで前のページを連続で取り込むバグが  発生してました。 ※※10分以上も巡回するなって・・・なにやってんだか・・・

/* * 6.我流のサンプル 禁断の制御文GOTO入り */

GOTO文を使った手抜きで参考になるかわかりませんが、 下記のようにして現在は巡回時の回線切れや相手側の無反応、 そんなエラーを回避してます。 ※それでもエラーのときありますが、頻度は減りました。 '---- 連続読み込みのサンプル 楽天のランキング30個チェック時の ------ 'リンク先へ飛び、タイトルとURLをGetする For nYLINE = 10 To 40 nERR_CNT = 0 'エラーのカウンタを初期化する START002: If nERR_CNT = 5 Then '5回エラーならあきらめる Cells(nYLINE, 4) = "読み込みに失敗しました" MsgBox "読み込みに失敗しました" Exit Sub 'プログラムを抜ける Else nERR_CNT = nERR_CNT + 1 'エラー回数を+1 End If Cells(nYLINE, "A").Select strURL = Trim(Cells(nYLINE, "C")) 'URL代入 If strURL = "" Then Exit For objIE.Navigate "about:blank" 'ブランクを表示 objIE.Navigate "" & strURL 'アドレスを渡し表示する '1秒表示を待つ 無駄にループさせる time10 = DateAdd("s", 1, Now()) Do While True DoEvents If time10 < Now() Then Exit Do '時刻のチェック Loop '表示完了まで待つ 最大9秒待つ time10 = DateAdd("s", 9, Now()) Do While objIE.Busy = True DoEvents If time10 < Now() Then Exit Do '時刻のチェック DoEvents Loop objIE.stop 'タイトルを書き込む Cells(nYLINE, "D") = objIE.Document.Title Cells(nYLINE, "E") = objIE.Document.URL '空白のチェック If objIE.Document.URL = "about:blank" Then GoTo START002 'エラー(空白のまま)の時、先頭に強引に飛ばす End If ' If Left(Cells(nYLINE, "D"), 6) = "【楽天市場】" Then Cells(nYLINE, "D") = "'<em>" & Mid(Cells(nYLINE, "D"), 7) & "</em>" End If If InStr(Cells(nYLINE, "D"), "エラー") > 0 Then Cells(nYLINE, "D") = "ページのエラーです" '表示完了まで待つ time10 = DateAdd("s", 10, Now()) Do While objIE.Busy = True DoEvents If time10 < Now() Then Exit Do DoEvents Loop Cells(nYLINE, "E") = objIE.Document.URL '再度ロケーションをセット End If Next ' ---- 途中を抜粋 ----- ポイントは、 objIE.Navigate "about:blank" 'ブランクを表示 objIE.Navigate "" & strURL 'アドレスを渡し表示する で、空白にしてから目的のURLを表示 n秒待ったり、.Busyを見たりしてから、 If objIE.Document.URL = "about:blank" Then GoTo START002 'エラー(空白のまま)の時、先頭に強引に飛ばす End If .Document.URL = "about:blank"でURLが移動されたか再度チェック、 空白(about:blank)のままだったら、 先輩方に嫌われている制御文GOTO文で先頭に飛ばしてます。 GoTo START002でラベルSTART002:に飛ばす (ループのカウンターを増やさずに、先頭に処理を戻してます) START002: If nERR_CNT = 5 Then '5回エラーならあきらめる Cells(nYLINE, 4) = "読み込みに失敗しました" MsgBox "読み込みに失敗しました" Exit Sub 'プログラムを抜ける Else nERR_CNT = nERR_CNT + 1 'エラー回数を+1 End If のエラーカウント処理で判断してます。 意外とGOTO文も便利でしょ。(オイオイそんなこと書いて大丈夫?クレーム来るぞ) あとは、アレンジしてみてください。(なんて無責任な・・・) 何かの参考となれば幸いです。

/* * 7.終わりの挨拶 */

今回は、 .Navigate "about:blank" で 空白ページを表示 と GOTO文で強引に制御する そんな話でした。 プログラム作りは ^^^^^^^^^^^^^^^^ う〜ん・・・ まぁ、人それぞれ、十人十色、百社百色だけどね。 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 禁断のGoTo文を使う時は、周りの空気を読んでから使ってね。 ※絶対禁止なんて人達も居るので・・・ GOTO文の制御でクレームメールが来る予感を感じつつ 今回も逃げるように失礼します。 AB型の変わり者、三流プログラマーのKen3でした。

ページフッター リンクや広告、質問送信など

三流解説を読んでいただき、どうもです。ここから下は、三流君宛のメッセージ送信や 三流君のホームページの紹介・案内です
目的の情報が見つかったか?少々心配しつつ、、、※質問や感想は、気軽に送ってくださいね。

[三流君 VBAでWebBrowser IEを操作する] / [三流君 VBAで楽しくプログラミング] / [AB型の変わり者 三流プログラマー Ken3 三流君Top]

大分類:[Document.Forms(入力処理)] / [Document.Links(リンク情報)] / [Document.Images(画像情報)] / [Document.Frames(フレーム処理)]
サンプル・例題:[過去のメルマガ記事一覧] / [少し大きなIE操作サンプル] / [小さなコードでIE操作の動作確認]

F1でヘルプを見たり、デバック時にDebug.Print使ったり、イミディエイト ウインドウで簡単な確認したり。
なれると当たり前に操作している方法が↓かなぁ。
[F1ヘルプ マクロ記録ほか]・・・基本のF1を押してヘルプを見る方法など
[実行時エラー、デバッグモード]・・・デバッグの流れを簡単に(ハマった時はツライけど)
[イミディエイト ウインドウ と Debug.Print]・・・プログラム作成時に便利なイミディエイト ウインドウ
[VBA ウォッチ式とSTOPを使ってみた]・・・STOPで止め、ウォッチ式でオブジェクトの中身を確認する方法など
[参照設定のお話]・・・設定すると便利な(設定しないと使えない)、参照設定のお話

項目別に↓にプログラマーの本音?それとも建て前?的な記事をまとめました。お探しのジャンルを選択してください。
[プログラムは心? spirit]・・・プログラマー 心・気質・魂
[学ぶ study]・・・学習、技術の取得
[仕様書 doc]・・・仕様書・設計書関係の話

項目別に↓に人気の記事をまとめてみました。お探しのジャンルを選択してください。
[VBAでIE ウェブブラウザーを操作]・・・VBAでIE,WebBrowserを操作する サンプルです
[MSアクセス から エクセル を呼ぶ Excel.Application]・・・AccessからExcelを操作したりデータの書き出しなどです
[アウトルック メールの操作 Outlook.Application]・・・VBAからOutlookを使い、メール関係を処理するサンプルです
↑上記3つみたいなCreateObjectで他のアプリケーションを操作するサンプルが人気です。

Excel関係:
[エクセル ユーザーフォームを操作する]・・・エクセルでユーザーフォームを作成して入力などを行ってます
[エクセルからアクセスを操作する]・・・ExcelからAccessのマクロを起動してみました、
[エクセル関係 関数、その他]・・・その他Excel関係です

Access関係:
[アクセス ユーザーフォーム/サブフォーム 操作]・・・アクセスでフォームを使ったサンプルです
[アクセス レポート操作]・・・レポートを操作してみました
[アクセス クエリーやその他関数]・・・あまりまとまってませんが、スポット的な単体関数の解説です

その他:VBAの共通関数やテキストファイルの操作など
[テキストファイルの操作(Open,Close,Print,Input)]・・・普通のテキストファイルを使ったサンプルです

Blog:[三流君の作業日記]/ [objIEを使用したサンプルコードを見る]/ 広告-[通販人気商品の足跡]

質問や要望など メッセージを送る(三流君に連絡する)

三流プログラマーのKen3 が 皆さんの質問にお答えします
と カッコつけて言っても、実力不足ですべての質問に回答することはできないのが現実なのですが、できる範囲で 三流的な逃げ手 や 解決方法 を探します(回答します)。

感想や質問・要望・苦情など 三流君へメッセージを送る。
時間的余裕のある要望・質問・苦情の場合は、下記のフォームからメッセージを送ることができます。

あなたのお名前(ニックネーム):さん
返信は?: 不用(HP更新を待つ) , E-mail→ アドレス:に返事をもらいたい



(感想や質問・要望 メッセージはHPで記事に載せることがあります。)

急ぎで連絡がほしい、そんな時は:[三流君連絡先]に連絡してください。



[トップページへ 戻る] / [VBA TOP] / [WebBrowser IEの操作 TOPへ]