2016-02-02 4 views
0

Я хочу скопировать и вставить данные с одного листа на другой лист. Исходные данные из функции API Bloomberg. Я обнаружил, что ячейка данных Bloomberg обновляется только после завершения макроса. Я попытался создать частную функцию, чтобы обновить статические данные, прежде чем копировать их. Вот мой код:Обновление статистических данных API Bloomberg

Private Sub ProcesData() 

Application.Run 

Call Application.OnTime(Now + TimeValue("00:00:01"), "ProcessData") 

End Sub 


Sub Macro3() 

Dim i As Integer 
i = 1 

Do Until i > 2 
    Sheets("Sheet1").Activate 

    Cells(1, 3).Value = Cells(i, 1) 

    i = i + 1 

    Call Application.OnTime(Now + TimeValue("00:00:01"), "ProcessData") 

    Range("C4:E181").Select 

    Selection.Copy 

    Sheets("Sheet2").Select 
    Range("A1").Select 
    lMaxRows = Cells(Rows.Count, "A").End(xlUp).Row 
    Range("A" & lMaxRows + 1).Select 
    Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _ 
     :=False, Transpose:=False 

Loop 

End Sub 

ответ

1

Ah, Bloomberg API ... многие проблемы.

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

Проблема в том, w.r.t. автоматизация, данные могут возвращаться по частям, и вы должны дождаться завершения, прежде чем продолжить обработку ваших данных.

Итак, есть 3 подхода к этому решению.

  1. Последний раз, когда я посмотрел, это тот, который рекомендует Bloomberg. У вас есть процедура, которая обновляет вызов формулы ячейки. У этого есть таймер и рекурсивно вызывает себя, пока данные не будут получены. Хитрость заключается в том, чтобы знать, когда данные были получены правильно. Область данных проверяется на наличие ошибок, которые говорят, что они еще не завершены.
  2. Другим решением является вызов вызова с использованием Application.Run, где вы создаете формулу в коде и вызывается с VBA. Это позволяет не заниматься функциями как таковыми на рабочем листе. Но фактически то же самое, что и 1.
  3. Вы можете установить ссылку на API Bloomberg и использовать COM для выполнения запроса. Это намного более чистый подход, и вы можете легко интегрировать его в свой код, эффективно создавая API вызовов данных Bloomberg.

Я бы предположил, если возможно, для варианта 3. Хотя немного больше усилий, текст кода становится намного чище. Варианты 1. и 2. могут быть сложными для отладки, когда ваши книги становятся более сложными с точки зрения структуры и т. Д.

Если вы ищете свою помощь в Bloomberg (когда-либо огромная старая справочная служба F1 F1 должна быть в состоянии указать вам в правильном направлении. Просто самая впечатляющая система помощи, когда-либо сделанная на мой взгляд!) У Bloomberg есть несколько примеров, демонстрирующих вышеописанные методы.

Итак, с проблемой и, наконец, ответить на ваш вопрос :) Я бы реструктурировал свой код, чтобы на самом деле выполнить вызов функции, изначально выполняющий Calcuation (который будет вызывать ваши запросы в Bloomberg). Затем введите рекурсивную функцию, которая вызывает себя до тех пор, пока в данных не будет ошибок. После этого вы копируете свои данные.

Надеюсь, что это поможет.

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