首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Excel DDE RTD的自动刷新

Excel DDE RTD的自动刷新
EN

Stack Overflow用户
提问于 2016-07-20 21:59:36
回答 3查看 1.4K关注 0票数 2

我订阅了一个RTD财务应用程序,可以选择通过DDE将实时数据导出到Excel。因此,使用DDE复制/粘贴应用程序选项,我已经创建了一个包含实时DDE财务数据的Excel表。单元格实际上包含DDE公式。现在我手动打开、刷新和保存表格,但我需要的是一个能够自动打开、刷新数据、保存和关闭该excel表格的解决方案。

我现在不知道如何附加这个文件,所以这里是它的截图。My Excel DDE file

由于我是vba和vbscript的新手,我在互联网上寻找解决方案,但没有成功,尤其是DDE数据的自动更新(刷新)。

在过去的几天里,我一直在做的是搜索、尝试和定制不同种类的vba宏和vbscript,而今天我完全迷茫了。

我已经尝试了一堆建议的解决方案,甚至你的Refresh data and exit with saving Macro ExcelOn workbook open, Excel Macro to refresh all data connections sheets and pivot tables and then export the pivot to csv,但在我的情况下,它们都不起作用。

任何解决方案,参考,代码示例将非常感谢。

EN

回答 3

Stack Overflow用户

发布于 2016-07-21 18:31:29

请尝试下面的方法,使用时要小心

Application.Calculation = xlCalculationManual Application.Calculation = xlCalculationAutomatic

这会将整个excel应用程序设置为自动或手动计算公式。如果使用Application.Calculation = xlCalculationManual

你会注意到你的自动公式不再有效。

票数 0
EN

Stack Overflow用户

发布于 2016-07-22 19:48:10

感谢回复@mulla,但这不起作用。在vbscript中,我得到运行时错误,并且在vba中什么也没有发生(不影响刷新)。Worksheet.Calculate也是如此。

然后,我在手动更新链接(数据)时录制了一个宏,以检查Excel是如何进行更新的,这实际上是有效的,但不是一直有效。如果我手动打开工作簿并保持打开状态,那么整个导出工作都很完美,因为数据是不断刷新的(不是我需要的)。在仅通过vbscript打开工作簿的情况下(我需要),正如您在下面的输出中看到的,一些值被成功导出(我相信是为了更快的刷新),而另一些值是#N/A (对于较慢的刷新)。所有数据每秒刷新一次,但打开文件时除外,其中成功导出的值会立即刷新,#N/A值需要几秒钟(2-3秒)才能刷新。

记录器宏按如下方式使用ActiveWorkbook.UpdateLink (以下代码用于第一行,但对于其余行使用相同的逻辑):

代码语言:javascript
复制
Sub PriceUpdate()
ActiveWorkbook.UpdateLinks = xlUpdateLinksAlways

ActiveWorkbook.UpdateLink Name:= _
    "vegadde|VEGA!897789,148,1@""1,\""12,0,0\"""",1", Type:=xlOLELinks
ActiveWorkbook.UpdateLink Name:= _
    "vegadde|VEGA!897789,148,1@""1,\""12,0,0\"""",3", Type:=xlOLELinks
ActiveWorkbook.UpdateLink Name:= _
    "vegadde|VEGA!897789,148,1@""1,\""12,0,0\"""",4", Type:=xlOLELinks

    ...

End Sub

然后,我使用vbscript调用宏,并将数据导出到CSV逗号分隔的文件中,时间戳名为:

代码语言:javascript
复制
Option Explicit

Dim objExcel, objBook, objSheet

Set objExcel = CreateObject("Excel.Application")
Set objBook = objExcel.Workbooks.Open ("d:\exptest\exptest.xlsm", 0, False)
'Set objSheet = objBook.Worksheets.Item(1)
objExcel.DisplayAlerts = False

objExcel.Run "PriceUpdate"
WScript.Sleep 5000 ' Delay in order to update links 
objBook.SaveAs "d:\exptest\" & Year(Now) & "." & Month(Now) & "." & Day(Now) & "_" & Hour(Now) & "-" & Minute(Now) & ".txt",6

objBook.Close False

objExcel.DisplayAlerts = True

objExcel.Quit

'Set objSheet = Nothing
Set objBook = Nothing
Set objExcel = Nothing

我得到的是下面的uotput:

代码语言:javascript
复制
Inst,Price,Datetime
USD,1.1015,7/22/2016 12:48
GBP,#N/A,#N/A
CHF,#N/A,#N/A
SEK,9.4962,7/22/2016 12:48
NOK,#N/A,#N/A
JPY,#N/A,#N/A
DKK,#N/A,#N/A
CAD,#N/A,#N/A
AUD,1.47395,7/22/2016 12:48
RUB,71.0082,7/22/2016 12:48

我正在努力学习不同更新背后的Excel逻辑,以便解决我的问题并获得理想的解决方案,但没有成功。

这只是一个包含22个链接的测试文件。真实的有482个链接需要更新。

票数 0
EN

Stack Overflow用户

发布于 2020-03-18 05:44:34

马扬。不确定这是否仍然是您的问题,但我在已关闭的Excel工作簿中刷新RTD数据时遇到了类似的问题,似乎已经找到了解决方案。正如您所提到的,当您打开工作簿时,数据会自动刷新(一些更复杂的数据点需要2-3秒)。问题是,您不希望经常手动打开工作簿来刷新数据。我还发现,像调用closed工作簿的RTD.RefreshData这样的方法无法刷新数据。

因此,为了解决这个问题,我创建了一个vba模块,它只需打开工作簿,刷新它,暂停第二次(您可能还需要2-3秒才能更新所有数据),然后保存并关闭工作簿。此方法以递归方式调用。本质上,这样做的工作是不断地打开和关闭工作簿,同时进行短暂的延迟,以便RTD数据可以刷新。到目前为止,这能够成功地提供刷新的RTD数据(尽管存在几秒钟的固有的轻微延迟)。以下是我的代码的基础:

代码语言:javascript
复制
Sub refreshXLS()
    Path = "workbook.xlsm"  'the workbook path you want to refresh

    Workbooks.Open Path
    ActiveWorkbook.RefreshAll
    Application.OnTime Now() + TimeValue("00:00:01"), "closeActive" 
End Sub


Sub closeActive()
    ActiveWorkbook.Save
    ActiveWorkbook.Close
    refreshXLS
End Sub

如果你仍然希望解决这个问题,希望这对你有所帮助!

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38483398

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档