2016-07-27 3 views
0

Excel에서 vba를 사용하여 첨부 된 그림에서 문자열을 찾아야합니다. 아래 코드가 있지만 찾고있는 날짜를 찾지 못했습니다. 찾을 루프 는 innerHTML 속성은 태그 내에서 컨텐츠를 받았지만 태그 자체를 선택하지 않는VBA를 사용하여 DOM 탐색기에서 문자열 찾기

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

당신이 Element.InnerHtml' 날짜가 전체 innerHTML을의 일환으로 직접 실행 창에 표시 않는'을 Debug.Print을한다면? 그렇다면 'Mid \ Left \ Right, etc.'를 사용하여 문자열에서 날짜를 파싱하십시오. –

+0

불행히도이 문구는 전혀 사용하지 않습니다. td 태그가있는 다른 구문을 볼 수 있지만이 것은 아닙니다. – user3323922

+0

아마도'element2.innerhtml'에있는 debug.pring이 올바른 것을 보여줄 것입니다. 그런 다음 그것을 제거하는 방법을 만들 수 있습니다. 때로는 이것이 웹 사이트 스크래핑을 디버깅하는 데있어 내가 찾은 유일한 방법입니다. –

답변

0

"요소 2에서 각 요소에 대해"마지막에 있습니다. 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>

, 당신은 볼 필요가있을 것이다 요소의 outerHTML 속성이며 innerHTML 속성은 아닙니다. 이 적합하지 않습니다

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

는 쓰기 완벽하게 유효 때문에 :이와 innerHTML을에 InStr을 대체 할 수 있도록

그러나, 요소의 클래스 속성은 클래스 이름 속성을 통해 액세스 할 수 있습니다 클래스 이름을 다른 순서로 - 예. 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")은 요소에 "value"라는 명명 된 특성이 없으면 Null을 반환합니다. 요소의 텍스트 값을 얻으려면, 대신를 사용

Requestdate = Element.innerText 
+0

고맙습니다. 귀하의 지시에 따라 변경하고 작동하도록 제 코드를 만들었습니다. 고마워. – user3323922