【问题标题】:How to record API Ticker data in an Excel table如何在 Excel 表格中记录 API Ticker 数据
【发布时间】:2018-01-09 14:15:13
【问题描述】:

我没有 VBA 经验,所以我希望有一种方法可以在不使用宏或编程的情况下做到这一点 - 如果没有代码方面的帮助并解释它在做什么,那么我可以从中学习,将不胜感激。 :)

我正在使用每日更新的 API 代码,它给了我一个日期和一个值。

然后,我有一个为年份预定义的表格,例如 01/01/18 > 31/12/18(例如),与值的单元格相邻。

我使用 vlookup 来填充给定日期的值,但显然在当前状态下,数据不可记录,因此当 API 上的日期从 01/01/18 更改为 02/01/18值丢失,它移动到下一个指定的单元格来填充。

有没有办法记录/存储这些数据——自动使其成为非外部数据?无需手动复制/粘贴文本或值?

【问题讨论】:

  • 不清楚您所说的“API 代码”是什么意思。 (请注意,如果您将鼠标悬停在它上面,则不建议使用“API”标签。)除非这个问题是关于编码的,否则它可能与 SO 无关。回顾一下:stackoverflow.com/help/how-to-ask,然后重新审视你的问题。简而言之,没有人会编写你的代码,看起来你在问一个编程问题(尽管你想要实现的目标不是很清楚)。
  • 嗨,JDV,感谢您回复我。代码示例如下:api.fixer.io/latest?symbols=USD,GBP 在这种情况下,它每天都会更新收盘货币结算值。我希望尽可能避免使用代码,只是想知道 Excel 中是否有办法实现它而不会让它变得太复杂
  • 您需要 VBA 来完成此操作,因为您尝试编写的任何公式都会在日期更改为设置查找的日期时获取 NULL。没有办法用公式说“如果昨天提取了一些非空值,但今天它只找到这个日期的空值,那么使用你找到的前一个非空值”。执行此操作的 VBA 可能只是从 API 中获取数据(或等待您将其粘贴),然后将日期/值附加到表中以永久记录。每次出现新值时,它都会将其粘贴到列表的末尾。
  • 是的,要备份@JNevill 所说的内容,所有解决方案都使用 VBA 和一个按钮从您需要的任何代码源中获取。

标签: excel api store record ticker


【解决方案1】:

您从该 API 获取的数据是 JSON。不幸的是,VBA 中对 JSON 的支持是 100% 不存在的。有些人已经制作了一些库,但是由于您是 VBA 新手,而且 JSON 响应非常小,我认为最好将来自 API 的响应视为字符串并通过解析获取我们需要的东西字符串。

该 URL 的示例(将获取的内容附加到 Sheet1 列 A、B、C 和 D:

Sub getTickerValue()

    'Get the data from the API
    Dim strResponse As String: strResponse = LoadHTML("https://api.fixer.io/latest?symbols=USD,GBP")

    'Since we aren't actually going to parse the json because it's not well supported in VBA
    '   we will instead remove everything we don't care about and parse the results
    '   So replace out double quotes and squirrely braces (Not a great idea for more complex json)
    strResponse = Replace(strResponse, Chr(34), "")
    strResponse = Replace(strResponse, "}", "")
    strResponse = Replace(strResponse, "{", "")

    'Load up each item into an array splitting on comma
    Dim jsonArray As Variant: jsonArray = Split(strResponse, ",")

    'Loop the array, sniff for the data we want, and toss it in it's respective variable
    Dim strBase As String, strDate As String, strRate1 As String, strRate2 As String
    For Each elem In jsonArray
        If Split(elem, ":")(0) = "base" Then strBase = Split(elem, ":")(1)
        If Split(elem, ":")(0) = "date" Then strDate = Split(elem, ":")(1)
        If Split(elem, ":")(0) = "rates" Then strRate1 = Split(elem, ":")(2)
        If Split(elem, ":")(0) = "USD" Then strRate2 = Split(elem, ":")(1)
    Next elem

    'Set up the range where we will output this by starting at cell A99999
    '   in Sheet1 and going up until we hit the first occupied cell
    '   offset by 1 row to get the first unoccupied cell
    Dim outRange As Range
    Set outRange = Sheet1.Range("A99999").End(xlUp).Offset(1)

    'Now we know the last unoccupied cell in Sheet1, go ahead and dump the data
    outRange.Value = strBase
    outRange.Offset(, 1).Value = strDate
    outRange.Offset(, 2).Value = strRate1
    outRange.Offset(, 3).Value = strRate2


End Sub

Function LoadHTML(xmlurl) As String
  'Using the XMLHTTP library to get the results since monkeying with IE is ugly and painful
  Dim xmlhttp

  Set xmlhttp = CreateObject("MSXML2.XMLHTTP")
  xmlhttp.Open "GET", xmlurl, False

  ' switch to manual error handling
  On Error Resume Next

  xmlhttp.Send
  If Err.Number <> 0 Then
    WScript.Echo xmlhttp.parseError.Reason
    Err.Clear
  End If

  ' switch back to automatic error handling
  On Error GoTo 0

  LoadHTML = xmlhttp.responseText
End Function

这并不完全是您要寻找的,但我认为它足够接近让您进入球场。您可以通过在工作表上创建一个按钮或形状然后将其指向“GetTickerValue”宏来运行它。或者,在将其粘贴到新的 VBA 模块后,您可以将光标停留在 GetTicketValue 代码块中,然后点击顶部的播放按钮(或 F5)。它将获取数据并将其附加到您的 Sheet1 中。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-06-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-10
    • 2016-04-09
    • 2017-04-22
    相关资源
    最近更新 更多