请求帮助在Excel中获取数据

时间:2014-02-22 16:55:14

标签: excel vba

我跟踪某些股票,我想知道他们的分析师价格目标是什么。我经常使用两个不同的网站:finviz和marketwatch。所以,如果我想知道AAPL股票的平均分析师价格,我会输入:

marketwatch - http://custom.gtm.idmanagedsolutions.com/custom/ibg/html-analyst.asp?symb=aapl

finviz - http://elite.finviz.com/quote.ashx?t=aapl&ty=c&ta=0&p=i15

正如您可能预期的那样,搜索查询保持不变,但只是自动收报机(此处为“AAPL”)发生了变化。

我想要做的是找出一种方法来自动/在后台定期更新我跟踪的股票在这些页面上列出的目标价格。类似的东西:

   A     |   B      |   C        
ticker     mktw PT    finviz PT 
AAPL         XX           YY
GOOG         XX           YY
NFLX         XX           YY
AMZN         XX           YY

简单的部分似乎是excel查找每个股票的网站,因为如上所述,股票代码保持静态,除了股票代码。困难的部分是如何在我正在寻找的页面上找到并提取数据(分析师价格目标)。

作为一个起点,我想通过下面的线条可以用来拉取数据;但我不知道如何解析最终结果。我也怀疑下面的方法是否有效,看起来真的非常密集,我想可以采用更简化的措施。

Option Explicit
Sub get_data()
Dim result As String
Dim myURL As String
Dim winHttpReq As Object
Set winHttpReq = CreateObject("WinHttp.WinHttpRequest.5.1")
myURL = "http://custom.gtm.idmanagedsolutions.com/custom/ibg/html-analyst.asp?symb=aapl"

winHttpReq.Open "GET", myURL, False
winHttpReq.Send
result = winHttpReq.responseText
Application.ScreenUpdating = True

Range("Sheet1!A1").Value = result
End Sub

是否有快速而肮脏的方式在excel中取消此功能?谢谢你的帮助。

1 个答案:

答案 0 :(得分:0)

以下代码将marketwatch和finviz的平均目标价格放在sheet1的单元格A1和A2中。您可以将其置于循环中并捕获所有股票的数据。

Sub get_data()
Dim result As String
Dim myURL As String

    For x = 1 To 2
      myURL = Choose(x, "http://custom.gtm.idmanagedsolutions.com/custom/ibg/html-analyst.asp?symb=aapl", "http://elite.finviz.com/quote.ashx?t=aapl&ty=c&ta=0&p=i15")
      Set html_doc = CreateObject("htmlfile")
      Set xml_obj = CreateObject("MSXML2.XMLHTTP")

      xml_obj.Open "GET", myURL, False
      xml_obj.send
      html_doc.body.innerhtml = xml_obj.responseText
      Set xml_obj = Nothing

      If x = 1 Then
        Set Results = html_doc.getElementsByTagName("td")
        For Each itm In Results
          If itm.className = "mwSmall" And InStr(1, itm.innerhtml, "Average Target Price:", vbTextCompare) > 0 Then
              mktw_pt = Trim(itm.nextSibling.innertext)
              Exit For
          End If
        Next itm
      Else
        Set Results = html_doc.getElementsByTagName("td")
        For Each itm In Results
          If itm.className = "snapshot-td2-cp" And InStr(1, itm.outerhtml, "Target Price", vbTextCompare) > 0 Then
              finviz_pt = itm.nextSibling.innertext
              Exit For
          End If
        Next itm
      End If
    Next x

    Range("Sheet1!A1").Value = mktw_pt
    Range("Sheet1!A2").Value = finviz_pt

End Sub