PPT와 VBA를 이용한 실시간 주식 시세 모니터링 프로그램입니다.

다음 파이낸스의 코스피 상위 25종목 의 시세를 가져와서 보여주는 프로그램입니다.
사실 저는 주식의 '주'자도 모르지만 


의 자료를 간단히(?) 테이블로 가져와서 5개씩 5페이지에 걸쳐 
화면전환과 에니메이션을 약간 섞어서 화면에 뿌려줍니다.

캡쳐영상(빠른 속도)



특히 일반적인 Split 을 이용한 파싱이 아니라
MSHTML 라이브러리를 이용해서 WinHTTP로 받아온 HTML속에서
 <TR>와 <TD>을 배열로 가져와서 간단히(?) 처리합니다.

그러기 위해서 Alt-F11 눌러서 매크로편집기상에서 메뉴에 도구-참조에서
Microsoft Internet controls 와 Microsoft Winhttp Service 5.1, 
Microsoft HTML Object 라이브러리를 체크해주셔야 사용이 가능합니다.

StockMonitor.pptm 과 애니메이션이 추가된 StockMonitorA.pptm 두가지 버전입니다.


핵심적인 GetData 루틴입니다.

Sub GetData()
각종 변수 선언... 생략
    Set winHttpReq = CreateObject("WinHttp.WinHttpRequest.5.1")   '인터넷 오브젝트 생성
    myURL = "http://finance.daum.net/quote/rise.daum"              ' 주소
     
    winHttpReq.Open "GET", myURL, False                             ' get방식으로 소켓을 열어서
    winHttpReq.Send                                                 ' 송신
     
    result = winHttpReq.responseText                                ' 받은 결과 수신

    '도구 메뉴 -참조 - Microsoft HTML Object Library 체크!!
    Dim myHTML As New MSHTML.HTMLDocument                           'HTML tag, id등을 이용한 추출을 위해 MSHTML 라이브러리를 이용
    Dim td As MSHTML.IHTMLElementCollection                         ' 모든 <td> 배열
    Dim tr As MSHTML.IHTMLElementCollection                         ' 모든 <tr> 배열
    Dim trObj As MSHTML.HTMLGenericElement                          ' 각 <tr> 하나
    Dim tdObj As MSHTML.HTMLGenericElement                          ' 각 <td> 하나
   
 Dim count As Integer, i As Integer
    Dim str As String
    count = 0
    
    '느린 Internet Explorer 오브젝트를 이용하기보다 Winhttp 로 html을 그대로 긁어 온 다음
    ' 읽어온 HTML 내용을 Tag나 id로 가져오기 위해 MSHTML 라이브러리를 이용. 우선 MSHTML 도큐먼트에 결과 html내용을 넣어줌.
    myHTML.body.innerHTML = result     'MSHTML을 이용하기 위해 URL접속 결과을 강제로 넣어줌
    
    Set tr = myHTML.getElementsByTagName("tr")                      '모든 <tr> 을 찾아서
    For Each trObj In tr                                            ' 그 안의 각각의 <tr>에서
        count = count + 1                                           '카운트 증가
        i = 0
        ReDim Preserve myData(1 To 8, 1 To count)                        '주가를 담을 배열을 1개 증가 (2차원 배열)
        Set td = trObj.getElementsByTagName("td")                   ' 각각의 <tr> 안에서 모든 <td>를 찾아
        If td.Length = 8 Then                               ' 8칸짜리 td이면 (8칸: 순위,종목명,현재가,전일비,등락률,거래량,거래대금(백만),52주고가)
            For Each tdObj In td                                        '그중 각각의 <td>가
                    i = i + 1                                           '인덱스 증가
                    If count < 26 Then myData(i, count) = tdObj.innerText                '각각의 <td>안의 문자열을 저장: <td> 파포전자<td> => "파포전자"
                                                                                         ' 5페이지 * 5 개만
            Next
        Else
            count = count - 1
        End If
    Next
..나머지 생략...
....
End Sub

다른 웹사이트의 각종 자료도 이렇게 가져올 수 있겠습니다.
Split 으로 데이타 파싱하신 분들 이 방법도 이용해보세요.


이 글은 http://cafe.naver.com/gameppt/123090 에도 게재되었습니다.