Excel VBA脚本优化——遍历算法——解决这个难题?

Posted

技术标签:

【中文标题】Excel VBA脚本优化——遍历算法——解决这个难题?【英文标题】:Excel VBA script optimization - traversal algorithm - solve this puzzle? 【发布时间】:2015-01-27 22:57:57 【问题描述】:

我有一个有点大的 Excel 工作簿,里面有几张纸。工作簿记录员工费用。

我有一个 vba 宏,可以将数据从主工作表加载到所有其他工作表,并且需要很长时间才能运行。我希望获得一些关于如何提高性能的提示。

一些快速的背景信息: 每个员工都有一张单独的表格。此表包含该员工一年中每个月的所有费用 - 1 月至 12 月(列)。可以有多种类型的费用(行)。

主数据表包含该年度所有员工的所有费用。每条记录都包含员工ID(用作员工的工作表名称)、费用类型、费用金额和日期。主表按员工 ID、日期和费用类型排序。同一日期可以有重复的费用类型。

虽然主数据表上可以有重复的费用类型,但员工表上没有重复项。每个月对每种类型的费用进行汇总。

示例 - 主表:

> EmpID1 ExpenseType1 01/02/2015 $5
> EmpID1 ExpenseType2 01/02/2015 $3
> EmpID1 ExpenseType2 01/03/2015 $6
> EmpID1 ExpenseType2 01/03/2015 $10
> EmpID1 ExpenseType2 01/04/2015 $11
> ...

示例 - 员工表:

> Months up top: Jan Feb Mar Apr May ...   
> ExpenseType1 $5 $2 $10 $3 $2
> ExpenseType2 $30 $5 $1 $32 $12 
> ExpenseType3 $11 $22 $3 $1 $2
> ...

问题: 填充员工表的最佳方法是什么?

我当前的算法通过读取每条记录来遍历主数据表一次。但它随后会多次遍历员工表。它在员工的工作表上查找该费用类型并将金额添加到上一个。

这是最优化的解决方案吗?请对我如何改进这一点有任何想法?

【问题讨论】:

您能否详细说明为什么需要多次遍历单个员工表? 展示你现有的代码会有很大帮助。详细信息比文字解释更容易理解。 【参考方案1】:

请注意,无论您的数据收集和操作算法如何,您都可以通过首先准备多维数组中的数据,然后使用 .Range VBA 方法用您的大批。

关键是您一次将数组写入一个范围,而不是逐个单元格。我假设现在您正在执行许多单独的单元格操作,例如从一个单元格中获取一条数据,将其放入另一个单元格等。excel 单元格操作和 VBA 之间的实际交互实际上很慢(不确定为什么,但可能是由于级联单元格函数和视觉更新,但有关 Excel+VBA 速度和效率规则和示例的更多信息,请参阅https://www.soa.org/News-and-Publications/Newsletters/Compact/2012/january/com-2012-iss42-roper.aspx。

有关如何使用数组和范围的更多信息:http://www.cpearson.com/excel/ArraysAndRanges.aspx 顺便说一句,C Pearson 有很多关于 Excel+VBA 的重要信息,所以我强烈推荐他的网站作为一般参考。

我以前使用过它,并将宏的速度从几分钟提高到几秒钟。希望它可以为您做同样的事情。


编辑:我不知道你目前的数据操作算法是什么,所以我还不能直接评论,但如果是为了费用的总和,你能不能试着在你去的时候总结数据, 这样您就不需要在到达工作表时进行任何额外的计算,您只需在正确的月份列中输入数据?

【讨论】:

这个方法我没见过。那么,您是否将整个数据放入内存(数组)中,然后首先处理其中的所有内容?然后把结果写到工作表上? 基本上,是的。我将很快更新我的答案,以提供更多关于范围和数组的参考/信息 感谢您的链接!我不知道这件事。我正在浏览该站点,但是将数组转储到列而不是遍历数组的每个元素并写入列的每个单元格是否更快?无论如何,第一种方法不是写入每个单元格吗? 老实说,我不是 100% 确定原因。我的猜测是 Excel 还将其数据存储在多维数组中,因此从其结构中拼接数据比通过基于 GUI 的系统更容易(因为操作单元格会触发函数和其他视觉更新)。有关更多信息,请查看有关 Excel+VBA 效率的链接:soa.org/News-and-Publications/Newsletters/Compact/2012/january/… 最后,有趣的事实:使用 3D 数组可以在多张纸上复制和粘贴数据

以上是关于Excel VBA脚本优化——遍历算法——解决这个难题?的主要内容,如果未能解决你的问题,请参考以下文章

VBA脚本上的Excel VBA对象需要错误在计数器时重复行

如下VBA代码 在EXCEL运行时非常慢,有哪位大侠能帮忙解决优化一下。

用VBA程式设计如何遍历EXCEL每一个工作表

Excel VBA如何遍历所有活动窗口

Excel VBA怎么实现整行/列的遍历

VBA宏运行速度为啥比Excel自带函数慢