excel 当 "parses" 单元格中的函数多次包含对同一函数的相同调用时,它有多聪明
How intelligent is excel when is "parses" a function in a cell that includes identical calls to the same function more than once
考虑一下:单元格 C1
有一个多次调用另一个函数的公式:
例如=ExcelFuntionA(ExcelFunctionCallB(1), ExcelFunctionCallB(1)-1, ExcelFunctionCallB(1)-2, ExcelFunctionCallB(1)*3)
请注意,传递给 ExcelFunctionCallB
的参数每次都具有相同的值。
如果 ExcelFunctionCallB(..)
是一个涉及大量处理的函数,如果在另一个单元格中找到 ExcelFunctionCallB(..)
的结果并将上述公式更改为,excel 会更快地处理公式引用此单元格 4 次。
例如
假设 A2
有公式 ExcelFunctionCallB(..)
然后 C1 将读取 =ExcelFuntionA(A2, A2-1, A2-2, A2*3)
我想知道 excel 有多聪明!
可以看出调用是相同的并且只处理一次对函数的调用吗?
对数组公式和普通函数公式这样做是否足够智能?
如果你调用一个已经在VBA中编写的函数,它是如何工作的?
相信 VBA 函数可以直接引用单元格
不作为参数传递的(我知道这很顽皮,但它
发生了,而且它可能 return 不同的可能性很小
即使与它一起使用的参数相同也是如此。)
根据上面的内容,有没有办法告诉代码 VBA 函数不直接访问任何 excel 单元格? (有点像我想象的application.volatile
)
一个更现实的例子:我实际上一直在试验这样的公式:
=MID($A2, FIND("@",SUBSTITUTE("#" & $A2 & "#","#","@",B)), FIND("@",SUBSTITUTE("#" & $A2 & "#","#","@",B+1)) - FIND("@",SUBSTITUTE("#" & $A2 & "#","#","@",B)) - 1 )
在对 SO 问题 24182334/splitting-text-columns
的未批准答案的提议之一中有详细记录
请注意,此公式使用文本 FIND("@",SUBSTITUTE("#" & $A2 & "#","#","@",B))
三次。
[附言。我知道拆分 VBA 和文本到列菜单选项。]
If ExcelFunctionCallB(..) is a function that involves significant
processing, would excel process the formula quicker if the result of
ExcelFunctionCallB(..) was found in anther cell and the above formula
was changed to reference this cell 4 times.
这是正确的,引用已计算的单元格比在单个单元格中多次重新计算同一事物更快。 Excel会分别计算每一个
另外,正如 pnuts 所指出的,这个 link 可能是有趣的:http://msdn.microsoft.com/en-us/library/office/ff700515%28v=office.14%29.aspx
(根据克里斯尼尔森的建议作为答案发布)
上述答案 (here) 中 link 的关键文本是
如果您有一个计算密集型公式,您希望在出现错误时将结果显示为零(这经常发生在精确匹配查找中),您可以通过多种方式编写。
你可以把它写成一个单一的公式,这很慢:
在单元格 A1 中 =IF(ISERROR(time expensive formula),0,time expensive formula)
可以写成两个公式,速度很快:
在单元格 A1 中 =time expensive formula
在单元格 B1 =IF(ISERROR(A1),0,A1)
从Excel2007年开始,可以使用IFERROR函数,其设计快速简单,而且是单一公式:
在单元格 A1 中 =IFERROR(time expensive formula,0)
因此,相同的逻辑似乎也适用于其他类型的公式。
考虑一下:单元格 C1
有一个多次调用另一个函数的公式:
例如=ExcelFuntionA(ExcelFunctionCallB(1), ExcelFunctionCallB(1)-1, ExcelFunctionCallB(1)-2, ExcelFunctionCallB(1)*3)
请注意,传递给 ExcelFunctionCallB
的参数每次都具有相同的值。
如果 ExcelFunctionCallB(..)
是一个涉及大量处理的函数,如果在另一个单元格中找到 ExcelFunctionCallB(..)
的结果并将上述公式更改为,excel 会更快地处理公式引用此单元格 4 次。
例如
假设 A2
有公式 ExcelFunctionCallB(..)
然后 C1 将读取 =ExcelFuntionA(A2, A2-1, A2-2, A2*3)
我想知道 excel 有多聪明!
可以看出调用是相同的并且只处理一次对函数的调用吗?
对数组公式和普通函数公式这样做是否足够智能?
如果你调用一个已经在VBA中编写的函数,它是如何工作的?
相信 VBA 函数可以直接引用单元格 不作为参数传递的(我知道这很顽皮,但它 发生了,而且它可能 return 不同的可能性很小 即使与它一起使用的参数相同也是如此。)
根据上面的内容,有没有办法告诉代码 VBA 函数不直接访问任何 excel 单元格? (有点像我想象的application.volatile
)
一个更现实的例子:我实际上一直在试验这样的公式:
=MID($A2, FIND("@",SUBSTITUTE("#" & $A2 & "#","#","@",B)), FIND("@",SUBSTITUTE("#" & $A2 & "#","#","@",B+1)) - FIND("@",SUBSTITUTE("#" & $A2 & "#","#","@",B)) - 1 )
在对 SO 问题 24182334/splitting-text-columns
的未批准答案的提议之一中有详细记录请注意,此公式使用文本 FIND("@",SUBSTITUTE("#" & $A2 & "#","#","@",B))
三次。
[附言。我知道拆分 VBA 和文本到列菜单选项。]
If ExcelFunctionCallB(..) is a function that involves significant processing, would excel process the formula quicker if the result of ExcelFunctionCallB(..) was found in anther cell and the above formula was changed to reference this cell 4 times.
这是正确的,引用已计算的单元格比在单个单元格中多次重新计算同一事物更快。 Excel会分别计算每一个
另外,正如 pnuts 所指出的,这个 link 可能是有趣的:http://msdn.microsoft.com/en-us/library/office/ff700515%28v=office.14%29.aspx
(根据克里斯尼尔森的建议作为答案发布)
上述答案 (here) 中 link 的关键文本是
如果您有一个计算密集型公式,您希望在出现错误时将结果显示为零(这经常发生在精确匹配查找中),您可以通过多种方式编写。
你可以把它写成一个单一的公式,这很慢:
在单元格 A1 中 =IF(ISERROR(time expensive formula),0,time expensive formula)
可以写成两个公式,速度很快:
在单元格 A1 中 =time expensive formula
在单元格 B1 =IF(ISERROR(A1),0,A1)
从Excel2007年开始,可以使用IFERROR函数,其设计快速简单,而且是单一公式:
在单元格 A1 中 =IFERROR(time expensive formula,0)
因此,相同的逻辑似乎也适用于其他类型的公式。