使用匹配工作表函数引用多个列来评估函数的速度

时间:2015-09-22 19:44:49

标签: excel vba excel-vba worksheet-function

通常,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环境调用工作表函数的开销。但如果情况确实如此,我的后续问题是:为什么其他功能的评估速度也不慢?

1 个答案:

答案 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)]