我订阅了一个RTD财务应用程序,可以选择通过DDE将实时数据导出到Excel。因此,使用DDE复制/粘贴应用程序选项,我创建了一个包含实时DDE财务数据的Excel表。单元格实际上包含DDE公式。现在我手动打开,刷新和保存表,但我需要的是一个解决方案,它将打开,刷新数据,自动保存和关闭这个excel表。
我现在没有如何附加文件,所以这里是它的截图。 My Excel DDE file
由于我是vba和vbscript的新手,我正在寻找互联网寻求解决方案,但没有任何成功,特别是对于DDE数据的自动更新(刷新)。
过去几天我一直在做的是搜索,尝试和定制不同类型的vba宏和vbscripts,今天我完全迷失了方向。
我尝试过一堆建议的解决方案,甚至是你的解决方案 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但在我的情况下他们不起作用。
非常感谢任何解决方案,参考和代码示例。
答案 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
如果您仍然希望解决此问题,希望对您有所帮助!