2009-08-13 153 views
1

我想打开一系列Excel电子表格,使用在Access数据库模块内创建的Excel实例。我可以让文件正常打开;但是,启动Excel的实际调用需要很长时间,打开文件需要更长的时间。文件的位置无关紧要(同一时间在本地HDD上作为网络驱动器打开)。VBA文件打开很慢

为了弄清楚花了多长时间,我给记录模块添加了一个定时器。打开文件大约需要2分30秒,在此期间主机应用程序(Access)完全不响应用户输入);脚本的其余部分在不到10秒的时间内执行。

我使用标准Excel.Workbooks.Open电话如下

Set OpenSpreadsheet = Excel.Workbooks.Open(Name, 2, False) 

周围使用此行Debug.Print方法说,它可能需要长达2分半钟的这一行来执行。

有什么我可以做的,使Excel文件打开更快?

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

+1

如果您添加一些代码以显示您如何打开文档,请输入您设置的参考号,这将更容易回复。但是可以肯定的是,任何超过10秒的东西。是漫长的。 – 2009-08-13 15:41:26

+0

同意,+ 1 ...需要查看方法。 – Smandoli 2009-08-13 16:11:48

+0

我添加了我正在做的呼叫,并注意到单线需要运行的时间。 – 2009-08-13 17:17:22

回答

3

第一个想法:你可以使用与Excel连接的ODBC连接的Jet驱动程序,而不是在Excel对象中打开它?可能会快得多。

第二个想法:确保在例程开始时创建并实例化Excel应用程序对象,然后对每个电子表格使用Excel.Workbooks.Open()和Excel.ActiveWorkbook.Close()。这样你就不会每次都“重新启动”MS Excel应用程序。

+0

这工作 - 我跑了模块,同时留意任务管理器和三个Excel实例创建,即使我只在代码中创建一个。 – 2009-08-13 19:07:21

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(真)来清理。

我一直在用Outlook和Word来做这件事。但是,有一些COM应用程序与它不兼容,比如PDF Creator,它不会很好地处理这种类型的处理(如果您试图以某种方式关闭并重新初始化,最终会导致无限循环这种方式破坏实例)。