通常,Excel VBA的评估功能是在VBA中获取工作表公式结果的便捷方式,而无需将公式放在工作表单元格中。但是,我发现,如果要评估的公式是跨多个列的MATCH函数,它的速度非常慢 - 比在工作表单元格中计算相同的公式慢得多。例如:
MatchingRow = EVALUATE(MATCH(Sheet1!G6&Sheet1!H6&Sheet1!I6,Sheet2!B:B&Sheet2!C:C&Sheet2!D:D,0))
在工作表单元格中知道为什么会比这慢得多?
=MATCH(Sheet1!G6&Sheet1!H6&Sheet1!I6,Sheet2!B:B&Sheet2!C:C&Sheet2!D:D,0)
我非常确定我可以听到某人已经输入了答案,说明这一切都是因为从VBA环境调用工作表函数的开销。但如果情况确实如此,我的后续问题是:为什么其他功能的评估速度也不慢?
答案 0 :(得分:2)
有几件事。
使用Evaluate()时,范围很重要。在工作表上调用方法的速度大约是单独使用Evaluate()的两倍,这是Application.Evaluate()的简写。
连接速度非常慢,并且在调用VBA和Excel之间的障碍时效率低下。
使用布尔逻辑作为另一种机制来重新计算公式,以获得相同的公式结果,执行得更快,并且更接近于工作表所包含的公式:
MatchingRow = = Sheet1.[MATCH(1,(Sheet1!G6=Sheet2!B:B)*(Sheet1!H6=Sheet2!C:C)*(Sheet1!I6=Sheet2!D:D),0)]
<强>更新强>
为了完整起见,您还应该强烈考虑限制查找范围的深度。这将大大加快工作表或VBA的公式评估速度。这是与上面相同的公式,但查找范围仅限于100行。适当调整:
Sheet1.[MATCH(1,(Sheet1!G6=Sheet2!B1:B100)*(Sheet1!H6=Sheet2!C1:C100)*(Sheet1!I6=Sheet2!D1:D100),0)]