我想将数据从一张纸复制并粘贴到另一张纸上 . 原始数据来自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 回答
啊,Bloomberg API ......很多问题 .
因此,当您使用函数调用执行Bloomberg请求时,单元调用站点将收到回调并刷新数据 .
The problem is, w.r.t. automation, the data can come back in parts and you have to wait till it completes before continuing to process your data.
因此,该解决方案有3种方法 .
上次我看,这是彭博推荐的那个 . 有一个例程刷新对单元格公式的调用 . This has a timer and recursively invokes itself 直到检索到数据 . 解决这个问题的方法是知道何时正确检索数据 . 检查数据区域是否有错误,表示尚未完成 .
另一个解决方案是使用Application.Run调用调用,在代码中构建公式并使用VBA调用 . 这允许您不在工作表中处理这样的功能 . 但实际上与1相同 .
您可以设置对Bloomberg API的引用并使用COM来执行请求 . 这是一种更清晰的方法,您可以更轻松地将其集成到您的代码中,从而有效地创建Bloomberg数据调用API .
我建议,如果可能的话,选择3 . 虽然需要更多努力,但代码变得更加清晰 . 当工作簿在结构等方面变得更加复杂时,选项1.和2.调试起来很棘手 .
如果你搜索你的Bloomberg帮助(有史以来最伟大的'F1 F1'帮助服务应该能够指出你正确的方向 . 在我看来,这是迄今为止最令人印象深刻的帮助系统!)Bloomberg确实有一些例子证明了这些方法上面突出显示
所以,随着手头的问题,并最终回答你的问题:)我会重构你的代码,实际上做函数调用,最初做一个Calcuation(它会调用你对Bloomberg的请求) . 然后进入一个递归函数,该函数调用自身直到数据中没有错误 . 然后,您将复制数据 .
希望有所帮助 .