【问题标题】:Get stock/company names from Yahoo Finance using VBA使用 VBA 从 Yahoo Finance 获取股票/公司名称
【发布时间】:2016-12-21 02:06:42
【问题描述】:

整个代码正在尝试使用 VBA 从 Yahoo Finance 获取历史数据。除了我试图从雅虎网站获取公司名称的代码外,一切都很好。

这第一段代码只是为了检查变量或其他什么的定义中没有错误。

Enum READYSTATE
READYSTATE_UNINITIALIZED = 0
READYSTATE_LOADING = 1
READYSTATE_LOADED = 2
READYSTATE_INTERACTIVE = 3
READYSTATE_COMPLETE = 4
End Enum

Sub GetData()
    Dim datasheet As Worksheet
    Dim EndDate As Date
    Dim StartDate As Date
    Dim symbol As String
    Dim qurl As String
    Dim nQuery As Name
    Dim LastRow As Integer
    Dim ohtml As HTMLText

On Error GoTo error_getdata

    Application.ScreenUpdating = False
    Application.DisplayAlerts = False
    Application.Calculation = xlCalculationManual
    Set datasheet = ActiveSheet

    StartDate = datasheet.Range("startDate").Value
    EndDate = datasheet.Range("endDate").Value
    symbol = datasheet.Range("ticker").Value
    symbol = UCase(symbol)

    'Download data from Yahoo Finance'
    Sheets("Home").Activate
    Sheets(symbol).Range("a1").CurrentRegion.ClearContents

    qurl = "http://ichart.finance.yahoo.com/table.csv?s=" & symbol
    qurl = qurl & "&a=" & Month(StartDate) - 1 & "&b=" & Day(StartDate) & _
            "&c=" & Year(StartDate) & "&d=" & Month(EndDate) - 1 & "&e=" & _
            Day(EndDate) & "&f=" & Year(EndDate) & "&g=" & Sheets(symbol).Range("a1") & "&q=q&y=0&z=" & _
            symbol & "&x=.csv"
    eurl = "https://finance.yahoo.com/quote/" & symbol & "?ltr=2"

这就是问题所在。我尝试废弃网站的 html 以查找公司名称。如果我查看网站的 html 代码,我发现公司名称被标记为 reactid="239"。我想我要做的是使用 getelementsbyID("239") 但我不确定。

   '''''
Dim objIe As Object

Set objIe = CreateObject("InternetExplorer.Application")
objIe.Visible = False
objIe.navigate eurl
    Application.StatusBar = "Looking for information in Yahoo Finance"
While (objIe.Busy Or objIe.READYSTATE <> 4): DoEvents: Wend
Set xobj = objIe.querySelectorAll("[reactid=239]")
Debug.Print xobj.innerText
Set xobj = Nothing
objIe.Quit
Set objIe = Nothing
Application.StatusBar = ""

'Sort the existence of a ticker in our sheet and create a new one ' 
    Dim worksh As Integer
    Dim worksheetexists As Boolean
    Dim x As Integer
    worksh = Application.Sheets.Count
    worksheetexists = False
    For x = 1 To worksh
        If Worksheets(x).Name = symbol Then
            worksheetexists = True
            Sheets(symbol).Delete
            ActiveWorkbook.Sheets.Add(after:=Worksheets(Worksheets.Count)).Name = symbol
            Exit For
        End If
    Next x
    If worksheetexists = False Then
        ActiveWorkbook.Sheets.Add(after:=Worksheets(Worksheets.Count)).Name = symbol
    End If

' Load data '
QueryQuote:
    With Sheets(symbol).QueryTables.Add(Connection:="URL;" & qurl, Destination:=Sheets(symbol).Range("a1"))
      .BackgroundQuery = True
      .TablesOnlyFromHTML = False
      .Refresh BackgroundQuery:=False
      .SaveData = True
    End With

    Sheets(symbol).Range("a1").CurrentRegion.TextToColumns Destination:=Sheets(symbol).Range("a1"), DataType:=xlDelimited, _
                TextQualifier:=xlDoubleQuote, ConsecutiveDelimiter:=False, Tab:=True, _
                Semicolon:=False, Comma:=True, Space:=False, other:=False

    Sheets(symbol).Columns("A:G").ColumnWidth = 12

    'Sort data'
    LastRow = Sheets(symbol).UsedRange.Row - 2 + Sheets(symbol).UsedRange.Rows.Count

    Sheets(symbol).Sort.SortFields.Add Key:=Range("A2"), _
        SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
    With Sheets(symbol).Sort
        .SetRange Range("A1:G" & LastRow)
        .Header = xlYes
        .MatchCase = False
        .Orientation = xlTopToBottom
        .SortMethod = xlPinYin
        .Apply
        .SortFields.Clear
    End With
Exit Sub

error_getdata:
    MsgBox ("Fatal error. Please insert a valid sticker for the stock")  
End Sub

我注意到这不是获得我想要的东西的最有效方式。首先我想学习如何完成它,然后我将承担程序的效率。

编辑:使用一些答案,我编辑了一点代码,它仍然在行上显示错误(错误 438):

Set xobj = objIe.querySelectorAll("[reactid=239]")

【问题讨论】:

  • getElementsByID() 仅适用于id = "ExampleID" 属性,reactid 不会被id 方法归类为id 属性
  • 应该用什么方法对reactid 进行分类?
  • 在“ichart.finance.yahoo.com/table.csv?s=”和符号中。你能给我们举个符号的例子吗?
  • 您使用的是什么 HTML 库?请指定您项目的工具参考,还是您只使用后期绑定?
  • symbol是公司的股票代码。 AAPL、KO等

标签: vba excel


【解决方案1】:

我会考虑使用http://www.w3schools.com/jsref/met_document_queryselectorall.asp

它可以允许使用 CSS 选择器语法选择节点,在 http://www.w3schools.com/cssref/css_selectors.asp 处有此语法的参考

所以也许类似于

document.querySelectorAll("[reactid=239]")

顺便说一句,如果您使用工具参考,您可以浏览库

Microsoft HTML Object Library         

【讨论】:

  • 没用,但多亏了你的回答,我学到了其他东西。
  • @Alejandro Jiménez Rico:嗯,是的,我已经确认了运行您的代码的错误。愚蠢的微软!这应该是 HTML5 功能,它看起来坏了。但是objIe.document.querySelectorAll("h1").Item(6).innerText 给出了公司名称。您可以获取所有 h1 标签并循环访问以防止文档结构发生变化。
猜你喜欢
  • 1970-01-01
  • 2023-01-21
  • 2020-10-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-20
  • 2020-07-08
  • 1970-01-01
相关资源
最近更新 更多