我在使用列表对象(AKA Excel表格)的Excel应用程序中遇到问题。我怀疑这可能是一个错误,但尽管我谷歌搜索,我找不到任何它的参考。我已经为我的应用程序开发了一种解决方法,但是我感兴趣的是如果任何人都可以提供有关发生这种情况的信息。Excel列表 - 对象VBA性能错误?
注意:我在Windows Vista上使用Excel 2007。设置如下:我有一个电子表格,它将数据保存在List对象中,VBA代码可以通过命令按钮启动;此代码可能会对工作表上的任意数量的单元格进行编辑,因此Excel的计算模式在进行任何编辑之前都设置为手动。
我遇到的问题是,如果当前活动的单元格在列表对象内,那么将计算模式设置为手动似乎没有任何效果。因此,如果用户碰巧在同一个实例中打开繁重的计算工作簿,那么VBA代码运行速度非常缓慢。我实际上不得不拉开我的应用程序以发现这是由活动单元格引起的;我用这个场景的简单版本创建了一个新的工作手册,以确认我的应用程序没有出现某种腐败。
我已经做了一些测试案例这个问题,以下是从我所发现的结果:
虽然看上去一般与计算,仍然有时间差时,计算模式手动和自动之间切换...
- 手册= 7.64秒
- 自动= 9.39秒
手动模式比自动模式快不到20%。但我的期望是他们会差不多,因为即使在手动模式下,这个问题似乎也是开始计算的。
与此相比,当活动单元格是不是在一个列表对象,结果有很大的不同......
- 手册= 0.14秒
- 自动= 3.23秒
现在,手动运行速度提高了50倍,自动运行表明计算时间不应超过3.2秒!因此,现在第一个测试看起来像是在手动模式下可能会运行两次计算,而在自动模式下则会运行近三次。
再次重复这一试验,这一次是在与任何单元格不计算公式的情况下,突然它似乎并不那么糟糕,
- 活动单元格列出对象& Calc是手动= 0.17秒
- 活动单元格列出对象& Calc是自动= 0.20秒
- 活动单元格是空& Calc是手动= 0.14秒
- 活动单元格是空& Calc是Automatic = 0。18秒
它仍然较慢,但现在只有10-20%,使它不明显。但是这确实表明问题必须以某种方式与计算相关,否则它应该与第一次测试一样长。
如果有人想创建这些测试,看看自己的设置如下:
- 新工作簿添加了一个列表对象(没有链接到任何数据)
- 添加一些公式,将需要一段时间来计算(我刚做'= 1 * 1'重复30,000次)
- 写一个快速的VBA代码,通过细胞的简单编辑(I)环数百倍,(ii)和记录需要的时间
- 然后只需运行该代码同时改变列表对象和空单元格之间的活动单元格
我会非常感兴趣的是,如果有人能够解释为什么Excel会以这种方式运行,并且如果有错误或者是否有一些与List对象有关的功能,这些功能实际上有一些真正的用途?
感谢, 斯图尔特
我无法复制您的结果。在手动计算模式下编辑列表对象中的数据时,不会重新计算易失公式。如果Screenupdating处于打开状态,那么反复编辑列表对象中的列表对象并且列表对象中的活动单元格速度与预期的一样缓慢,但屏幕更新关闭时,我没有得到明显区别。你能发布一个链接到你的示例文件吗? – 2012-01-15 18:31:59
@CharlesWilliams感谢您的回复。也许我没有完全解释我的设置,[链接到这里下载](http://dl.dropbox.com/u/3010466/Excel%20List-Object%20VBA%20Preformance%20Bug.xlsm) 我已经screenupdating转向在我的所有测试中关闭。我并没有完全知道什么时候excel会运行计算,但是我今天在worksheet_calculation事件上添加了一个计数器,看看它是如何表现的 - 当计算模式为手动计数时为0,并且形式为真。所以我可能是我在咆哮错误的树? – Skytunnel 2012-01-15 19:28:27
感谢您的链接。为了获得放缓,你似乎需要3个条件:1.活动单元格必须在Listobject(Table)中。 2.正在更新的单元必须与Listobject在同一工作表上。 3.所用时间是公式数的函数(但公式不会被重新计算)。目前我无法想象为什么会发生这种情况。 – 2012-01-16 16:06:14