2016-06-21 1 views
0

VBA를 사용하여 웹 페이지를 엽니 다 (이 웹 페이지는 데이터 셀이있는 HTML로 구성되어 있습니다), 키워드를 찾고 키워드를 이메일로 보냅니다. 키워드의 위와 아래에있는 특정 수의 행 데이터가 있습니다. 하지만 이렇게하려면 키워드의 위치 (예 : 행 3, 열 2 또는 행 4 문자 4 ~ 10 등)를 찾을 수 있어야합니다. Internet Explorer 라이브러리에이 작업을 수행 할 수있는 명령이 있습니까? 지금까지 나는 하나의 키워드에 대해서만 코드를 가지고 있으며, 그것은 키워드로 가서 선택/강조 표시합니다. 이제 위/아래의 일정량의 행을 가져 와서 보내는 방법을 알아야합니다.VBA는 IE 웹 페이지에서 키워드의 위치를 ​​얻는 것이 가능합니다.

또 다른 질문 : 현재 웹 페이지 전체를 검사하는 중첩 루프를 만들기 위해 현재 코드를 수정하고 여러 키워드를 사용하는 것이 좋습니다.

Sub subFindScrollIE() 

Dim boolFound As Boolean 



    Dim ie As InternetExplorer 

    Set ie = New InternetExplorer 

    ie.Navigate "my URL HERE" 

    strTemp = "KEYWORD1" 

    Do Until ie.ReadyState = READYSTATE_COMPLETE 

     'DoEvents 

    Loop 

    ie.Visible = True 

    Set txt = ie.Document.body.createTextRange() 

    boolFound = txt.findText(strTemp) 

    txt.moveStart "character", -1 

    txt.findText strTemp 

    txt.Select 

    txt.ScrollIntoView 




    Set ie = Nothing 

End Sub 
+0

"데이터 셀이있는 html"? html 테이블이나 div를 의미합니까? HTML 자체에는 "셀"이 없습니다. –

+0

나는 테이블을 의미했다, 사과. 표가 1x1이므로 셀로 나타납니다. –

+0

당신은 HTML에서 테이블 요소를 반복 할 수 있습니다. 그런 다음 해당 키워드가 테이블에있는 곳을 찾으면 해당 행 위 또는 아래의 x 행에서 정보를 얻을 수 있습니다. 대부분 시행 착오를 겪을 가능성이 있지만 가능한 일입니다. –

답변

1

정규 표현식을 사용하여 이후 텍스트 및 주변 텍스트를 찾는 경우 계속해서 시작할 수 있습니다.

개인적으로, 나는 당신이 무엇을하고 있는지 찾기 위해 html 개체를 사용하는 것을 선호합니다. 다음은 일반적인 테이블을 반복하는 몇 가지 예제 코드입니다.

Sub subFindScrollIE() 

    Dim strTemp() As Variant, output() As String, txt As String 
    Dim tr As HTMLTableRow, r As Integer, i As Integer 
    Dim tRows As IHTMLElementCollection 
    Dim xlR As Byte, c As Byte 
    Dim ie As InternetExplorerMedium 

    Set ie = New InternetExplorerMedium 
    ie.Visible = True 
    ie.Navigate "E:\Dev\table.htm" 

    strTemp = Array("abc", "mno", "vwx", "efg") 

    Do Until (ie.ReadyState = 4 Or ie.ReadyState = 3): Loop 

    Set tRows = ie.Document.body.getElementsByTagName("tr") 
    xlR = 2 

    ' loop through rows 
    For r = 0 To tRows.Length - 1 

     Set tr = tRows(r) 

     ' loop through search text 
     For i = 0 To UBound(strTemp) 

      ' search row for string 
      txt = LCase(tr.innerHTML) 
      If (InStr(txt, LCase(strTemp(i))) > 0) Then 

       ' search string found. split table data into array 
       txt = tr.innerHTML 
       txt = Replace(txt, "</td><td>", "~") 
       txt = Replace(txt, "<td>", "") 
       txt = Replace(txt, "</td>", "") 
       output = Split(txt, "~") 

       ' populate cells from array 
       For c = 0 To UBound(output) 
        Sheet1.Cells(xlR, c + 2) = output(c) 
       Next c 
       xlR = xlR + 2 
      End If 
     Next i 
    Next r 

    ie.Quit 
    Set ie = Nothing 

End Sub 
+0

이것은 내가 필요한 것에 너무 가깝습니다! 정말 고맙습니다. 내가 방금 전에 깨달은 것은 HTML 테이블의 한 div에있는 모든 키워드를 둘러싼 주변 데이터이므로 HTML 행을 앞뒤로 잘라내기만하면됩니다. 그렇다면이 코드를 어떻게 변경하면됩니까? IF 문에서 제거해야하는 행 중 하나라고 가정합니다. –

+0

신경 쓰지 마라. IF 문에서 첫 번째와 세 번째 행을 주석 처리했으며, 즉각적인 창에 필요한 내용을 정확히 출력한다. 이 데이터를 출력하는 가장 좋은 방법은 무엇입니까? 그것을 Excel에 넣고 이메일로 보내는 것이 가장 좋을 것이라고 생각합니까? –

+0

그냥 놀아, 나는 activecell.value = stroutput 및 activecell.offset (0,1) 했어. 선택, 그래서 엑셀 시트에서 볼 수 있습니다. 어떤 이유로 전체 코드를 모두 똑바로 실행할 때 첫 번째 일치 항목 만 발견되어 A1 셀을 채 웁니다 (URL에 총 4 개의 키워드 일치가 있음)하지만 F8을 사용하여 코드를 단계별로 수행하면 네 개의 일치 항목이 모두 발견됩니다 엑셀에 넣고 A1 : D1을 채 웁니다. 왜 그런지 알아? –

관련 문제