[英]Excel VBA : How can I extract yahoo finance historical data in a defined date range
第一次在這里發帖。 我需要有關以下問題的幫助。
我正在從 Excel VBA 中的雅虎財經網站 url 中提取歷史價格。 我得到了一個用於代碼的可變單元格,數據的開始日期和結束日期。 我轉換了 url 以獲取這些單元格的值來獲取我的數據。
問題:宏從“ticker”變量單元格中提取數據,但它沒有給出我在“開始/結束日期”變量單元格中定義的日期范圍。 相反,它給了我整個歷史數據。
原文鏈接
http://chart.finance.yahoo.com/table.csv?s=NVDA&a=3&b=15&c=2012&d=3&e=15&f=2017&g=m&ignore=.csv
轉換后的鏈接
http://chart.finance.yahoo.com/table.csv?s= " & Tick1 & " &a= " & smonth & " &b= " & sday & " &c= " & syear & " &d= " & emonth & " &e= " & eday & " &f= " & eyear & " &g=m&ignore=.csv
Sub book1()
'Macro Sheet 1
'Variables
Dim Tick1 As String
Dim Tick2 As String
Dim Tick3 As String
Dim sday As Long
Dim smonth As Long
Dim syear As Long
Dim eday As Long
Dim emonth As Long
Dim eyear As Long
Dim newsheet As Object
'Delete content
With Sheets("Sheet1")
.Range("A12:D200").Clear
End With
'Variable cells
Tick1 = Range("b1")
Tick2 = Range("c1")
Tick3 = Range("d1")
sday = Day(Range("b2"))
smonth = Month(Range("b2")) - 1
syear = Year(Range("b2"))
eday = Day(Range("b3"))
emonth = Month(Range("b3")) - 1
eyear = Year(Range("b3"))
'Extract data
'Ticker 1
With ActiveSheet.QueryTables.Add(Connection:= _
"TEXT;http://chart.finance.yahoo.com/table.csv?s= " & Tick1 & " &a= " & smonth & " &b= " & sday & " &c= " & syear & " &d= " & emonth & " &e= " & eday & " &f= " & eyear & " &g=m&ignore=.csv", _
Destination:=Range("$A$12"))
.Name = Tick1
.FieldNames = True
.RowNumbers = False
.FillAdjacentFormulas = False
.PreserveFormatting = True
.RefreshOnFileOpen = False
'.RefreshStyle = xlInsertDeleteCells
.RefreshStyle = xlOverwriteDeleteCells
.SavePassword = False
.SaveData = True
.AdjustColumnWidth = True
.RefreshPeriod = 0
.TextFilePromptOnRefresh = False
.TextFilePlatform = 850
.TextFileStartRow = 1
.TextFileParseType = xlDelimited
.TextFileTextQualifier = xlTextQualifierDoubleQuote
.TextFileConsecutiveDelimiter = False
.TextFileTabDelimiter = False
.TextFileSemicolonDelimiter = False
.TextFileCommaDelimiter = True
.TextFileSpaceDelimiter = False
.TextFileColumnDataTypes = Array(1, 9, 9, 9, 9, 9, 1)
.TextFileTrailingMinusNumbers = True
.Refresh BackgroundQuery:=False
End With
'Ticker 2
With ActiveSheet.QueryTables.Add(Connection:= _
"TEXT;http://chart.finance.yahoo.com/table.csv?s= " & Tick2 & " &a= " & smonth & " &b= " & sday & " &c= " & syear & " &d= " & emonth & " &e= " & eday & " &f= " & eyear & " &g=m&ignore=.csv", _
Destination:=Range("$C$12"))
.Name = Tick2
.FieldNames = True
.RowNumbers = False
.FillAdjacentFormulas = False
.PreserveFormatting = True
.RefreshOnFileOpen = False
'.RefreshStyle = xlInsertDeleteCells
.RefreshStyle = xlOverwriteDeleteCells
.SavePassword = False
.SaveData = True
.AdjustColumnWidth = True
.RefreshPeriod = 0
.TextFilePromptOnRefresh = False
.TextFilePlatform = 850
.TextFileStartRow = 1
.TextFileParseType = xlDelimited
.TextFileTextQualifier = xlTextQualifierDoubleQuote
.TextFileConsecutiveDelimiter = False
.TextFileTabDelimiter = False
.TextFileSemicolonDelimiter = False
.TextFileCommaDelimiter = True
.TextFileSpaceDelimiter = False
.TextFileColumnDataTypes = Array(9, 9, 9, 9, 9, 9, 1)
.TextFileTrailingMinusNumbers = True
.Refresh BackgroundQuery:=False
End With
'Ticker 3
With ActiveSheet.QueryTables.Add(Connection:= _
"TEXT;http://chart.finance.yahoo.com/table.csv?s= " & Tick3 & " &a= " & smonth & " &b= " & sday & " &c= " & syear & " &d= " & emonth & " &e= " & eday & " &f= " & eyear & " &g=m&ignore=.csv", _
Destination:=Range("$D$12"))
.Name = Tick3
.FieldNames = True
.RowNumbers = False
.FillAdjacentFormulas = False
.PreserveFormatting = True
.RefreshOnFileOpen = False
'.RefreshStyle = xlInsertDeleteCells
.RefreshStyle = xlOverwriteDeleteCells
.SavePassword = False
.SaveData = True
.AdjustColumnWidth = True
.RefreshPeriod = 0
.TextFilePromptOnRefresh = False
.TextFilePlatform = 850
.TextFileStartRow = 1
.TextFileParseType = xlDelimited
.TextFileTextQualifier = xlTextQualifierDoubleQuote
.TextFileConsecutiveDelimiter = False
.TextFileTabDelimiter = False
.TextFileSemicolonDelimiter = False
.TextFileCommaDelimiter = True
.TextFileSpaceDelimiter = False
.TextFileColumnDataTypes = Array(9, 9, 9, 9, 9, 9, 1)
.TextFileTrailingMinusNumbers = True
.Refresh BackgroundQuery:=False
With Sheets("Sheet1")
.Rows(62 & ":" & .Rows.Count).Delete
End With
'Copy on newsheet
Set newsheet = ThisWorkbook.Sheets.Add
newsheet.Name = "Copie"
ThisWorkbook.Sheets("Sheet1").Range("A12:D62").Copy
ThisWorkbook.Sheets("Copie").Range("A1").Select
ThisWorkbook.Sheets("Copie").Paste
End With
End Sub
您應該檢查宏使用哪些URL來建立與Yahoo Finance的連接。
您可以通過在ActiveSheet.QueryTables.Add之前添加此行來實現
MsgBox ("http://chart.finance.yahoo.com/table.csv?s= " & Tick1 & " &a= " & smonth & " &b= " & sday & " &c= " & syear & " &d= " & emonth & " &e= " & eday & " &f= " & eyear & " &g=m&ignore=.csv")
當您看到要打開的實際鏈接時,您將意識到您有很多實際上不需要的空格字符。 每個引號前后都有一個空白字符,不需要它們。 更改它,您的問題應該得到解決。
正確的行應為:
"TEXT;http://chart.finance.yahoo.com/table.csv?s=" & Tick1 & "&a=" & smonth & "&b=" & sday & "&c=" & syear & "&d=" & emonth & "&e=" & eday & "&f=" & eyear & "&g=m&ignore=.csv", _
另外,我不確定為什么您將開始日期/結束日期減去一個月減去一個月?
smonth = Month(Range(“ b2”))-1
如果您使用1月的日期,它將無法正常工作。
你解決這個問題了嗎? 我也有同樣的問題。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.