Excel List-Object VBA性能错误?

我在使用列表对象(AKA Excel表)的Excel应用程序上遇到性能问题.我怀疑它可能是一个错误,但尽管我的谷歌搜索我找不到它的任何参考.我已经为我的应用程序开发了一个解决方法,但我感兴趣的是,是否有人可以提供任何有关为什么会发生这种情况的见解.

注意:我在Windows Vista上使用Excel 2007.设置如下:我有一个电子表格,用于保存列表对象中的数据,其中VBA代码可以通过命令按钮启动;此代码可能会对工作表上的任意数量的单元格进行多次编辑,因此在进行任何编辑之前,Excel的计算模式将设置为“手动”.

我遇到的问题是,如果当前活动的单元格在列表对象中,那么将计算模式设置为手动似乎没有任何效果.因此,如果用户碰巧在同一实例中打开了繁重的计算工作簿,那么VBA代码运行速度非常慢.我几乎不得不把我的应用程序分开来发现这是由活跃的细胞引起的;我用这个场景的简单版本创建了一个新工作簿,以确认我的应用程序没有出现某种损坏.

我一直在用这个做一些测试用例,下面是我发现的结果:

>虽然看起来通常与计算有关,但在手动和自动之间切换计算模式时仍然存在时差…

>手动= 7.64秒
>自动= 9.39秒

手动模式比自动模式快20%.但我的期望是他们或多或少相同,考虑到问题似乎是即使在手动模式下开始的计算.
>将其与活动单元格不在列表对象上时进行比较,结果大不相同…

>手动= 0.14秒
>自动= 3.23秒

现在,手动运行速度提高了50倍,自动运行表明计算时间不应超过3.2秒!所以现在第一个测试看起来可能在手动模式下运行计算两次,在自动模式下运行近3次.
>再次重复此测试,这次是在任何单元格中没有计算公式的情况下,突然间它看起来不那么糟糕,

>活动单元格是List Object& Calc是手动= 0.17秒
>活动单元格是List Object& Calc是自动= 0.20秒
>活动细胞是空的& Calc是手动= 0.14秒
>活动细胞是空的& Calc是自动= 0.18秒

它仍然较慢,但现在只有10-20%,这让它变得不明显.但这确实表明问题必须以某种方式与计算相关,否则它应该与第一次测试一样长.

如果有人想创建这些测试以便自己查看,则设置如下:

>添加了列表对象的新工作簿(不必链接到任何数据)
>添加一些将需要excel一段时间来计算的公式(我只是’= 1 * 1’重复30,000次)
>写一个快速的VBA代码; (i)循环完成一个单元的简单编辑几百次,(ii)并记录它所花费的时间
>然后在更改列表对象和空单元格之间的活动单元格时运行代码

我很想知道是否有人可以解释为什么Excel会以这种方式运行,如果是一个错误,或者是否与List Objects有关,它实际上有一些真正的用途?

谢谢,
斯图尔特

最佳答案 这与您找到的“bug”无关,这非常有趣且有趣.

我只是想分享一下避免计算延迟的好方法.我用这个得到了很棒的结果,现在我一直在使用它.

简而言之,Excel需要很长时间在“VBA世界”和“电子表格世界”之间来回复制数据.

如果您一次完成所有“读取”,处理,然后立即执行所有“写入”,您将获得惊人的性能.这是使用变量数组完成的,如下所示:

http://msdn.microsoft.com/en-us/library/ff726673.aspx#xlFasterVBA

在标记为“在单个操作中读取和写入大块数据”的部分中

我能够重构一些我花了5分钟运行的代码并将其降低到1.5分钟.重构花了我10分钟,这是惊人的,因为它是相当复杂的代码.

点赞