以下のコードは、あるWebサイトについて3パターンでページをロードするExcelVBAの処理です。
#If VBA7 Then Private Declare PtrSafe Sub Sleep Lib "kernel32" (ByVal ms As LongPtr) #Else Private Declare Sub Sleep Lib "kernel32" (ByVal ms As Long) #End If Private Sub driver_getKatsuki() Dim ret Dim objIE As InternetExplorer ' IEの起動 Set objIE = CreateObject("InternetExplorer.Application") objIE.Visible = True 'パターン1 ret = getKatsuki("9784344033856", objIE) Debug.Print "戻り値=[" & ret & "]" 'パターン2 ret = getKatsuki("9784897481159", objIE) Debug.Print "戻り値=[" & ret & "]" 'パターン3 ret = getKatsuki("4866510553", objIE) Debug.Print "戻り値=[" & ret & "]" objIE.quit Set objIE = Nothing End Sub Function getKatsuki(searchKey As String, objIE As InternetExplorer) Dim url On Error GoTo Err url = "http://www.katsuki-books.jp/kensaku/detail.asp?Cd=" & searchKey objIE.Navigate2 url ' ★ロード待ち Do While objIE.Busy = True Or objIE.readyState <> 4 DoEvents Sleep (1000) '1秒待機 Loop Debug.Print objIE.LocationURL getKatsuki = 1 Exit Function Err: Debug.Print "Err.Number=[" & Err.Number & "], Err.Description=[" & Err.Description & "]" getKatsuki = -1 End Function
これを実行するとパターン1までは正常に動作しますが、パターン2のページロードでビジー状態が継続し、「★ロード待ち」とコメントしているループ処理を脱出しません。(IEを見るとロードは完了しているように見えるのですが・・・)
また、何度か実行していると、「'Navigate2' メソッドは失敗しました: 'IWebBrowser2' オブジェクト」のエラーメッセージを吐くこともあります。
上記コードは最小限の処理のみ記述したものです。実際にはデータ取得する処理等あるのですが、その実行時に「起動されたオブジェクトはクライアントから切断されました。」のエラーが出たこともあります。私は、上のエラーもクライアントから切断されたものと予想しています。
一方で、デバッグでステップ実行すると、最後まで問題なく処理できます。
サイト側で何か制限をかけているのかな・・・と勘ぐったりもしますが分かりません。
原因・対策など教えていただけないでしょうか。
実行環境:Windows7、Excel2016
回答3件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/01/26 04:15
2019/01/27 00:45