我有一个有点大的 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
> ...
问题: 填充员工表的最佳方式是什么?
我当前的算法通过读取每条记录来遍历一次主数据表。但它随后多次遍历员工表。它会在员工的工作表上查找该费用类型,并将金额添加到之前的金额。
这是最优解吗?关于我如何改进这一点有什么想法吗?
最佳答案
请注意,无论您的数据收集和操作算法如何,您都可以通过首先在多维数组中准备数据,然后使用 .Range VBA 方法用您的数据填充给定范围来极大地加快该过程大批。
这样做的关键是您一次性将数组写出到一个范围内,而不是逐个单元格地写出。我假设现在您正在做很多单独的单元格操作,例如从一个单元格获取一段数据,将其放入另一个单元格等。excel 单元格操作和 VBA 之间的实际交互实际上非常慢(不确定为什么,但可能是由于级联单元格函数和视觉更新,但请参阅 https://www.soa.org/News-and-Publications/Newsletters/Compact/2012/january/com-2012-iss42-roper.aspx 了解有关 Excel+VBA 速度和效率规则和示例的更多信息。
有关如何使用数组和范围的更多信息:http://www.cpearson.com/excel/ArraysAndRanges.aspx
顺便说一下,C Pearson 有很多关于 Excel+VBA 的重要信息,所以我强烈推荐他的网站作为一般引用。
我以前用过它,将宏的速度从几分钟缩短到几秒。希望它也能为您做同样的事情。
编辑:我不知道你现在的数据操作算法是什么,所以我还不能直接评论,但是如果是为了费用的汇总,你能不能边走边总结数据,这样一来,当您进入工作表时就不需要进行任何额外的计算,只需在正确的月份列中输入数据即可?
关于algorithm - Excel VBA脚本优化——遍历算法——解决这个难题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28181613/