Sky*_*nel 5 excel performance vba listobject
我在使用列表对象(又名 Excel 表格)的 excel 应用程序上遇到了性能问题。我怀疑这可能是一个错误,但尽管我在谷歌上搜索,但我找不到任何参考。我已经为我的应用程序开发了一种解决方法,但我感兴趣的是是否有人可以深入了解为什么会发生这种情况。
注意:我在 Windows Vista 上使用 Excel 2007。设置如下:我有一个电子表格,其中包含一个列表对象中的数据,带有可以通过命令按钮启动的 VBA 代码;此代码可以对工作表上的任意数量的单元格进行多次编辑,因此在进行任何编辑之前,Excel 的计算模式设置为手动。
我遇到的问题是,如果当前活动的单元格在列表对象内,那么将计算模式设置为手动似乎没有任何效果。因此,如果用户碰巧在同一实例中打开了大量计算工作簿,则 VBA 代码运行速度非常慢。我几乎不得不拆开我的应用程序,发现这是由活动单元引起的;并且我创建了一个包含此场景简单版本的新工作簿,以确认我的应用程序没有某种损坏。
我一直在用这个做一些测试用例,下面是我发现的结果:
虽然看起来一般都跟计算有关,但是计算模式在手动和自动之间切换还是有时间差的……
手动模式比自动模式快不到 20%。但我的期望是它们或多或少是相同的,考虑到问题似乎是即使在手动模式下也开始计算。
与活动单元格不在列表对象上时相比,结果大不相同......
现在,手动运行速度提高了 50 倍,而自动运行显示计算时间不应超过 3.2 秒!所以现在第一个测试看起来可能在手动模式下运行了两次计算,在自动模式下运行了近 3 次。
再次重复这个测试,这次是在一个单元格中没有计算公式的实例中,突然它看起来没有那么糟糕,
它仍然较慢,但现在只有 10-20%,使其不明显。但这确实表明该问题必须以某种方式与计算相关,否则它应该与第一次测试一样长。
如果有人想创建这些测试以供自己查看,设置如下:
我很想听听是否有人可以解释为什么 Excel 会以这种方式运行,如果是一个错误,或者是否与列表对象有关的某些功能实际上有一些真正的用途?
谢谢,斯图尔特
这与你发现的“bug”无关,这是相当有趣和耐人寻味的。
我只是想分享有一个很好的方法可以避免计算延迟。我用它取得了很好的效果,现在我一直在使用它。
简单地说,Excel需要很长时间在“VBA世界”和“电子表格世界”之间来回复制数据。
如果您一次执行所有“读取”、处理,然后立即执行所有“写入”,您将获得惊人的性能。这是使用此处记录的变体数组来完成的:
http://msdn.microsoft.com/en-us/library/ff726673.aspx#xlFasterVBA
在标记为:在单个操作中读取和写入大数据块的部分中
我能够重构一些需要 5 分钟才能运行的代码,并将其缩短到 1.5 分钟。重构花了我 10 分钟,这很令人惊奇,因为它是相当复杂的代码。