![](/img/trans.png)
[英]Excel VBA: how to rewrite my long FormulaArray code with .replace
[英]Excel VBA FormulaArray Too Slow
我有一个宏,它根据会计期间填充开始日期和完成日期。 例如:产品X在1月12日-12月12日销售。 该宏将使用vlookup / min数组查找开始,并使用vlookup / max数组查找结束。 日期采用YYYYMM格式,因此vlookup正在查看日历选项卡,该选项卡将对应的YYYYMM映射到开始或结束日期。 编码工作正常,但在某些情况下,存在30,000-100,000行,可能需要15-20分钟才能运行。 是否有人对如何使其运行更快有任何想法?
这是代码:
Cells(Rcnt,5).FormulaArray =“ = VLOOKUP(MIN(IF('Normalized'!A:A =”&Cells(Rcnt,1).Address(False,False)&“,'Normalized'!J:J )),'Calendar'!A:C,2,FALSE)“
任何帮助将不胜感激。
我对您的问题的理解是,您的数据列出了每个月每个产品的销售额,因此对于每个产品,您都在搜索前几个月和最后几个月。 您可以按产品和日期对数据进行排序吗? 如Emschorsch所述,这将是实现循环的最简单方法,因为您一次只能处理一种产品。
尝试加快速度的其他几件事:
将代码的第一行设置为:
Application.Calculation = xlCalculationManual
最后一行是:
Application.Calculation = xlCalculationAutomatic
(您仍然有大量的查询,但是它们将一次计算全部,而不是在创建每一行的公式时一次计算一次)
如果无法对数据进行排序,则可以连续对每个产品进行自动过滤,并使用SUBTOTAL()函数(引用日期列)来获取最小值和最大值。 (您可以将SUBTOTAL()公式放在未使用的单元格中,并在您的代码中引用该单元格,或者使用Application.WorksheetFunction在代码中直接使用它)
似乎没有必要的另一部分(如果无法看到您的数据,我们无法确定)是使用查找将YYYYMM转换为日期,如果这确实是所有日期都采用的格式的话,那么无需使用VBA即可轻松实现DATE()公式,或者如果您需要在宏中使用它:
cells(Rcnt, 5).Value = DateSerial(Left(x, 4), Right(x, 2), 1) 'x is your date in YYYYMM format
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.