Comment puis-je parcourir une plage de cellules et leur obtenir une valeur à partir d'un site Web?


Tomas Perlecky

J'essaie d'obtenir des données spécifiques d'un site Web que mon lieu de travail utilise, cependant, je ne peux pas comprendre comment obtenir des données spécifiques à écrire sur une feuille de calcul. J'ai écrit un code, qui ouvre avec succès la page Web et parcourt les données de cette page, j'ai juste besoin d'aide avec la dernière partie du code.

Dim Source As Range
        Dim Cell As Range

lastRow = Worksheets("Sheet1").Range("A1000").End(xlUp).Row
Set Source = Worksheets("Sheet1").Range("A2:A" & lastRow)

For Each Cell In Source


Dim nodes As Object, i2 As Long

Set nodes = objIE.Document.querySelectorAll("[Title='Purchase Order / Status']")

For i2 = 0 To nodes.Length - 1

    If nodes.Item(i2).innerText Like "*" & Cell.Value & "*" Then
        Cell.Offset(0, 3).Value = ' Im missing the code here
        Exit For
    End If

Next
Next

Je manque la dernière partie du code (marqué dans le code ci-dessus comme manquant). Ce code parcourt ma feuille de calcul, puis toute la page Web, et recherche les données intitulées «Bon de commande / Statut». Cette partie du code est bien.

Ensuite, j'ai essayé Cell.Offset(0, 3).Value = objIE.Document.querySelector("[Title='Planned Destinations ']").innerText, qui obtient avec succès la valeur de texte interne 'Destinations planifiées', dont j'ai besoin. Cependant, il obtient toujours le premier texte interne 'Destinations planifiées' trouvé sur toute la page.

Voici une image de ce qu'il fait et de ce que je veux qu'il fasse:

Exemple

Remarquez la colonne D.

Voici une partie du site Web:

<tr class="outboundPlanAltRowStyle">
<td class="outboundPlanHour" style="height:25px;width:40px;white-space:nowrap;">11:00</td>
 <td onmouseover="this.className='outboundPlanHover'" onmouseout="this.className=''" 
     onclick="cellClicked(1019543,14)" 
     style="height:25px;width:150px;white-space:nowrap;" class="">
<table class="outboundPlan_PREBOOKED" style="width: 200px; table-layout: fixed" cellpadding="0px" cellspacing="0px">
   <tbody><tr>
    <td title="Purchase Order / Status" class="outboundCell"> 325839 / PREBOOKED</td></tr>
    <tr><td title="Subcontractor Name / Load Numbers " 
               class="outboundCell">Tesco FM /  - </td></tr>
    <tr><td title="Planned Destinations " class="outboundCell" 
       style="overflow: hidden"> 39019 (NDC Teresin)&nbsp;</td></tr>
    <tr><td title="Status Date" class="outboundCell">28.01.2021 12:02&nbsp;</td></tr></tbody>
</table></td>

J'ai besoin de la valeur de texte interne title = "Destinations planifiées" dans les cellules en trouvant title = "Bon de commande / Statut", qui est enregistré dans la feuille de calcul (Colonne A dans l'image ci-dessus)

ÉDITER:

Enfin réussi à le faire fonctionner. J'ai utilisé une approche différente de mon problème, mais sans les conseils et l'aide de Tim, je ne pourrais pas le terminer. Voici le code final et fonctionnel de mon problème, au cas où quelqu'un en aurait besoin, ou une inspiration:

Dim objResultList As MSHTML.IHTMLDOMChildrenCollection
        Dim lResultCount As Long
        Dim lResultLoop As Long
        Dim anchorLoop As MSHTML.HTMLAnchorElement

Set objResultList = objIE.Document.querySelectorAll("[Title='Planned Destinations ']")
    
    lResultCount = objResultList.Length

    Debug.Print
    
    For lResultLoop = 0 To lResultCount - 1
        
        Set anchorLoop = objResultList.Item(lResultLoop)
     
    Next
        
    i3 = 0
    Set Source = Worksheets("Sheet1").Range("D2:D" & lastRow)
    If Not anchorLoop Is Nothing Then
    For Each Cell In Source
    Cell.Value = objResultList.Item(i3).innerText
    i3 = i3 + 1
    
    Next
    End If
    End If
Tim Williams

Vous devez aller "vers le haut" de nodes.Item(i2)la table parent (en utilisant par exemple parentElement), puis interroger cette table (pas le document entier) pour l'autre cellule que vous voulez:

Sub tester()
    'Added reference to Microsoft HTML Object Model
    Dim doc As New HTMLDocument, nodes As Object, i As Long
    Dim tbl As HTMLTable, nxt
    
    doc.body.innerHTML = Range("A1").Value 'load HTML from cell for testing

    Set nodes = doc.querySelectorAll("td [Title='Purchase Order / Status']")
    Debug.Print "found " & nodes.Length & " cell(s)"
    
    For i = 0 To nodes.Length - 1
    
        'get the parent table
        Set tbl = nodes(i).parentElement.parentElement.parentElement
        'find the other cell in this table
        Set nxt = tbl.querySelector("td [Title='Planned Destinations ']")
        
        Debug.Print nodes(i).innerText, nxt.innerText
        
    Next i
    
End Sub

HTML en A1:

<table><tr>
      <td>11:00</td>
     <td>
             <table class="outboundPlan_PREBOOKED">
            <tbody>
                    <tr><td title="Purchase Order / Status" class="outboundCell"> 325839 / PREBOOKED</td></tr>
                   <tr><td title="Subcontractor Name / Load Numbers "  class="outboundCell">Tesco FM /  - </td></tr>
                   <tr><td title="Planned Destinations " class="outboundCell" >39019 (NDC Teresin)&nbsp;</td></tr>
                   <tr><td title="Status Date" class="outboundCell">28.01.2021 12:02&nbsp;</td></tr>
            </tbody>
            </table></td>
</tr></table>

Articles connexes