在包含多次对同一个函数进行相同调用的单元格中“parsing”一个函数的时候,智能是多么的聪明

考虑到这一点:单元格C1有一个公式,多次调用另一个函数:

例如=ExcelFuntionA(ExcelFunctionCallB(1), ExcelFunctionCallB(1)-1, ExcelFunctionCallB(1)-2, ExcelFunctionCallB(1)*3)

请注意,传递给ExcelFunctionCallB的参数ExcelFunctionCallB都具有相同的值。

如果ExcelFunctionCallB(..)是一个涉及重要处理的函数,如果ExcelFunctionCallB(..)的结果在其他单元格中find,并且上述公式被更改为引用该单元格4次,Excel将更快地处理公式。

例如

A2有公式ExcelFunctionCallB(..) C1然后读=ExcelFuntionA(A2, A2-1, A2-2, A2*3)

我想知道如何聪明的Excel!

  1. 可以看到,调用是相同的,只处理一次调用该函数?

  2. 这是否足够智能,可以对数组公式和普通函数公式这么做?

  3. 如果你调用一个用VBA编写的函数,它是如何工作的?
    承担一个VBA函数可以直接引用不作为parameter passing的单元格(我知道这是顽皮的,但它发生,只有很小的机会,它可能会返回一个不同的值,即使与它一起使用的参数是相同的。)

从上面的介绍,有没有办法告诉代码,一个VBA函数不直接访问任何Excel单元格? (有点像application.volatile我会想象)

一个更现实的例子:我实际上正在试验这样的公式:

=MID($A2, FIND("@",SUBSTITUTE("#" & $A2 & "#","#","@",B$1)), FIND("@",SUBSTITUTE("#" & $A2 & "#","#","@",B$1+1)) - FIND("@",SUBSTITUTE("#" & $A2 & "#","#","@",B$1)) - 1 )

这在有关SO问题24182334 / splitting-text-columns的未批准答案中提出的文件中有详细logging

请注意,此公式使用文本FIND("@",SUBSTITUTE("#" & $A2 & "#","#","@",B$1))三次。

[PS。 我知道在VBA中分割和文本到列菜单选项。]

如果ExcelFunctionCallB(..)是一个涉及重要处理的函数,如果ExcelFunctionCallB(..)的结果在其他单元格中find,并且上述公式被更改为引用该单元格4次,Excel将更快地处理公式。

这是正确的,引用一个已经计算过的单元比在单个单元中多次重新计算同样的东西要快。 Excel将分别计算每一个

另外,正如pnuts指出的,这个链接可能是有趣的: http : //msdn.microsoft.com/en-us/library/office/ff700515%28v=office.14%29.aspx

(作为克里斯·尼尔森的build议回答)

上面的答案( 这里 )的链接的关键文字是

如果您有一个计算密集型公式,您希望如果出现错误(在精确匹配查找时经常发生这种情况),结果显示为零,则可以通过多种方式进行编写。

你可以把它写成一个单一的公式,这是慢的:

在单元格A1 =IF(ISERROR(time expensive formula),0,time expensive formula)

你可以把它写成两个很快的公式:

在单元格A1 =time expensive formula
在单元格B1 =IF(ISERROR(A1),0,A1)

从Excel 2007开始,您可以使用IFERROR函数,该函数devise得很快捷简单,并且是一个公式:

在单元格A1 =IFERROR(time expensive formula,0)

所以同样的逻辑也适用于其他types的公式。