2016-11-18 2 views
0

Problem: Ich habe einige Probleme herauszufinden, eine Möglichkeit, Elemente in meinem HTMLDocument auswählen, die unter einem bestimmten Punkt auf der Seite sind.Vergleichen Sie den Index von 2 Elementen in einer Sammlung

Im folgenden Codebeispiel, wie Sie in den Kommentaren sehen kann, wähle ich zuerst ein Teil von ihnen, die

IEDoc.querySelectorAll("td[width='100'][class='ListMainCent'][rowSpan='1'][colSpan='1']") 

In diesem Beispiel habe ich 10 Elemente in dieser Sammlung meine queryselector Kriterien einhalten. Jedes dieser Elemente ist in einer Tabelle enthalten, die im siebten Grad übergeordnet ist.

MsgBox TypeName(IEDoc.querySelectorAll("td[width='100'][class='ListMainCent'][rowSpan='1'][colSpan='1']")(2).ParentNode.ParentNode.ParentNode.ParentNode.ParentNode.ParentNode.ParentNode) ' HTMLTable 

Einige dieser Elemente befinden sich in derselben Tabelle.

Sie können hier das Formular sehen, das alle Tabellen the form which contains all the tables enthält.

Jetzt ist die Sache, dass ich die innere HTML nur einiger dieser Elemente und nicht alle von ihnen auswählen möchte. Das Kriterium zu wissen, ob eines dieser 10 Elemente mich interessiert oder nicht, ist seine Position auf der Webseite. Ich möchte alle Elemente, die unter der Nachricht Teil Verwendung sind. Es gibt nur eine Tabelle, die den Text für den Text enthält, und so war meine Idee zu sehen, ob die Tabelle, in der jedes Element enthalten ist, einen höheren oder niedrigeren Index in der "Form" -Auflistung hat. Wenn der Index höher ist, will ich dieses Element, sonst verwerfe ich es.

Was ich dafür getan habe, ist der folgende Code:

  1. ich die ID Bim alle Tabellen einer oder mehr aus den 10 Elementen enthalten.

    For Each Element In IEDoc.querySelectorAll("td[width='100'][class='ListMainCent'][rowSpan='1'][colSpan='1']") ' here for all of the 10 numbers found with the queryselectorall we'll find their respective table in the collection (form) and set its Class as "Bim". But since some of the numbers are in the same table, we won't have 10 tables with a classname "Bim" at the end of the process. We'll have only x tables with the classname "Bim" 
    
    
    
    Element.ParentNode.ParentNode.ParentNode.ParentNode.ParentNode.ParentNode.ParentNode.Class = "Bim" 
    
    Next 
    
  2. stellte ich die ID Stopp auf die Tabelle mit dem Text Teil Usage

    For Each Element In IEDoc.getElementsByClassName("SectionHead") 
    
        If Element.innerHTML = "Part Usage" Then 
    
         'MsgBox TypeName(Element.ParentNode.ParentNode.ParentNode)' HTMLTable 
         Element.ParentNode.ParentNode.ParentNode.ID = "Stop" 
    
        End If 
    
    Next 
    
  3. ich überprüfen, welche Tabellen mit dem Klassennamen Bim sind unter (= höherer Index) die Tabelle mit der ID Stop. Für die Tabelle (es gibt eigentlich nur eine), die das Kriterium von Punkt 3 erfüllt, wende ich IEDoc.querySelectorAll("td[width='100'][class='ListMainCent'][rowSpan='1'][colSpan='1']") in ihnen an, so dass ich alle Elemente in contains und insbesondere ihre innerHTML bekomme.

            For Each Element In IEDoc.getElementsByClassName("Bim") ' Here we check all the x tables which have the Classname "Bim" 
    
    
        If Element.indexInTheWholeForm > IEDoc.getElementById("Stop").indexInTheWholeForm Then 'and compare somehow if their index in the (form) collection if higher than the table with the ID "Stop" (this is similar to checking if the element if lower on the webpage in thic case) (we only want the element which have a higher index aka under the Part Usage table) 
    
          For Each Element2 In Element.querySelectorAll("td[width='100'][class='ListMainCent'][rowSpan='1'][colSpan='1']") ' Now we are in the table which contains the part numbers and we'll look for all the part numbers it contains by applying the queryselectorall again, but this time only in this specific table 
    
            array_parts2(iteration2) = Element.querySelectorAll("td[width='100'][class='ListMainCent'][rowSpan='1'][colSpan='1']")(iteration2).innerHTML 
    
           ActiveWorkbook.Worksheets(1).Cells(iteration2 + 1, 19) = array_parts2(iteration2) 
    
           iteration2 = iteration2 + 1 
          Next 
    
        End If 
        Next 
    

natürlich, was nicht funktioniert, ist die indexInTheWholeForm Eigenschaft, die nicht existiert. Irgendwelche Ideen, wie man das macht?

danken, die Linie für das Erreichen :)

+2

'getElementById' nur sollte ein Element zurückgeben, weil Id sollte einzigartig in der gesamten Seite sein: Wenn Sie dieselbe ID für mehrere Elemente festlegen, ist das keine gute Idee. –

+0

Ja, natürlich hast du recht, ich habe diesen Fehler nicht bemerkt. Wenn ich stattdessen die gleiche Methode aber mit dem Namen verwende, hätten Sie dann eine Idee, wie Sie dieses Indexproblem beheben können? – Seb

Antwort

0

Ungeprüfte aber ich würde so etwas tun (vorausgesetzt ich Sie richtig verstanden)

Sub Tester() 

    Const S_MATCH As String = "td[width='100'][class='ListMainCent'][rowSpan='1'][colSpan='1']" 

    Dim e, tbl, bHit As Boolean 

    '... 
    'load page etc 
    '... 


    'get all the matching rows and cycle though them 
    For Each e In IEDoc.querySelectorAll(S_MATCH) 

     'did we get to the table of interest yet? 
     If Not bHit Then 
      Set tbl = e.ParentNode.ParentNode.ParentNode.ParentNode. _ 
         ParentNode.ParentNode.ParentNode 
      If IsPartUsageTable(tbl) Then bHit = True 
     End If 

     If bHit Then 
      'we reached the table of interest, so 
      ' do something with e 
     End If 

    Next 

End Sub 

Function IsPartUsageTable(tbl) As Boolean 
    Dim e, rv As Boolean 
    For Each e In tbl.getElementsByClassName("SectionHead") 
     If Element.innerHTML = "Part Usage" Then 
      rv = True 
      Exit For 
     End If 
    Next 
    IsPartUsageTable = rv 
End Function 
+0

Hey Tim, danke für deine Lösung, aber es ist nicht das was ich gesucht habe, vielleicht war ich nicht klar genug. Mit 'IEDoc.querySelectorAll (S_MATCH)' wähle ich eine Menge von Elementen aus und jede davon hat eine Tabelle als siebten Elterngrad. Diese Tabellen sind in Form (siehe Bild). Dann muss ich sehen, ob die Tabelle, in der sie sich befinden, höher oder niedriger ist (in Bezug auf den Index) als die Tabelle, die den Text _Part Usage_ enthält. Wenn ihre Tabelle einen höheren Index hat (= unter in der Liste), behalte ich diese Elemente. Auch habe ich oben meinen Code in Bezug auf das ID-Problem editiert, ich ersetzte es durch Klasse. – Seb

+0

OK, mein Code testet, ob sie in der "Part Usage" -Tabelle oder darüber hinaus sind: Sie könnten sie so anpassen, dass nur diese Zeilen verarbeitet werden * über diese Tabelle hinaus (nicht in und darüber hinaus) –

0

Ok, so unerwartet, wie es klingt, ich glaube, ich fand eine Lösung für meine eigene Frage.Ich bestätige Ihnen, dass es funktioniert, sobald ich die Möglichkeit habe, es mit meinem Kollegen zu führen. So halte ich Punkt 1 und 2 von meinem ersten Beitrag und ich ersetzt Nummer 3 mit dem folgenden:

For i = 0 To IEDoc.getElementsByTagName("form")(0).getElementsByTagName("table").length 
      If IEDoc.getElementsByTagName("form")(0).getElementsByTagName("table")(i).ID = "Stop" Then 
       index_Part_Usage = i 
       Position_Part_Usage = index + 1 
       Exit For 
      End If 
     Next 
     'MsgBox Position_Part_Usage 






     For i = 0 To IEDoc.getElementsByTagName("form")(0).getElementsByTagName("table").length 
      If IEDoc.getElementsByTagName("form")(0).getElementsByTagName("table")(i).className = "Bim" Then 
       index = i 
       Position = index + 1 
       If index > index_Part_Usage Then 
        For Each Element2 In IEDoc.getElementsByTagName("form")(0).getElementsByTagName("table")(i).querySelectorAll("td[width='100'][class='ListMainCent'][rowSpan='1'][colSpan='1']") ' Now we are in the table which contains the part numbers and we'll look for all the part numbers it contains by applying the queryselectorall again, but this time only in this specific table 

         array_parts2(iteration2) = IEDoc.getElementsByTagName("form")(0).getElementsByTagName("table")(i).querySelectorAll("td[width='100'][class='ListMainCent'][rowSpan='1'][colSpan='1']")(iteration2).innerHTML 

         ActiveWorkbook.Worksheets(1).Cells(iteration2 + 1, 19) = array_parts2(iteration2) 

         iteration2 = iteration2 + 1 
        Next 
       End If 
      End If 
     Next i 
Verwandte Themen