代码之家  ›  专栏  ›  技术社区  ›  Andrew Scagnelli

vba文件打开速度慢

  •  1
  • Andrew Scagnelli  · 技术社区  · 16 年前

    我试图使用在Access数据库的模块内创建的Excel实例打开一系列Excel电子表格。我可以让文件正确打开;但是,实际调用使Excel启动需要相当长的时间,并且打开文件需要更长的时间。文件的位置并不重要(与网络驱动器在本地硬盘上打开的时间相同)。

    为了找出花费这么长时间的原因,我在日志模块中添加了一个计时器。打开文件大约需要2分30秒,在此期间,主机应用程序(访问)对用户输入完全没有响应;其余脚本在10秒内执行。

    我用的是标准 Excel.Workbooks.Open 呼叫如下

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

    使用 Debug.Print 这一行的方法表示,执行这一行最多需要2 1/2分钟。

    我能做些什么来让Excel文件更快地打开吗?

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

    2 回复  |  直到 10 年前
        1
  •  3
  •   BradC    16 年前

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

    第二个想法:确保在例程开始时只创建和实例化一次Excel应用程序对象,然后对每个电子表格使用excel.workbooks.open()和excel.activeworkbook.close()。这样,您就不会每次都“重新启动”MS Excel应用程序。

        2
  •  0
  •   David-W-Fenton    16 年前

    为了提取@bradc建议的第二个建议,如果您需要在多个过程中使用excel,请创建一个自初始化全局函数。我总是使用后期绑定来实现办公应用程序的自动化。

      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,它不适合这种处理(如果你试图这样破坏实例,你最终会在一个无休止的循环中关闭并重新初始化自己)。

    推荐文章