나는 morningstar의 웹 사이트로 자금 크기를 업데이트하려고합니다. IE 자동화를 사용한 이전 시도가 작동하지 않아 XML httpRequest로 전환했습니다 (작업 속도도 훨씬 빨라졌습니다). 이제 웹 사이트에서 얻은 문서에서 올바른 라인을 인쇄하는 데 어려움을 겪고 있습니다. 코드에서 "tr"태그 내의 3 번째 "td"태그를주는 코드를 원한다면 "td"태그는 "Fund Size (Mil)"라고합니다. 그래서 코드는 모든 "td"태그의 표제를 반복하고 그걸 찾으면 액션으로 뛰어납니다. "{line heading}" = "Fund Size (Mil)"
. 이제 이것이 문제입니다. 나는이 표제를 말하는 법을 모른다.VBA의 HTML 구문 분석
각 "td"태그를 변수로 설정하려고했습니다. "tr"태그에 3 개의 "td"태그가 있기 때문에 각 "td 태그"에 대해 변수 row1, row2, row3이 있습니다.)하지만 난 지금이 작업을 수행 할 때, 내가 얻을 오류 438 런타임 : I Debug.Print TDElement.innerHTML
, 나는 보이지 않는 경우 객체가
Debug.Print TDElements.getElementsByTagName("tr")(0).Cells(0).innerHTML
또한 라인이 속성 또는 메서드를 지원하지 않습니다 내가 필요한 "td"태그들. 대신에 .innerText
을 넣으면 모든 "td"태그를 볼 수 있습니다.
이제 질문은 다음과 같습니다. 1) 머리글을 직접 참조하려면 어떻게해야합니까? (아래 코드 라인 For Each
내의주석이 달린 코드 라인을보십시오.) 2) .innerHTML로 모든 td 태그를 볼 수없는 이유는 무엇입니까?하지만 .innerText로 볼 수 있습니다.
URL http://www.morningstar.co.uk/uk/funds/snapshot/snapshot.aspx?id=F0GBR04BKW 엑셀 2010, IE 버전 (11)
Sub XMLhttpRequestTest2()
'Microsoft XML, v 6.0
'Microsoft HTML object library, used in parsing HTML
Dim myurl As String
Dim TDElement As Object
Dim TDElements As IHTMLElementCollection
Dim IE As MSXML2.XMLHTTP60
Dim HTMLDoc As MSHTML.HTMLDocument
Dim HTMLBody As MSHTML.HTMLBody
Set IE = New MSXML2.XMLHTTP60
Set HTMLDoc = New MSHTML.HTMLDocument
Set HTMLBody = HTMLDoc.body
myurl = "http://www.morningstar.co.uk/uk/funds/snapshot/snapshot.aspx?id=F0GBR04BKW"
IE.Open "GET", myurl, False
IE.send
HTMLBody.innerHTML = IE.responseText
Set TDElements = HTMLDoc.getElementsByTagName("td")
For Each TDElement In TDElements
Debug.Print TDElement.innerText '.innerText/.innerHTML. Can't see the fund size with .innerHTML??
' If "{line heading}" = "Fund Size (Mil)" Then 'How can I refer to headings in the html document?
' Worksheets("Sheet3").Range("B3") = Split("{line text}", ";")(1) 'reference to line text?
Next
End Sub
H2SO4의의 위의 문제를 해결 대답합니다. 아래는 초기 질문에 대한 확장입니다.
이제 TDElement에 몇 줄의 텍스트가 할당되었습니다 (h2so4의 값 10을 3으로 바꿨으므로 자금이 문자열을 찾으면 코드가 다음 3 줄을 표시합니다). 어떻게하면 더 파싱 할 수 있습니까? 현재 줄 Worksheets("helper").Cells(x, 6).Value = Split(TDElement.innerText, " ")(1)
은 필자가 필요로하는 값 (769.28)을 반환하지만, 앞으로 정확히 무엇이 일어나는지 정말로 이해한다면 도움이 될 것입니다.
운동을 위해서, 어떻게 3 줄 모두를 자신의 세포에 인쇄 할 수 있습니까? 결과는 다음과 같습니다 : 기금 규모 (밀), 31/08/2017, 769.28 세포 (x, 6), (x, 7), (x, 8). TDElement에 "Split"또는 "Left"함수를 사용하면 함수는 위의 다른 행이 아니라 마지막 행만 대상으로합니다. 그러나, 내가 Debug.Print TDElement.innerText
/.innerHTML
일 때, 나는 또한 다른 라인을 본다. 그렇다면 마지막 행 위의 행에 어떻게 접근 할 수 있습니까?
Debug.Print TDElement.innerText
의
출력 :
기금 크기 (밀)
31/08/2017
EUR 769.28
정말 고마워요! 이 작동합니다.새 정수 변수 n을 선언하고 10 대신 3을 설정하여 코드를 수정했습니다 (필요한 행만 대상으로 함). 그러나 나는 코드가 반환하는 마지막 행만 구문 분석 할 수있는 이유를 알고 싶습니다. 위의 초기 질문 ** ** 확장을 참조하십시오. – Samppa