2016-07-07 2 views
0

enter image description here В настоящее время у меня есть код, написанный с использованием данных bloomberg. Я пытаюсь извлечь данные из Bloomberg в excel с помощью VBA. Это работает нормально, но проблема в том, что у меня есть еще один макрос, который затем копирует данные из bloomberg и вставляет его в другой лист.Bloomberg Данные, требующие времени для загрузки в Excel-VBA

Если данные не были получены из bloomberg, тогда я получаю недостаточно данных для копирования, а затем вставляю их в другой лист.

В настоящее время я использую эту строку кода: Application.OnTime теперь + TIMEVALUE («00:01:45»), «RunAll»

, которая ждет после запуска первого макроса в течение 1 мин 45s до него запускает оставшиеся макросы. Это полезно, но путь к много времени. Проблема заключается в том, что это примерно столько, сколько данных требуется для вывода.

Есть ли какой-либо другой более эффективный способ ускорить работу с данными bloomberg, гарантируя, что данные будут выводиться в excel быстрее?

Спасибо!

+0

действительно ли загрузочные ячейки содержат определенную строку? Возможно, вы можете запустить цикл или перехватить событие Worksheet.Change, чтобы проверить эту строку. – silentsurfer

+0

Просьба привести пример кода. Я не знаю, что такое данные bloomberg, поэтому, пожалуйста, сделайте вопрос более общим. Вы автоматизируете IE для получения данных? Вы подключаетесь к базе данных? –

+0

Как вы извлекаете данные? Если вы сделаете это программно, вам не придется ждать так ... – assylias

ответ

0

Один из способов обращения с ним - это когда вы запустите свой второй макрос, который копирует данные, проверьте, не видно ли ячейка средней точки (что-то вроде A100? Увидеть ваш код поможет здесь ...). Если да, подождите 10 секунд и снова проверьте. Это заставит второй макрос оставаться в шаблоне удержания, в то время как первый набирает обороты.

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

UPDATE 1:

Я написал следующий код, чтобы сделать то, что вы пытаетесь сделать. Есть несколько вещей, которые вам понадобятся для работы в вашем текущем коде, но я намеренно сделал это очень тяжелым, чтобы вы могли следовать. Дайте мне знать, если это сработает для вас.

Public boolBloombergCompleted As Boolean 

Sub GetBloombergData() 

    'add this line after the data grab is complete 
    boolBloombergCompleted = True 
End Sub 


Sub WriteData() 
    Dim iRow As Integer 
    Dim boolTimeOut As Boolean 

    'change the last number as fit, make sure it's larger than the number of rows of data you're pulling in though 
    For iRow = 1 To 1000 

     ' Check to see if the cell is blank 
     If Sheet1.Cells(iRow, 1) = vbNullString Then 
      ' If the cell is blank and GetBloombergData has completed then exit sub 
      If boolBloombergCompleted = True Then 
       Exit Sub: Debug.Print "WriteData completed" 
      Else 
       ' Call the wait function below 
       boolTimeOut = WaitForDataGrabToCatchUp(Sheet1.Cells(iRow, 1)) 
       If boolTimeOut = True Then GoTo TimeOutErr: 
      End If 
     End If 

     ' < Add your code to write data in here > 

    Next iRow 

    Exit Sub 

TimeOutErr: 
    MsgBox "The write sub timed out while waiting for data to load", vbExclamation 

End Sub 

Function WaitForDataGrabToCatchUp(rng As Range) As Boolean 
    Dim StartTime1 As Long 
    Dim StartTime2 As Long 
    Dim PauseTime As Long 
    Dim StopTime As Long 

    ' Set the amount of time to pause between checking the spreadsheet for updates 
    PauseTime = 5 'seconds 

    ' Set the maximum amount of time to wait before timing out 
    StopTime = 60 'seconds 

    ' StartTime1 is used for calculating overall time 
    StartTime1 = Timer 

    Do While rng = vbNullString 
     ' check if the StopTime has been reached 
     If Timer - StartTime1 > StopTime Then 
      WaitForDataGrabToCatchUp = True 
      Exit Function 
     Else 
      ' loop for amount of PausedTime (the DoEvents part here is key to keep the data grab moving) 
      StartTime2 = Timer 
      Do While Timer < StartTime2 + PauseTime 
       Debug.Print Timer - StartTime1 
       DoEvents 
      Loop 
     End If 
    Loop 

    WaitForDataGrabToCatchUp = False ' means it did not time out 

End Function 
+0

Я приложил фотографию вышеприведенного кода. Во-первых, я загружаю данные bloomberg в excel. После этого, когда люди снова открывают файл, он может очистить содержимое листов и обновить лист, чтобы извлечь данные, если он изменился. После обновления я поставил таймер, который ждет 1 мин 45 с, пока он не запустит оставшиеся макросы. Именно здесь я хотел бы попробовать тон и найти способ убедиться, что данные обновляются и выходят полностью быстрее, но я не знаю, как это сделать. Благодаря! – markos

+0

Спасибо, Филипп, еще не пробовал, потому что код трудно понять (я очень новичок в VBA). Почему он должен выйти из подкаталога, если ячейки пусты?Моя проблема в том, что когда я обновляю свой рабочий лист, ячейки, в которых формулы BBRG скажут N/A, запрашивают данные, а иногда могут загружать ячейки с формулами, но отстают в том, что они выводят оставшуюся информацию в оставшиеся строки под ячейками, где находятся формулы. – markos

+0

Есть только два способа выхода из суб (1), что ячейка, на которой она установлена, пуста, и все данные втянуты, что означает, что данных больше нет или (2) вы достигли максимального количества времени ваше желание ждать. Я проверяю, является ли ячейка пустой, поскольку выше вы упомянули «они могут очистить содержимое листов и обновить лист для извлечения данных». Если они очистят лист, я бы предположил, что это означает, что он пуст? Опять же, если вы можете просто разместить свой код, я мог бы предоставить вам более полное решение. – pheeper