Excel 列表对象 VBA 性能错误?

Sky*_*nel 5 excel performance vba listobject

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

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

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

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

  1. 虽然看起来一般都跟计算有关,但是计算模式在手动和自动之间切换还是有时间差的……

    • 手动 = 7.64 秒
    • 自动 = 9.39 秒

    手动模式比自动模式快不到 20%。但我的期望是它们或多或少是相同的,考虑到问题似乎是即使在手动模式下也开始计算。

  2. 与活动单元格不在列表对象上时相比,结果大不相同......

    • 手动 = 0.14 秒
    • 自动 = 3.23 秒

    现在,手动运行速度提高了 50 倍,而自动运行显示计算时间不应超过 3.2 秒!所以现在第一个测试看起来可能在手动模式下运行了两次计算,在自动模式下运行了近 3 次。

  3. 再次重复这个测试,这次是在一个单元格中没有计算公式的实例中,突然它看起来没有那么糟糕,

    • 活动单元格为 List Object & Calc 为 Manual = 0.17 秒
    • 活动单元格是列表对象和计算是自动 = 0.20 秒
    • 活动单元格为空且计算为手动 = 0.14 秒
    • 活动单元格为空且计算器为自动 = 0.18 秒

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

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

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

我很想听听是否有人可以解释为什么 Excel 会以这种方式运行,如果是一个错误,或者是否与列表对象有关的某些功能实际上有一些真正的用途?

谢谢,斯图尔特

pgr*_*pgr 2

这与你发现的“bug”无关,这是相当有趣和耐人寻味的。

我只是想分享有一个很好的方法可以避免计算延迟。我用它取得了很好的效果,现在我一直在使用它。

简单地说,Excel需要很长时间在“VBA世界”和“电子表格世界”之间来回复制数据。

如果您一次执行所有“读取”、处理,然后立即执行所有“写入”,您将获得惊人的性能。这是使用此处记录的变体数组来完成的:

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

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

我能够重构一些需要 5 分钟才能运行的代码,并将其缩短到 1.5 分钟。重构花了我 10 分钟,这很令人惊奇,因为它是相当复杂的代码。