2017-02-01 15 views
0

Как я вижу это, есть две возможности получить yahoo! -Финансные данные в excel. Первый - для данных в реальном времени, второй - для исторических данных.yahoo! -финансирование (или другие) исторические данные в excel

Мне нужны исторические данные. Мой текущий VBA-код выглядит следующим образом:

firstcolumn = 2 
lastcolumn = 6 


For n = firstcolumn To lastcolumn 

Ticker = Worksheets(1).Cells(3, n).Value 

    ActiveWorkbook.Worksheets.Add After:=Worksheets(Worksheets.Count) 
     With ActiveSheet.QueryTables.Add(Connection:= _ 
     "TEXT;http://ichart.finance.yahoo.com/table.csv?s=" & Ticker & "&d=" & Month(Date) & "&e=" & Day(Date) & "&f=" & Year(Date) & "&g=d&" _ 
     & "a=" & Month(Date) & "&b=" & Day(Date) & "&c=" & Year(Date) - 1 & "&ignore=.csv" _ 
     , Destination:=Range("$A$1")) 
     .Name = "table.csv?s=BMW.DE&d=6&e=31&f=2012&g=d&a=0&b=1&c=2003&ignore=" 
     .FieldNames = True 
     .RowNumbers = True 
     .FillAdjacentFormulas = False 
     .PreserveFormatting = True 
     .RefreshOnFileOpen = False 
     .RefreshStyle = xlOverwriteCells 
     .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(5, 1, 1, 1, 1, 1, 1) 
     .TextFileDecimalSeparator = "." 
     .TextFileThousandsSeparator = "," 
     .TextFileTrailingMinusNumbers = True 
     .Refresh BackgroundQuery:=False 

    End With 
ActiveSheet.Name = Ticker 

MsgBox "status ende" 

ActiveWorkbook.Connections("table.csv?s=" & Ticker & "&d=" & Month(Date) & "&e=" & Day(Date) & "&f=" & Year(Date) & "&g=d&a=" & Month(Date) & "&b=" _ 
    & "" & Day(Date) & "&c=" & Year(Date) - 1 & "&ignore=").Delete 
ActiveSheet.QueryTables.Item(ActiveSheet.QueryTables.Count).Delete 
ActiveSheet.ListObjects.Add(xlSrcRange, ActiveSheet.Range(ActiveSheet.Cells(1, 1), ActiveSheet.Cells(1, 7).End(xlDown)), , xlYes).Name = Ticker 

'MsgBox "The data for " & Ticker & " were downloaded to a new sheet." 
Next n 

Exit Sub 
ERR: 
MsgBox "Error. Please check." 

Который идет через список тикеров и создает новый лист с тикер на складе в качестве имени, а также исторические данные, загруженные следующим образом:

enter image description here

Это зависит от меня, чтобы извлечь соответствующие столбцы, дату и цену закрытия и скопировать его туда, где они мне нужны на листе.

Я нашел код VBA, который я использую онлайн, но я не мог определить, как сделать его таким, чтобы отображались только данные и столбец цены закрытия. Насколько я вижу, код не содержит никаких запросов на «открытые», «высокие», «низкие», «закрытые», которые я мог бы исключить, чтобы получать только те данные, которые я хочу. Я также не понимаю, что линия .Name = «table.csv? S = BMW.DE & д = 6 & е = 31 & F = 2012 г = & д & а = 0 & Ь = 1 с = ignore = " может быть, поскольку эти даты не отражаются в моих данных. Последнее, хотя я прошу ежедневные данные с сегодняшнего дня до года назад, данные возвращаются до 3.1.2000.

В целом, этот негибкий способ является единственным, что я нашел для получения необходимых данных. То, что я хотел бы, однако, является то, что выглядит в следующем виде:

enter image description here

т.е. с той разницей, что я могу настроить, какие данные мне нужно (вместо всех открытых, высокий, низкий,. ..) и где вставить его в существующий лист (вместо $ A $ 1 на новый лист).

В качестве альтернативы, я бы использовал любую другую базу данных, если это было предложено. Версия Excel - 2013 год. Я посмотрел на функцию Webservice, но это также похоже на получение данных, а не исторических данных.

ответ

1

Я нашел способ использовать функцию Webservice (и сделать это нелегко).

enter image description here

В таблице столбец А содержит значение даты, и C1 содержит тикер. Ячейка С2 содержит:

=WEBSERVICE("http://ichart.finance.yahoo.com/table.csv?s="&C$1&"&a="&MONTH($A2)-1&"&b="&DAY($A2)&"&c="&YEAR($A2)&"&d="&MONTH($A2)-1&"&e="&DAY($A2)&"&f="&YEAR($A2)&"&g=d&ignore=.csv") 

Это импортирует данные (как визуализируется в вопросе), но в CSV-формате, в течение одного дня. Если указанная ячейка ссылается на $ A2 для даты и C $ 1 для тикера, эту формулу можно перетащить вправо для большего количества компаний и вниз для большего количества дат.

Содержание ячейки C2 затем:

«Дата, Open, High, Low, Close, Volume, Adj Закрыть 2016-01-07,153.15,154.95,151.55,153.75,2454400,138.63 "

Далее, ячейка С8 содержит позицию десятой запятой, потому что цена закрытия начинается после десятой запятой в поле С2:

=FIND("X";SUBSTITUTE(C2;",";"X";10)) 

Далее, ячейка С9 оставшаяся строка после . 10-запятая

=RIGHT(C2;LEN(C2)-C8) 

Далее, С10 все, вплоть до первой запятой в С9:

=LEFT(C9;FIND(",";C9)-1) 

Далее, С11 С10, преобразуется в десятичную с заданным десятичного разделителя:

=NUMBERVALUE(C10;".") 

И, наконец, чтобы сэкономить место, мы можем объединить все эти функции в таком порядке и положить его в C2, чтобы получить то же самое , Это будет выглядеть следующим образом (C13):

=NUMBERVALUE(LEFT(RIGHT(WEBSERVICE("http://ichart.finance.yahoo.com/table.csv?s="&C$1&"&a="&MONTH($A2)-1&"&b="&DAY($A2)&"&c="&YEAR($A2)&"&d="&MONTH($A2)-1&"&e="&DAY($A2)&"&f="&YEAR($A2)&"&g=d&ignore=.csv");LEN(WEBSERVICE("http://ichart.finance.yahoo.com/table.csv?s="&C$1&"&a="&MONTH($A2)-1&"&b="&DAY($A2)&"&c="&YEAR($A2)&"&d="&MONTH($A2)-1&"&e="&DAY($A2)&"&f="&YEAR($A2)&"&g=d&ignore=.csv"))-FIND("X";SUBSTITUTE(C2;",";"X";10)));FIND(",";RIGHT(WEBSERVICE("http://ichart.finance.yahoo.com/table.csv?s="&C$1&"&a="&MONTH($A2)-1&"&b="&DAY($A2)&"&c="&YEAR($A2)&"&d="&MONTH($A2)-1&"&e="&DAY($A2)&"&f="&YEAR($A2)&"&g=d&ignore=.csv");LEN(WEBSERVICE("http://ichart.finance.yahoo.com/table.csv?s="&C$1&"&a="&MONTH($A2)-1&"&b="&DAY($A2)&"&c="&YEAR($A2)&"&d="&MONTH($A2)-1&"&e="&DAY($A2)&"&f="&YEAR($A2)&"&g=d&ignore=.csv"))-FIND("X";SUBSTITUTE(WEBSERVICE("http://ichart.finance.yahoo.com/table.csv?s="&C$1&"&a="&MONTH($A2)-1&"&b="&DAY($A2)&"&c="&YEAR($A2)&"&d="&MONTH($A2)-1&"&e="&DAY($A2)&"&f="&YEAR($A2)&"&g=d&ignore=.csv");",";"X";10))))-1);".") 

И это теперь может в равной степени быть втянутой вправо и вниз, чтобы получить данные для более фирм на несколько дней.

Однако, если есть более элегантное решение, я буду очень рад его видеть!

 Смежные вопросы

  • Нет связанных вопросов^_^