Excel 2013 запись/обновление данных о живом запасе

Я работаю в Excel 2013, пытаясь записать данные о текущих акциях из Yahoo Finance. В моей ячейке A1 у меня есть биржевой символ GoPro GPRO.

Ячейка B1 имеет код

=WEBSERVICE("http://finance.yahoo.com/d/quotes.csv?s="&A1&"&f=l1")

Чтобы получить цену акций в реальном времени и в ячейке C1

=NUMBERVALUE(WEBSERVICE("http://finance.yahoo.com/d/quotes.csv?s="&A1&"&f=l1"))

Чтобы изменить строковое значение, полученное из Интернета, на число. У меня есть макрос в VBA, который

Sub Capture()
    If I = 0 Then I = 1
    Sheets("recorddata").Cells(1, I) = Sheets("getdata").Range("C1")
    I = I + 1
    Application.OnTime Now + TimeValue("00:00:15"), "Capture"
End Sub

Чтобы попытаться записывать живую цену акций каждые 15 секунд. По какой-то причине программа запустится один раз и скопирует цену акции в следующую электронную таблицу, но не будет обновлять биржевые данные или перезапускать приложение каждые 15 секунд. Может кто-нибудь, пожалуйста, помогите мне найти решение для обновления биржевых данных каждые x раз и автоматического запуска/остановки программы?


person Chris    schedule 30.09.2014    source источник


Ответы (1)


Две вещи:

  1. Объявите i как общедоступную (глобальную) переменную, чтобы она сохраняла свои значения между итерациями.

  2. Выполните Application.Calculate перед копированием данных, чтобы гарантировать, что функция =WebService() вызовет Yahoo перед получением значения.

Код:

Public i As Integer

Sub Capture()
    If i = 0 Then i = 1
    Application.Calculate
    Sheets("recorddata").Cells(1, i) = Sheets("getdata").Range("C1")
    i = i + 1
    Application.OnTime Now + TimeValue("00:00:15"), "Capture"
End Sub
person JNevill    schedule 30.09.2014
comment
Спасибо, что ответили на мой вопрос. Когда я запускаю программу, она запускается только один раз без повторения. - person Chris; 01.10.2014
comment
Все выглядит хорошо для меня, как есть. Я протестировал тот же код, но заменил строку Sheets(recorddata).cells(1, i) чем-то другим, сделал интервал в 1 секунду и добился успеха. В целях отладки вы можете попробовать создать вторую подпрограмму с именем Capture2. Пусть Capture() вызывает Capture2 в строке .OnTime, а Capture2 вызывает Capture в строке OnTime(). Вы можете заставить захват 2 сделать что-то вроде msgbox("Capture2") или что-то еще, чтобы подтвердить, что он запущен. - person JNevill; 01.10.2014