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

通常情况下,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) 

我很确定我可以听到有人已经input了答案,说这全是因为从VBA环境调用工作表函数的开销。 但是如果是这样的话,我的后续问题是: 为什么其他函数的EVALUATE慢呢?

几件事情。

使用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)] 

UPDATE

为了保持完整性,还应该考虑限制查找范围的深度。 这将大大加快公式评估工作表或从VBA。 这里是与上面相同的公式,但查找范围限制在100行以内。 适当调整:

 Sheet1.[MATCH(1,(Sheet1!G6=Sheet2!B1:B100)*(Sheet1!H6=Sheet2!C1:C100)*(Sheet1!I6=Sheet2!D1:D100),0)]