在Excel中暂停RTD服务器并保存工作表

在Excel中暂停RTD服务器并保存工作表,excel,vba,rtd,Excel,Vba,Rtd,我的工作表通过以下公式从RTD服务器获取数据: =RTD("tos.rtd", , "ASK", ".SPX150220C750") 我想每隔1分钟左右用上述公式保存工作表。挑战在于暂停VBA代码,并确保在保存之前更新单元格中的值。我尝试了以下代码 Sub Archiving() For i = 0 To 4 Worksheets("Test").Activate Application.Sheets("Test").Copy Application.DisplayA

我的工作表通过以下公式从RTD服务器获取数据:

=RTD("tos.rtd", , "ASK", ".SPX150220C750")
我想每隔1分钟左右用上述公式保存工作表。挑战在于暂停VBA代码,并确保在保存之前更新单元格中的值。我尝试了以下代码

Sub Archiving()
For i = 0 To 4

    Worksheets("Test").Activate
    Application.Sheets("Test").Copy
    Application.DisplayAlerts = False
    ActiveWorkbook.SaveAs Filename:="D:\Save " & i & ".csv", FileFormat:=xlCSV
    ActiveWorkbook.Save
    ActiveWindow.Close
    Windows("Real time data.xlsm").Activate
    Application.DisplayAlerts = True

    Application.Wait (Now + TimeValue("0:00:05"))

    ActiveWorkbook.RefreshAll
    DoEvents
Next i

End Sub
代码不起作用,只是因为DoEvents会等待RTD完成更新,而这永远不会发生。我还看到了显式暂停到DB的连接的示例,但我不知道如何适应RTD服务器情况。我试图从C#运行RTD服务器,但失败惨重。 有什么建议吗?

挑战在于暂停VBA代码,并确保在保存之前更新单元格中的值

以前的实现存在的问题是,由于VBA不支持多线程,因此在循环中执行时,应用程序处于“繁忙”状态,无法从RTD服务器接收新数据

这主要基于我从微软收集的信息,emphasis补充道:

RTD功能从RTD服务器检索数据,以便在 工作簿。每当出现新数据时,函数结果将更新 可从服务器获得,并且工作簿可以接受它。服务器 在更新前等待Excel空闲。这减轻了开发人员的负担 必须确定Excel是否可用于接受更新。 RTD功能在这方面与其他功能不同,因为 其他函数仅在重新计算工作表时更新

并进一步建议切换应用程序的
.CalculationState
等不会对RTD服务器产生影响:

因为RTD会在Excel空闲时更新数据,它会继续接收数据 Excel处于手动计算模式时的信息。在这种情况下 手动更新时,缓存新数据并使用当前值 进行计算

因此,当数据从服务器可用时,数据将被更新(可能不是问题),但实现中的问题是工作簿无法接受它,因为它正在运行VBA线程,并且RTD公式不是“正常”的外部链接

虽然RTD功能提供到服务器上数据的链接,但它是 链接类型与其他工作表中对单元格的引用不同 或工作手册。例如,如果在工作簿中使用RTD函数, 打开链接时,您不会收到链接启动消息 工作簿,也不能通过 “编辑链接”对话框

我怀疑另一个不同点是
RefreshAll
方法对该函数没有影响,您不能强制它获取外部数据,因为它已经这样做了,而工作簿可以接受它

潜在解决方案

通过使用
Application.OnTime
事件来安排保存间隔,我认为您应该能够避免工作簿无法接收数据的问题

如果要定期保存数据,此函数将根据以下限制递归调用自身:


注意:我无法复制,因为我没有从RTD函数调用的COM对象/etc。因此,请恕我直言,我能为您提供的进一步帮助非常有限。

我也有类似的问题。我在VBA中添加了以下命令以触发RTD数据刷新。在使用VBA宏中的数据之前,我执行了此命令。希望这有帮助


Excel.Application.RTD.RefreshData

我不熟悉RTD,但您是否尝试过使用WinAPI
Sleep
函数?这将使Excel应用程序在指定的时间间隔内处于“睡眠”状态。每1分钟节省一次似乎是不必要的,不是吗?应用程序是否太不稳定以致于较长的间隔不合适?谢谢,David。我想我已经试过“睡眠”。问题是Excel无法完全更新工作表,Excel会一直保存旧数据。我可以将保存间隔增加到5分钟,但我的目标是收集实时数据,因此我希望保存间隔在技术上尽可能小的范围内。我仍然很好奇,为什么您觉得需要如此频繁地保存文档。。。是否在每个保存点制作文件的新副本?如果是这样,那就太多余了,不是吗?如果不是,每个“保存”操作都会覆盖上一次保存,那么为什么不使用一个不太密集的间隔,或者为什么还要麻烦自动保存呢?假设您的应用程序是稳定的,并且不会随机“崩溃”,那么就不会有真正的数据丢失风险……上面的代码在每次迭代中将数据保存到不同的文件中。它甚至可以保存到.csv文件中,以简化存储。没有任何内容被覆盖。每个保存的文件都包含特定时刻(保存时)的市场价格数据。应用程序稳定性没有问题。我只是想收集历史价格数据。你应该为此使用一个数据库。
Private Sub CreateArchive()
    'Saves a copy of sheet "Test" and sets OnTime to save again in 60 seconds
    Dim saveTime as String

    saveTime = Format(Now(), "YYYY-MM-DD-hh-nn")

    Worksheets("Test").Copy
    Application.DisplayAlerts = False
    ActiveWorkbook.SaveAs Filename:="D:\Save " & saveTime & ".csv", FileFormat:=xlCSV
    ActiveWorkbook.Close
    Windows("Real time data.xlsm").Activate
    Application.DisplayAlerts = True

    'Call on this function again in 60 seconds:
    Application.OnTime Now + TimeValue("00:00:60"), CreateArchive

End Sub