2016-08-02 17 views
1

ウェブサイトを開き、場所を選択し、HTML表をExcelシートにコピーして別の場所で繰り返すことになっているコードがあります。しかし、私は 'For'ループを実行しようとしたとき、私は4回目の繰り返しでエラーが発生しました。メッセージに「オブジェクト変数またはWithブロック変数が設定されていません」と表示されました。デバッグツールは、ライン44VBAコード - 第4ループでスタック

Sub ParseTable() 
    Dim IE As InternetExplorer 
    Dim htmldoc As MSHTML.HTMLDocument 'Document object 
    Dim eleColtr As MSHTML.IHTMLElementCollection 'Element collection for tr tags 
    Dim eleColtd As MSHTML.IHTMLElementCollection 'Element collection for td tags 
    Dim eleRow As MSHTML.IHTMLElement 'Row elements 
    Dim eleCol As MSHTML.IHTMLElement 'Column elements 
    Dim ieURL As String 'URL 
    Dim x As Integer 
    Dim y As String 

y = "A1" 

For x = 1 To 4 
    If x <> 2 Then 'Skip iteration 2 
     Set IE = New InternetExplorer 
     IE.Visible = True 
     Application.ScreenUpdating = False 

     ieURL = "***" 
     IE.navigate ieURL 
'Wait 
     Do While IE.Busy Or IE.readyState <> 4 
      DoEvents 
     Loop 

     Set htmldoc = IE.document 'Document webpage 

     Do While IE.Busy Or IE.readyState <> 4 
      DoEvents 
     Loop 

    IE.document.getElementById("ddlLevel1").selectedIndex = x 
    IE.document.getElementById("ddlLevel1").FireEvent ("onchange") 
    Do While IE.Busy Or IE.readyState <> 4 
     DoEvents 
    Loop 
    Set eleColtr = IE.document.getElementsByTagName("tr") 'Find all tr tags 

    'This section populates Excel 
      i = 0 'start with first value in tr collection 
      For Each eleRow In eleColtr 'for each element in the tr collection 
       Set eleColtd = IE.document.getElementsByTagName("tr")(i).getElementsByTagName("td") 'get all the td elements in that specific tr 
       j = 0 'start with the first value in the td collection 
       For Each eleCol In eleColtd 'for each element in the td collection 
        Sheets("Sheet1").Range(y).Offset(i, j).Value = eleCol.innerText 'paste the inner text of the td element, and offset at the same time 
        j = j + 1 'move to next element in td collection 
       Next eleCol 'rinse and repeat 
       i = i + 1 'move to next element in td collection 
      Next eleRow 'rinse and repeat 
      Sheets("Sheet1").Range(y).Offset(i, 0).Select 
      y = "A" & ActiveCell.Row 
      IE.Quit 
     End If 
Next x 
Application.ScreenUpdating = True 
End Sub 

ない原因何ができるか確認してくださいで指摘しました。私はExcelシート上の最初の4箇所(マイナス2箇所)からテーブルを取得しました。私の長い非効率なコード(私は自分自身プログラマーではない)のために恩赦。私が使用するWebページにはログインが必要で機密データがありますが、可能な限り入力を提供しようとします。助けをあらかじめありがとう!

+0

を追加For Each eleRow In eleColtrした後、各ループ

の開始時に遅延を追加したい試行

の数にNTERは 'J = 0 'を言います。あれは正しいですか? – YowE3K

+0

私はエラーがここにあると思います: 'IE.document.getElementsByTagName(" tr ")(i).getElementsByTagName(" td ")'。おそらくあなたはこの "tr"の中に "td"を取得しようとしていますが、 "tr"そのものはある時点でNothingです。エラーが発生する前に実行を停止し、変数を分析する必要があることを確認してください。 – mathiasfk

+0

他にもいくつかの可能性があります[ここ](https://msdn.microsoft.com/en-us/library/5szkzs17.aspx) – mathiasfk

答えて

0

これは、さらに処理する前にIE.Busyを待つことを試みる多くの例で発生します。問題は、ドキュメントモデルがまだ形成されていないため、オブジェクトモデルの要素にアクセスしようとするとエラーが発生することです。

最も安全な方法は、オブジェクトが存在するまで実際にループすることです。あなたがそれが各文書に現れるという事実を知っているなら。安全にプレイしたい場合は、エラーメッセージで停止する前に行うチェックの回数に制限を加えることができます。

(それが問題のあるラインの場合)次に、このわずかな遅延とDoEvents関数で

Set eleColtr = IE.document.getElementsByTagName("tr") 

をこの行を置き換えるあなたのモジュールの上部

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

にこれを追加 - そしてあなたのためにチェックするループtr要素

DoEvents 
Sleep 1000 ' delay once second 
Do 
    DoEvents 
    Sleep 500 ' delay half a second 
Loop Until not IsNull(IE.document.getElementsByTagName("tr")) 

無限ループに入ってtr要素を見つけられない場合は、cou私も がライン44 Sleep 500

+0

ご意見ありがとうございます。私はそれに応じてコードを修正しましたが、コードのループセクションにカウンタを置いても、2番目のループで無限ループが発生します。 'Do DoEvents counter = counter + 1 スリープ500 ループIsNull(ie.document.getElementsByTagName( "tr"))またはカウンタ<2'までループします。これは間違っていますか? –

+1

'do DoEvents counter = counter + 1 Sleep 500 Loop IsNull(ie.document.getElementsByTagName(" tr "))またはカウンタ<5"が書式化のために修正されました –

+0

編集されたループ。 NOT ISNULL – dbmitch

関連する問題