1

我正在尝试解决我在使用适用于 Excel 的 Bloomberg 插件时遇到的问题。每天我都会为 500 多只股票填充 31 天的历史价格数据。

$A$K3 = "ACE US EQUITY" $AL$3 = "=BDH(AK3,"PX_LAST",$D$1,$C$1,"DTS=h","dir=h")" $C$1 = " =WORKDAY(TODAY(),0)" $D$1 = "=BAddPeriods(C1,"NumberOfPeriods=-31","Per=wd","CDR=#A")"

应该发生的是,在 $AL$3:$BQ$3 中会有 31 天的价格。

我将工作簿保持打开状态,因为即使 Bloomberg 可执行文件未运行,Bloomberg DDE 会话仍保持打开状态 3 天。

有时没有问题,第二天上班时,数据向前移动了一天。其他时候,大部分数据都丢失了,我不得不选择并刷新每个 $AL$_ 字段。问题在于,由于某种原因,刷新是同步发生的,我认为这会对 DDE 连接和/或 Excel 造成严重破坏。导致更新缓慢/无更新。此外,如果我刷新整个工作表,一些公式将被静态数据覆盖!

我想做的是创建一个宏,它将:

1) 清除 $AL$ :$BQ $ & $BS$ :$CX $中的所有数据

2) 设置$AL$_的值 = "=BDH(AK$_,"PX_LAST",$D$1,$C$1,"DTS=h","dir=h")"

3) 等到数据填充到 $AL$ :$BQ$之后再转到 $AL$(+1):$BQ$(+1); 如果 $AM$_ 有一个值,那么很可能数据已填充到该行中。

4) 然后当 $AL$ :$BQ$完成后,对 $BS$ :$CX$执行相同的操作

一个多月以来,我一直在等待彭博的支持来满足这一要求,但没有任何结果。

我没有足够的经验来做这件事。

我在下面有一小段代码,我使用记录器创建了这些代码:

Sub PopulateData()
'
' PopulateData Macro 
'

'
Range("AL2:BQ2").Select
Selection.ClearContents
Range("AL2").Select
ActiveCell.FormulaR1C1 = _
    "=BDH(RC[-1],""PX_LAST"",R1C4,R1C3,""DTS=h"",""dir=h"")"
Range("AL2").Select
End Sub

虽然我在录制时选择了刷新按钮,但未录制此操作。谢谢你的关注。

4

1 回答 1

0

一种宏解决方案,一次运行一行公式,然后用值覆盖公式,因此在下一次迭代时不会执行同时查询:

Sub CalculateLineByLine
   For Each c In Range("AL2:AL501")
      c.FormulaR1C1 = "=BDH(RC[-1],""PX_LAST"",R1C4,R1C3,""DTS=h"",""dir=h"")"
      Calculate
      Range(c.address, "BQ" & c.row)).Copy
      c.PasteSpecial xlPasteValues
   Next c
End Sub

我没有手动清除内容,因为我认为旧数据只会被特殊粘贴覆盖。我希望这对您来说是一个可能的解决方案。

如果我正确阅读了您的最后一条评论,您希望在公式设置为手动时按 F9 手动计算所有打开的工作簿。

于 2013-03-07T22:07:09.423 回答