【问题标题】:Processing large amounts of data in macro-enabled workbooks [Excel/Other]在启用宏的工作簿中处理大量数据 [Excel/其他]
【发布时间】:2016-05-11 10:23:04
【问题描述】:

我有 15 个左右的工作簿,其中包含大量数据(2000 行,我想使用的工作表中的 ~120000 个活动单元格),我正在尝试创建一个基本上可以输入条件的搜索引擎,然后excel 或其他东西返回满足该条件的任何行。

我有这样的工作

伪代码

Map drive (files are stored on sharepoint)
Loop workbookdata1 to workbookdata15
    Copy data from sheet to new sheet in workbookMAIN
    Loop through columns, keeping only relevant columns, deleting the rest
    Loop through rows, deleting row if first cell = blank or "xxx" 
Next workbookdata
Compile all of the data from the newly generated sheet
Make it look nice and readable

这可行,但运行需要 45 分钟 - 小时,因为它打开的每张工作表都会更新链接(所有 2000 行),然后必须过滤掉所有不需要的数据。

我有哪些加快速度的选择?我可以使用 Access 或 MATLAB 更快地处理数据,或者编写一些可以处理的代码吗?

【问题讨论】:

  • 我不知道 Access 或 MATBLAB 是否更快,我认为 Access 应该是。无论如何,这也应该用 Excel 来实现。但是有很多东西要看。首先以默认方式打开工作簿很慢。 ADO 或 ExecuteExcel4Macro (stackoverflow.com/questions/25287549/…) 会更快。复制数据也可以非常慢或非常快地完成。但是您必须发布正确的代码才能获得更多帮助。
  • 如果您的工作代码只需要改进,那么您可能在这篇文章的错误位置。 Code Review 是他们处理现有/工作代码的地方,并在速度、安全性、可持续性和寿命方面尽最大努力改进它。试试看。他们很好!
  • 如果您在处理数据时经常引用工作表,这将非常慢。通过使用 VBA 数组、集合和可能的用户定义的对象在将数据写入工作表之前收集数据,您可以预期显着(十倍?)速度提高。根据您的数据量,您可能必须分阶段执行此操作,但这仍然可以显着提高速度。
  • 我以前从未听说过使用 ADO 或 ExcuteExcel4Macro,我会研究一下。有机会我会发布代码,我将不得不更改其中的一些名称。
  • 当我提到代码时,它只是 VBA,Code Review 看起来很方便,但它是用于实际编程而不是像 VBA 这样的脚本吗?

标签: performance vba excel


【解决方案1】:

一些想法。

1) 如果主要的罪魁祸首是链接的更新,那么在用 with 打开时停止更新

Workbooks.Open fullFileName, UpdateLinks:=False

2) 我怀疑复制所有内容然后删除不需要的内容非常耗时 - 这真的有必要吗? 您能否尝试循环浏览数据并确定相关内容并复制它? 我想这可能取决于您如何进行搜索,但是如果您无论如何都要遍历并测试每一行(不确定是否需要这样做),那么您可以确定符合条件的第一行并继续直到您点击不符合条件的行。然后从第一行开始复制并粘贴行(或其部分),并以符合您条件的最后一行结束。完成此操作后,继续循环浏览您的数据。 您甚至可以收集工作表中的所有范围(例如,使用 Union 语句),最后在到达工作表末尾时将它们全部复制到一个语句中。

不确定这是否是您要查找的内容。了解更多关于您的数据和您拥有的标准类型可能会有所帮助。

编辑 1:是的,它将覆盖链接的更新。您是否还尝试将计算模式设置为手动并确保屏幕更新设置为 false?这些可能会大大减慢您的速度。

【讨论】:

  • 我大多数时候,最慢的事情是访问 Excel 工作表而不是复制值(取决于它是如何复制的......)。我建议将完整的值复制到一个数组中,然后循环遍历它。 -> stackoverflow.com/questions/8178161/…
  • 1) ~ 是否会覆盖任何启用更新链接的 OnWorkbookOpen 宏? 2)我想这可以减少运行的步骤,我确实有这样的,而且它也很慢,主要是因为它打开的工作簿会在进行任何更改时不断更新,即使在只读模式下也是如此。我会试一试,然后用有助于改进的方法回到这个线程。条件都是字符串,所以我有一个列表中我想要的列标题列表,只需匹配和删除
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-06-27
  • 1970-01-01
相关资源
最近更新 更多