2016-07-27 1 views
0

Мне нужно найти строку на прилагаемом рисунке с помощью vba в excel. У меня есть код ниже, но он не находит дату, которую я ищу. для цикла, чтобы найти это на последней «Для каждого элемента в Elements2»найти строку в DOM-проводнике с помощью VBA

Dim Doc As HTMLDocument 
Dim Elements As IHTMLElementCollection 
Dim elements1 As IHTMLElementCollection 
Dim Elements2 As IHTMLElementCollection 

Dim iCnt As Integer 
Dim Element As IHTMLElement 
Dim appIE As InternetExplorerMedium 

Sheets(1).Cells(1, 1).Value = "" 
complete = 0 

Set appIE = New InternetExplorerMedium 
sURL = "https://example.com" 

With appIE 
    .Navigate sURL 
    .Visible = True 

    Do While appIE.Busy Or appIE.ReadyState <> 4 
     DoEvents 
    Loop 

    Do While complete <> 1 

     Set Doc = appIE.Document 
     Set Elements = Doc.GetElementsByTagName("input") 
     Set elements1 = Doc.GetElementsByTagName("strong") 
     Set Elements2 = Doc.GetElementsByTagName("td") 


      For Each Element In Elements 
       If Element.ID = "form-id" Then 
        requestnumber = Element.GetAttribute("Value") 
       End If 

       If Element.ID = "remedy-case-info" Then 
        CaseInfo = Element.GetAttribute("Value") 
       End If 
      Next Element 



      For Each Element In elements1 

      If InStr(1, Element.InnerHtml, "EM") Then 

       For iCnt = 1 To Len(Element.InnerText) 
        If IsNumeric(Left(Element.InnerText, 2)) Then 
         NumericOnly (Element.InnerText) 
        End If 
       Next iCnt 
      End If 
      Next Element 
      AClientCount = tempcount 



      For Each Element In Elements2 

      ' If InStr(1, Element.InnerHtml, "td") Then 
        If InStr(1, Element.InnerHtml, "value-field align-top") Then 
          Requestdate = Element.GetAttribute("Value") 
        End If 
      ' End If 

      Next Element 
      Set Elements = Nothing 

     If requestnumber <> "" Then 
      Sheets(1).Cells(1, 1).Value = requestnumber & " - " & CaseInfo & " - " & tempcount & " - " & Requestdate 
      complete = 1 
     End If 
Loop 
.Quit 

End With 

enter image description here

+0

Если вы делаете 'Debug.Print Element.InnerHtml' ли дата отображаться в ближайшем окне, как часть всей InnerHtml? Если это так, используйте 'Mid \ Left \ Right и т. Д .' для анализа даты из строки. –

+0

К сожалению, он не подбирает эту фразу вообще. Я могу видеть другие фразы, которые выпадают с тегом td, но не это. – user3323922

+0

возможно, debug.pring на все 'element2.innerhtml' покажет правильный, и вы сможете создать способ его разбить. Иногда это единственный способ, который я нашел в отладке веб-сайта. –

ответ

0

Свойство innerHtml поднимает содержание в теге, но не подобрать сам тег. Свойство outerHTML включает сам тег, а также содержимое тега.

Пример:

HTML <p class="fee fie foe fum">bar <b>bat</b> <i>cat</i> car</p>

  • innerHTML bar <B>bat</B> <I>cat</I> car
  • outerHTML <P class="fee fie foe fum">bar <B>bat</B> <I>cat</I> car</P>

Чтобы выполнить текстовый матч на значение атрибута элемента, вы должны смотреть на свойство externalHTML элемента, а не свойство innerHTML.

Однако атрибут класса элемента можно получить через свойство Classname, чтобы вы могли заменить InStr на innerHTML с этим:

If InStr(1, Element.className, "value-field align-top") Then 

Это не идеально, потому что это было бы вполне допустимо, чтобы написать имена классов в другом порядке - например class="align-top value-field" - и это не будет воспринято функцией InStr.

Было бы лучше начать с getElementsByClassName (который не заботится о каком порядке имена классов находятся в), а затем использовать свойство тэгу, чтобы проверить есть правильный тег, например:

Set Elements2 = Doc.getElementsByClassName("value-field align-top") 

' code for the loops on Elements and Elements1 goes here 

For Each Element In Elements2 
    If Element.tagName = "td" Then 

Наконец, Element.getAttribute("value") вернет Null, если элемент не имеет именованного атрибута, называемого значением. Для того, чтобы получить текстовое значение элемента, используйте вместо этого:

Requestdate = Element.innerText 
+0

Thank you курган. Сделал изменения в соответствии с вашей инструкцией и заставил мой код работать. Большое спасибо. – user3323922

Смежные вопросы