【问题标题】:VBA File Open is slowVBA 文件打开速度很慢
【发布时间】:2010-11-19 07:26:27
【问题描述】:

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

为了弄清楚是什么花了这么长时间,我在日志记录模块中添加了一个计时器。打开文件大约需要 2 分 30 秒,在此期间主机应用程序(Access)对用户输入完全没有响应);脚本的其余部分在 10 秒内执行完毕。

我正在使用标准的Excel.Workbooks.Open 调用如下

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

在这一行周围使用Debug.Print 方法表示执行这一行最多可能需要 2 1/2 分钟。

我可以做些什么来加快 Excel 文件的打开速度?

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

【问题讨论】:

  • 如果你添加一些代码来显示你如何打开你的文档,+你设置了什么引用,回复会更容易。但可以肯定的是,任何超过 10 秒的时间。太长了。
  • 同意,+1 ... 需要查看方法。
  • 我添加了我正在拨打的电话,并记录了单行运行所需的时间。

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


【解决方案1】:

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

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

【讨论】:

  • 这行得通——我在运行模块的同时密切关注任务管理器,并创建了三个 Excel 实例,尽管我只在代码中创建了一个。
【解决方案2】:

要得出@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,它不接受这种处理(如果你尝试这样做,你最终会陷入无限循环,它会关闭并重新初始化。以这种方式销毁实例)。

【讨论】:

    【解决方案3】:

    另一种方法取决于您的设置和流程。

    就我而言,我需要对存储在 SharePoint 上的一组 Excel 文档的只读访问权限。我的代码目前是这样的:

    For each path in paths
       set wb = Workbooks.open(path,false)
    next
    

    在这种情况下,每次打开工作簿时都会单独下载每个工作簿。如果文件是异步下载的,并且下载完成后,其余过程在本地磁盘上执行,效率会大大提高。

    我的想法是使用CopyFileEx() 并传递一个回调函数。 Excel 然后将异步下载 Excel 文档到磁盘并调用有关进度的 VBA 函数。当所有文件都完成后,我们可以启动该过程的下一部分,打开本地工作簿,扫描它们,然后将它们从本地驱动器中删除。

    如果我设法实现它,我稍后会发布代码。

    【讨论】:

      猜你喜欢
      • 2016-08-11
      • 1970-01-01
      • 2016-06-22
      • 1970-01-01
      • 2015-09-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多