2016-06-22 2 views
0

Ich habe einen Code, der beim Durchlaufen einwandfrei ausgeführt wird, aber beim Ausführen als Ganzes nicht vollständig ausgeführt wird. Es gibt keine Fehler. Der Code durchsucht HTML-Tags und sucht nach einem Schlüsselwort. Wenn das Schlüsselwort in einer HTML-Zelle gefunden wird, wird die gesamte Zelle in eine Excel-Zelle ausgegeben. Ich suche nach einem Schlüsselwort, das 3 mal auf einer Webseite erscheint. Wenn ich debugge und durchtrete, werden alle 3 Instanzen des Schlüsselworts gefunden, und die Zelle, in der es sich befindet, füllt Zellen A1: C1 in Excel. Wenn der Code jedoch als Ganzes ausgeführt wird, werden nur die ersten beiden Instanzen gefunden. Kann mir jemand sagen, warum das so ist? Meine Vermutung ist, dass die IF-Anweisung aus irgendeinem Grund nicht für das letzte Keyword ausgelöst wird ... Ich werde den HTML-Body und meinen VBA-Code einfügen.HTML-Suchcode wird wie beim Entwerfen ausgeführt, aber nicht vollständig beim vollständigen Ausführen

<HTML> 
 
<HEAD> 
 
<META NAME="name" CONTENT="sldfkjsd"> 
 
<TITLE>Title</TITLE> 
 

 
<P> 
 
<TABLE BORDER=3 CELLPADDING=6 CELLSPACING=3> 
 
<TR> 
 
<TD> 
 
<PRE> 
 

 
AAAA AAAA AAAA AAA AAA AAAA AAA AAAA AAAA AAA 
 
    BBBBb BBBBB BBBBB BBBBB BBBBBBBBBBBBBB B 
 
    keyword 
 
    CCCCCCCcc CCCCCCCCCC CCCCCCCCCCCC DDDDDDDD 
 

 
</PRE> 
 
</TD> 
 
</TR> 
 
<TR> 
 
<TD> 
 
<PRE> 
 
AAAA AAAA AAAA AAA AAA AAAA AAA AAAA AAAA AAA 
 
    BBBBb BBBBB BBBBB BBBBB BBBBBBBBBBBBBB B 
 
    keyword 
 
    CCCCCCCcc CCCCCCCCCC CCCCCCCCCCCC DDDDDDDD 
 

 
</PRE> 
 
</TD> 
 
</TR> 
 
<TR> 
 
<TD> 
 
<PRE> 
 
AAAA AAAA AAAA AAA AAA AAAA AAA AAAA AAAA AAA 
 
    BBBBb BBBBB BBBBB BBBBB BBBBBBBBBBBBBB B 
 
    keyword 
 
    CCCCCCCcc CCCCCCCCCC CCCCCCCCCCCC DDDDDDDD 
 

 
</PRE> 
 
</TD> 
 
</TR> 
 
<NEXT></NEXT> 
 
</TABLE>

Sub subFindScrollIE() 

'Set Variables 
Dim boolFound As Boolean 
Dim strTemp() As Variant, txt As String 
Dim strOutput As String 
Dim tbl As HTMLTable, tables As IHTMLElementCollection 
Dim tr As HTMLTableRow, r As Integer, i As Integer 
Dim tRows As IHTMLElementCollection 
Dim ie As InternetExplorer 
'Delete Rows and Select A1 
Rows("1:100").Delete 
ActiveSheet.Range("A1").Select 


Set ie = New InternetExplorer 

'Show Webpage (optional) 
'ie.Visible = True 
Dim dateToday As String 

'Get Today's date in yyyymmmdd to input into URL for most today's alert page 
dateToday = Format((Now), "yyyymmdd") 


'Navigate to Desired URL with today's date 
ie.Navigate "URL" & dateToday & ".html" 

'Input Keywords 
strTemp = Array("Keyword") 

'Wait for IE page to finish loading 
Do Until ie.ReadyState = READYSTATE_COMPLETE Or ie.ReadyState = READYSTATE_INTERACTIVE 
    'DoEvents 
Loop 

    'Declare rows 
Set allrows = ie.Document.body.getElementsByTagName("tr") 

' loop through rows 
For Each trow In allrows 

    Set tcell = trow.Cells 

    ' loop through cells 
    For r = 0 To (tcell.Length - 1) 

     Set td = tcell(r) 

     ' loop through search text 
     For i = 0 To UBound(strTemp) 
      ' search row for string 
      txt = LCase(td.innerHTML) 
      If (InStr(txt, LCase(strTemp(i))) > 0) Then 

      Application.PrintCommunication = True 
       ' search string found. create output html table 
       'strOutput = strOutput & tRows(r).outerHTML & vbCrLf 
       strOutput = tcell(r).innerHTML 

       'Output string to new workbook 
       ActiveCell.Value = strOutput 

       'Move one cell to the right for next possible match to be pasted 
       ActiveCell.Offset(0, 1).Select 


       'Reset string (just in case, not needed) 
       Debug.Print strOutput 
       strOutput = "" 
      End If 
     Next i 
    Next r 
Next trow 
End Sub 
+0

Ich denke, einige Ihrer Probleme könnten behoben werden durch [Vermeidung mit '.Select'] (http://StackOverflow.com/Questions/10714251/how-to-avoid-using-select-in-excel-vba- Makros). Wenn es zu "ActiveCell" kommt, ist das * wahrscheinlich * nicht die Zelle, die Sie erwarten. – BruceWayne

+0

Mit Web Scraping, wenn es beim Durchlaufen funktioniert, aber nicht, wenn es geradeaus läuft (ohne Pausen), deutet dies oft auf ein Timing-Problem hin: zusätzlicher Inhalt wird möglicherweise geladen * nachdem * die Seite als "vollständig" gemeldet wird. Versuchen Sie, eine Pause hinzuzufügen, bevor Sie versuchen, auf Inhalte zuzugreifen. –

+0

@TimWilliams Ich habe eine Application.Wait (Now + TimeValue ("0:00:01")) in der ersten Zeile unterhalb der if-Anweisung und immer noch das gleiche Problem. Denkst du, dass es woanders hingehen sollte? –

Antwort

0

die Antwort dank @TimWilliams gefunden.

Ich habe

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

Unterhalb der

Do Until ie.ReadyState = READYSTATE_COMPLETE Or ie.ReadyState =  READYSTATE_INTERACTIVE 
     'DoEvents 
    Loop 

und jetzt der Code ausgeführt wird, wie beabsichtigt!

Verwandte Themen