我正在尝试使用在Access数据库中的模块内创建的Excel实例打开一系列Excel电子表格。我可以正确打开文件;然而,实际调用Excel启动需要相当长的时间,打开文件需要更长的时间。文件的位置无关紧要(同时在本地HDD上作为网络驱动器打开)。
为了弄清楚花了多长时间,我在记录模块中添加了一个计时器。打开文件大约需要2分30秒,在此期间主机应用程序(Access)完全没有响应用户输入);脚本的其余部分在不到10秒的时间内执行。
我正在使用标准Excel.Workbooks.Open
调用,如下所示
Set OpenSpreadsheet = Excel.Workbooks.Open(Name, 2, False)
在此行周围使用Debug.Print
方法表示执行此一行最多可能需要2 1/2分钟。
我能做些什么来让Excel文件更快地打开?
编辑:开通时,UpdateLinks
为False
,ReadOnly
为True
;所有其他选项都保留为默认值。
答案 0 :(得分:3)
第一个想法:您是否可以使用带有ODBC连接到Excel的喷墨驱动程序,而不是在Excel对象中打开它?可能要快得多。
第二个想法:确保在例程开始时只创建一次Excel应用程序对象并将其实例化,然后对每个电子表格使用Excel.Workbooks.Open()和Excel.ActiveWorkbook.Close()。这样,您每次都不会“重新启动”MS Excel应用程序。
答案 1 :(得分:0)
要绘制@BradC建议的第二个建议,如果需要在多个过程中使用Excel,请创建一个自我初始化的全局函数。我总是使用后期绑定来自动化Office应用程序。
Public Function Excel(Optional bolCleanup As Boolean = False) As Object
Static objExcel As Object
If bolCleanup Then
If Not objExcel Is Nothing Then
Set objExcel = Nothing
Exit Function
End If
End If
If objExcel Is Nothing Then
Set objExcel = CreateObject("Excel.Application")
End If
Set Excel = objExcel
End Function
然后您可以在代码中使用它而无需初始化它,并且单个实例将仍然可用于需要使用Excel的任何代码。
当您关闭应用程序时,您将调用Excel(True)进行清理。
我一直使用Outlook和Word执行此操作。但是,有些COM应用程序运行效果不佳,例如PDF Creator,它并不需要这种处理(如果你试图将它关闭并重新初始化,你最终会无休止地循环以这种方式破坏实例。)
答案 2 :(得分:0)
另一种方法取决于您的设置和过程。
就我而言,我需要对存储在SharePoint上的一组Excel文档进行只读访问。我的代码当前如下:
For each path in paths
set wb = Workbooks.open(path,false)
next
在这种情况下,每次打开工作簿时,都会单独下载每个工作簿。如果文件是异步下载的,下载完成后,其余过程将在本地磁盘上执行,则效率会大大提高。
我的想法是使用CopyFileEx()并传递一个回调函数。然后,Excel将异步将Excel文档下载到磁盘,并调用有关进度的VBA函数。完成所有文件后,我们可以启动该过程的下一部分,这将打开本地工作簿,对其进行扫描,然后将其从本地驱动器中删除。
如果能够实现,我将在稍后发布代码。