我订阅了一个RTD财务应用程序,可以选择通过DDE将实时数据导出到Excel。因此,使用DDE复制/粘贴应用程序选项,我已经创建了一个包含实时DDE财务数据的Excel表。单元格实际上包含DDE公式。现在我手动打开、刷新和保存表格,但我需要的是一个能够自动打开、刷新数据、保存和关闭该excel表格的解决方案。
我现在不知道如何附加这个文件,所以这里是它的截图。My Excel DDE file
由于我是vba和vbscript的新手,我在互联网上寻找解决方案,但没有成功,尤其是DDE数据的自动更新(刷新)。
在过去的几天里,我一直在做的是搜索、尝试和定制不同种类的vba宏和vbscript,而今天我完全迷茫了。
我已经尝试了一堆建议的解决方案,甚至你的Refresh data and exit with saving Macro Excel和On workbook open, Excel Macro to refresh all data connections sheets and pivot tables and then export the pivot to csv,但在我的情况下,它们都不起作用。
任何解决方案,参考,代码示例将非常感谢。
发布于 2016-07-21 18:31:29
请尝试下面的方法,使用时要小心
Application.Calculation = xlCalculationManual Application.Calculation = xlCalculationAutomatic
这会将整个excel应用程序设置为自动或手动计算公式。如果使用Application.Calculation = xlCalculationManual
你会注意到你的自动公式不再有效。
发布于 2016-07-22 19:48:10
感谢回复@mulla,但这不起作用。在vbscript中,我得到运行时错误,并且在vba中什么也没有发生(不影响刷新)。Worksheet.Calculate也是如此。
然后,我在手动更新链接(数据)时录制了一个宏,以检查Excel是如何进行更新的,这实际上是有效的,但不是一直有效。如果我手动打开工作簿并保持打开状态,那么整个导出工作都很完美,因为数据是不断刷新的(不是我需要的)。在仅通过vbscript打开工作簿的情况下(我需要),正如您在下面的输出中看到的,一些值被成功导出(我相信是为了更快的刷新),而另一些值是#N/A (对于较慢的刷新)。所有数据每秒刷新一次,但打开文件时除外,其中成功导出的值会立即刷新,#N/A值需要几秒钟(2-3秒)才能刷新。
记录器宏按如下方式使用ActiveWorkbook.UpdateLink (以下代码用于第一行,但对于其余行使用相同的逻辑):
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逗号分隔的文件中,时间戳名为:
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:
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个链接需要更新。
发布于 2020-03-18 05:44:34
马扬。不确定这是否仍然是您的问题,但我在已关闭的Excel工作簿中刷新RTD数据时遇到了类似的问题,似乎已经找到了解决方案。正如您所提到的,当您打开工作簿时,数据会自动刷新(一些更复杂的数据点需要2-3秒)。问题是,您不希望经常手动打开工作簿来刷新数据。我还发现,像调用closed工作簿的RTD.RefreshData这样的方法无法刷新数据。
因此,为了解决这个问题,我创建了一个vba模块,它只需打开工作簿,刷新它,暂停第二次(您可能还需要2-3秒才能更新所有数据),然后保存并关闭工作簿。此方法以递归方式调用。本质上,这样做的工作是不断地打开和关闭工作簿,同时进行短暂的延迟,以便RTD数据可以刷新。到目前为止,这能够成功地提供刷新的RTD数据(尽管存在几秒钟的固有的轻微延迟)。以下是我的代码的基础:
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如果你仍然希望解决这个问题,希望这对你有所帮助!
https://stackoverflow.com/questions/38483398
复制相似问题