2014-12-10 2 views
0

사용중인 웹 사이트는 www.msci.com입니다. 웹 사이트는 변경할 수있는 여러 가지 양식을 사용합니다. 선택의 각 조합은 특정 값 행렬 (원하는 데이터)을 작성합니다. 내 엑셀 시트에 동일한 변수를 작성하여 시트 B의 일부 코드를 채워야 만 동일한 시트에 다른 곳에 배치해야하는 데이터 테이블을 작성해야합니다.vba를 사용하여 웹 기반 데이터 가져 오기

내 매크로에서 이러한 HTML 메뉴 (양식)를 채우기 위해 일부 html 코드를 통합해야한다고 생각합니다. 폼의 기본 HTML ID를 발견하고이를 코드에 통합하려고했습니다. 나는 코드가 부분적으로 작동한다고 생각하지만, 캘린더 템플릿에서 날짜를 변경하는 것은 분명히 작동하지 않습니다. 지금까지 내 코드 :

웹 페이지는 쿼리 테이블의 데이터를 추출하기에 너무 복잡하다면
Sub getMSCIdata() 

Dim mktval As String 
Dim curr As String 
Dim indlvl As String 
Dim calendarinput As String 

curr = Range("$B$3") 
mktval = Range("$B$2") 
indlvl = Range("$B$4") 
calendarinput = Range("$B$5") 

With ActiveSheet.QueryTables.Add(Connection:= _ 

    "URL;http://www.mscibarra.com/webapp/indexperf/pages/IEIPerformanceRegional.jsf?scope=0&mktval&size=36&style=C&calendarinput&curr&indlvl&lang=en" _ 
    , Destination:=Range("$A$10")) 
    .Name = _ 
    "IEIPerformanceRegional.jsf?scope=0&mktval&size=36&style=C&calendarinput&curr&indlvl&lang=en" 
    .FieldNames = True 
    .RowNumbers = False 
    .FillAdjacentFormulas = False 
    .PreserveFormatting = True 
    .RefreshOnFileOpen = False 
    .BackgroundQuery = True 
    .RefreshStyle = xlInsertDeleteCells 
    .SavePassword = False 
    .SaveData = True 
    .AdjustColumnWidth = True 
    .RefreshPeriod = 0 
    .WebSelectionType = xlSpecifiedTables 
    .WebFormatting = xlWebFormattingNone 
    .WebTables = """templateForm:tableResult0""" 
    .WebPreFormattedTextToColumns = True 
    .WebConsecutiveDelimitersAsOne = True 
    .WebSingleBlockTextImport = False 
    .WebDisableDateRecognition = True 
    .WebDisableRedirections = False 
    .Refresh BackgroundQuery:=False  

End With 
End Sub 

답변

1

, 당신은 HTML 문서에서 직접 데이터를 추출하기 위해 자신의 VBA를 작성할 수 있습니다.

도구/참조를 사용하여 "Microsoft HTML Object Library"참조를 추가하십시오.

WB라는 큰 WebBrowserControl이 포함 된 사용자 정의 폼을 만듭니다.

는이 코드를 폼에 추가합니다 :
Private Sub UserForm_Initialize() 
    WB.navigate ("http://www.mscibarra.com/webapp/indexperf/pages/IEIPerformanceRegional.jsf?scope=0&mktval&size=36&style=C&calendarinput&curr&indlvl&lang=en") 
    End Sub 

    Private Sub WB_DocumentComplete(ByVal pDisp As Object, URL As Variant) 
    Dim tBody As HTMLBody, row As HTMLTableRow 
    Set tBody = WB.document.getElementById("templateForm:tableResult0:tbody_element") 
    If tBody Is Nothing Then Stop 
    For Each row In tBody.rows 
     Debug.Print CellText(row, 1), CellText(row, 2), CellText(row, 0) 
    Next 
    End Sub 

    ' returns an empty string instead of an error 
    Private Function CellText(row As HTMLTableRow, ByVal cellIndex As Long) As String 
    Dim Cell As HTMLTableCell 
    On Error Resume Next 
    Set Cell = row.Cells.Item(cellIndex) 
    CellText = Trim(Cell.innerText) 
    End Function 

양식을 표시합니다. 웹 페이지가 몇 초 안에로드됩니다. DocumentComplete 이벤트는 Index Code, Last 및 MSCI Index 열을 추출하고 인쇄하는 코드를 실행합니다. 디버그 창이 표시되어야합니다 :

990300  1,811.383  EAFE 
    991100  1,785.575  EAFE + CANADA 
    144097  1,372.105  EAFE ex ISRAEL 
    991600  2,034.280  EAFE ex UK 
    991300  1,487.429  EASEA INDEX (EAFE ex JAPAN) 
    106400  182.491  EMU 
    106507  169.293  EMU ex GERMANY 
    990600  399.741  EU 
    106569  1,076.915  EURO 
    990500  1,641.595  EUROPE 
    144115  1,422.575  EUROPE & MIDDLE EAST 
    106331  189.663  EUROPE ex EMU 
    995200  1,445.779  EUROPE ex SWITZERLAND 
    991700  1,854.892  EUROPE ex UK 
    990900  2,915.545  FAR EAST 
    113647  1,529.146  G7 INDEX 
    991200  1,740.757  KOKUSAI INDEX (WORLD ex JP) 
    990700  6,054.493  NORDIC COUNTRIES 
    990200  2,113.327  NORTH AMERICA 
    990800  2,351.421  PACIFIC 
    991400  1,288.304  PACIFIC ex JAPAN 
    106570  1,163.646  PAN-EURO 
    990100  1,721.971  WORLD 
    701609  1,859.470  WORLD WITH USA GROSS 
    996200  1,744.360  WORLD ex AUSTRALIA 
    701610  1,844.715  WORLD ex AUSTRALIA WITH USA GROSS 
    106330  213.390  WORLD ex EMU 
    106332  1,745.644  WORLD ex EUROPE 
    144079  1,637.763  WORLD ex ISRAEL 
    991500  1,754.637  WORLD ex UK 
    991000  1,820.809  WORLD ex USA 

이제 워크 시트에 값을 입력하는 것이 간단합니다.

이 기술은 HTTP Auth 및 쿠키를 설정하는 로그인이 필요한 웹 사이트로 보호되는 웹 사이트로 확장 될 수 있습니다.

웹 페이지에서 데이터를 추출하는 데 그치지 않습니다. VBA를 사용하여 양식 요소를 채우고 제출 단추를 클릭 할 수 있습니다.

는 폼에 cmdNextPage 명령 단추 단추를 추가하고이 코드를 추가 :이 테스트 할 때
Private Sub cmdNextPage_Click() 
    Dim theForm As HTMLFormElement, el As HTMLObjectElement 
    Set theForm = WB.document.forms("templateForm") 
    With theForm.elements 
     .Item("templateForm:_id78").value = "2115" ' set [Market] to "Frontier Markets (FM)" 
     .Item("templateForm:_id88").value = "Dec 1, 2014"  ' set [As of] 
    End With 
    theForm.submit 
    End Sub 

, 나는 그것이 작동하지 않는 것을 발견합니다. 양식 요소는 업데이트되지만 제출은 아무 것도하지 않습니다. 내가 추적하지 못한 그 웹 페이지에서 계속 진행중인 일이 있습니다. AJAX를 사용하여 결과 테이블을 업데이트하기 때문에 DocumentComplete를 사용하여 페이지가 업데이트되는 것을 감지 할 수 없습니다. 피들러 (Fiddler)를 사용하여 무엇이 진행되고 있는지 확인하려면 코드에서 AJAX 요청을 복제 할 수 있습니다. 죄송하지만 더 이상 문제를 해결할 시간이 없습니다.

+0

안녕하세요. Tom, 빠른 답변을 보내 주셔서 감사합니다. 귀하의 코드를 실행하려고하지만, 소위 '웹 기반 컨트롤'을 만드는 방법을 모르겠습니다. 'Set WB = myWebBrowser.Object'시도했지만 작동하지 않는 것 같습니다. – user45663

+0

토요일에 단계별 가이드를 게시 할 예정입니다. –

관련 문제