自动刷新Excel DDE RTD

时间:2016-07-20 13:59:36

标签: excel vba excel-vba vbscript macros

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

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

由于我是vba和vbscript的新手,我正在寻找互联网寻求解决方案,但没有任何成功,特别是对于DDE数据的自动更新(刷新)。

过去几天我一直在做的是搜索,尝试和定制不同类型的vba宏和vbscripts,今天我完全迷失了方向。

我尝试过一堆建议的解决方案,甚至是你的解决方案 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但在我的情况下他们不起作用。

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

3 个答案:

答案 0 :(得分:0)

请尝试下面的一个和 使用时要小心

//script.js new Vue({ el:"#app", data:function(){ return { startDate: moment().subtract(7, 'days').format('MM/DD/YYYY'), cancelDate: moment().format('MM/DD/YYYY') } }, ready:function(){ $('.datepicker').datepicker({ startDate: this.startDate }); } }) // index.html <div id="app"> <input class="datepicker" type="text" v-model="{{cancelDate}}" value="{{cancelDate}}" > </div>

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

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

答案 1 :(得分:0)

感谢@mulla的回复,但这不起作用。在vbscript中我得到运行时错误,在vba中没有任何反应(不影响刷新)。对于Worksheet.Calculate也是如此。

我在手动更新链接(数据)时记录了一个宏,以便检查Excel如何继续更新,这实际上有效,但不是所有时间。如果我手动打开工作簿并保持打开状态,那么整个导出工作完全正常,因为数据会不断刷新(不是我需要的)。如果只通过vbscript打开工作簿(我需要的话),正如你在下面的输出中看到的那样,一些值被成功导出(为了更快的刷新我相信),有些是#N / A(对于慢速)茶点)。所有数据每秒刷新一次,除非打开成功导出值立即刷新的文件,并且#N / A值需要几秒(2-3s)才能刷新。

Recorder宏使用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个需要更新的链接。

答案 2 :(得分:0)

Marjan。不知道这是否仍然是您的问题,但是在封闭的Excel工作簿中刷新RTD数据时遇到了类似的问题,并且似乎找到了解决方案。如前所述,当您打开工作簿时,数据会自动刷新(某些更复杂的数据点需要2-3秒)。问题是,您不需要经常手动打开工作簿来刷新数据。而且我发现数据无法通过{strong> 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

如果您仍然希望解决此问题,希望对您有所帮助!