VBA文件打开很慢

时间:2009-08-13 13:35:54

标签: ms-access vba excel-vba ms-access-2007 excel-2007

我正在尝试使用在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文件更快地打开?

编辑:开通时,UpdateLinksFalseReadOnlyTrue;所有其他选项都保留为默认值。

3 个答案:

答案 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函数。完成所有文件后,我们可以启动该过程的下一部分,这将打开本地工作簿,对其进行扫描,然后将其从本地驱动器中删除。

如果能够实现,我将在稍后发布代码。