B R*_*era 5 excel optimization vba user-defined-functions
我有一个使用几乎所有UDF的Excel模型.有说,120列和400多行.计算是垂直完成的,然后是水平的 - 首先完成第1列的所有计算,然后第1列的最终输出是第2列的输入,等等.在每一列中,我调用大约六个或七个UDF.调用其他UDF.UDF经常输出一个数组.
每个UDF的输入是许多变量,一些范围变量,一些双精度数.范围变量在访问其内容之前在内部转换为数组.
我的问题如下,我可以构建没有UDF的Excel模型,当我运行模拟时,我可以在X小时内完成所有计算.当我使用UDF时,模拟时间为3X小时或更长.(为了回答这个显而易见的问题,是的,我需要使用UDF,因为如果我想对模型做一些小改动(比如说添加另一种资产类型(它是一个财务模型)),需要将近一天的时间重建模型如果没有UDF来适应新的法律/财务结构,使用UDF需要大约20分钟才能适应不同的财务结构.)
在任何情况下,我都关闭了屏幕更新,在函数中没有复制和粘贴,Variant类型的使用是最小的,所有数据都包含在一个工作表中,我在获取内容之前将所有范围类型变量转换为数组.
除了获得更快的计算机或同等程度以使VBA代码/ Excel文件运行得更快之外,我还能做什么?如果需要更多说明,请告诉我.
谢谢!
Excel 处理 UDF 的方式存在速度减慢的错误。每次计算 UDF 时,Excel 都会刷新 VBE 标题栏(您可以看到它闪烁)。对于大量 UDF,这非常慢。在手动计算模式下,绕过非常简单:只需使用 Application.Calculate 之类的东西从 VBA 启动计算(您可以使用 OnKey 捕获 F9 等)。
请参阅http://www.decisionmodels.com/calcsecretsj.htm了解更多详细信息。
控制并最小化重新计算
wks.EnableCalculation = False
Run Code Online (Sandbox Code Playgroud)
或者
Application.Calculation = xlCalculationManual
Run Code Online (Sandbox Code Playgroud)
另外,尽量减少 VBA 和工作簿之间的交换。将单元块一次性读取和写入数组的速度更快
MyArray = range("B2:B20000")
Run Code Online (Sandbox Code Playgroud)
而不是逐个单元(对于每个......)。