2017-12-13 14 views
0

this postが見つかりました。私は受け入れられた答えによって提案された解決策を試し、次のコードを考え出しました。VBAのWebスクレイピングでランタイムエラーが発生しました

Sub WebScraping() 

Dim appIE As Object 
Dim myValue As String 
Dim iLastRow As Integer 
Dim allRowOfData 

Application.DisplayAlerts = False 

Set appIE = CreateObject("internetexplorer.application") 

With appIE 
    .Navigate "http://uk.investing.com/rates-bonds/financial-futures" 
    .Visible = False 
End With 

Do While appIE.Busy 
    DoEvents 
Loop 

'Set allRowOfData = appIE.document.getElementById("pair_8907") 

Worksheets("Web Scraping").Activate 

'myValue = allRowOfData.Cells(7).innerHTML 
myValue = appIE.document.getElementById("pair_8907").Cells(7).innerHTML 

iLastRow = ActiveSheet.Range("B100000").End(xlUp).Row 
ActiveSheet.Cells(iLastRow, 1).Select 

If iLastRow = 1 Then 
    ActiveCell.Offset(1, 0).Value = "US 30Y T-Bond" 
    ActiveCell.Offset(1, 1).Value = myValue 
    ActiveCell.Offset(1, 2).Value = Now() 
    ActiveCell.Offset(1, 2).Select 
ElseIf iLastRow > 1 Then 
    ActiveCell.Copy Destination:=Cells(ActiveCell.Row + 1, 1) 
    ActiveCell.Offset(1, 1).Value = myValue 
    ActiveCell.Offset(1, 2).Value = Now() 
    ActiveCell.Offset(1, 2).Select 
End If 

appIE.Quit 
Set appIE = Nothing 
Set allRowOfData = Nothing 

End Sub 

私のスクリプトは10回のうち、スムーズ9実行されますが、時には、それはエラーがスローされます。 error message

ことが起こるとVBEのデバッガコマンドは、私が思う

myValue = appIE.document.getElementById("pair_8907").Cells(7).innerHTML 
+1

おそらく、エラー処理を行うと便利です。ウェブサイトの読み込みが完了したとすると、appIEはもうビジーではなく、ウェブサイトが完全に読み込まれていないことを意味します(例えば、インターネット接続のエラーなど)。おそらくその瞬間にID「pair_8907」の要素がないため、.Cells(7).innerHTMLがエラーをスローする可能性があります。 いつも安全にするためには、一度のすべての掻き取りを確認してください - しばらくすると有効な文書がありますか? - 指定されたIDを持つ要素をドキュメントに持っていますか? - この要素が8個ありますか? – DaDirnbocher

答えて

0

で停止することを示していますあなたはロードするための十分な時間を与えていません... ページが読み込まれるのを待つためにこの関数WaitIEがあります、それは5000ミリ秒に設定されています、エラーが続くなら、あなたはもっと時間を与えることができます。

#If VBA7 Then 
    Public Declare PtrSafe Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As LongPtr) 'For 64 Bit Systems 
#Else 
    Public Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds as Long) 'For 32 Bit Systems 
#End If 

Sub WebScraping() 

Dim appIE As Object 
Dim myValue As String 
Dim iLastRow As Integer 
Dim allRowOfData 

Application.DisplayAlerts = False 

Set appIE = CreateObject("internetexplorer.application") 

With appIE 
    .Navigate "http://uk.investing.com/rates-bonds/financial-futures" 
    .Visible = False 
End With 

    WaitIE appIE, 5000 

'Set allRowOfData = appIE.document.getElementById("pair_8907") 

Worksheets("Web Scraping").Activate 

'myValue = allRowOfData.Cells(7).innerHTML 
myValue = appIE.document.getElementById("pair_8907").Cells(7).innerHTML 

iLastRow = ActiveSheet.Range("B100000").End(xlUp).Row 
ActiveSheet.Cells(iLastRow, 1).Select 

If iLastRow = 1 Then 
    ActiveCell.Offset(1, 0).Value = "US 30Y T-Bond" 
    ActiveCell.Offset(1, 1).Value = myValue 
    ActiveCell.Offset(1, 2).Value = Now() 
    ActiveCell.Offset(1, 2).Select 
ElseIf iLastRow > 1 Then 
    ActiveCell.Copy Destination:=Cells(ActiveCell.Row + 1, 1) 
    ActiveCell.Offset(1, 1).Value = myValue 
    ActiveCell.Offset(1, 2).Value = Now() 
    ActiveCell.Offset(1, 2).Select 
End If 

appIE.Quit 
Set appIE = Nothing 
Set allRowOfData = Nothing 

End Sub 

Sub WaitIE(IE As Object, Optional time As Long = 250) 
'Code from: https://stackoverflow.com/questions/33808000/run-time-error-91-object-variable-or-with-block-variable-not-set 
Dim i As Long 
Do 
    Sleep time 
    Debug.Print CStr(i) & vbTab & "Ready: " & CStr(IE.READYSTATE = 4) & _ 
       vbCrLf & vbTab & "Busy: " & CStr(IE.Busy) 
    i = i + 1 
Loop Until IE.READYSTATE = 4 Or Not IE.Busy 
End Sub 
+0

ヒントをありがとう。私はApplication.Waitを試しました。これはSleepと似た機能で、問題を解決したようです。 – RookieNoMore

関連する問題