是否可以为公式块添加别名,并在稍后在同一公式中引用它?例如,假设我有一个 IF 表达式,并且逻辑测试组件本身是一个复杂的公式,如果测试结果为 false,我希望再次使用它,如下所示:
=IF(Do_this()=0,"NA",Do_this())
答案1
如果您有 Excel O365您可以使用 LET() 函数,也可以使用名称管理器中的 LAMBDA() 函数来完成此操作。
让()
同时使用 LET() 函数和 alt-enter 在公式中创建不间断的回车符,可以同时实现两个目标:
- 简化公式以提高可读性并从而提高未来的可维护性;
- 通过仅计算一次值并在公式中重复使用该值来优化性能。
假设您的“Do_This”是一个公式,对单元格 A1 中的球员姓名执行 3 次“XLOOKUP”,并对分数表中找到的值求和:
=LET(
score1, XLOOKUP(A1, scoreTable1[players], scoreTable1[scores], 0),
score2, XLOOKUP(A1, scoreTable2[players], scoreTable1[scores], 0),
score3, XLOOKUP(A1, scoreTable3[players], scoreTable1[scores], 0),
totalScore, score1 + score2 + score3,
If( totalScore = 0, “NA”, totalScore )
)
易于阅读、易于理解,并且分离如何从逻辑上收集数据什么收集数据后,需要执行哪些操作。这 3 个查找仅执行一次,而不是两次,这可以非常对于大型复杂板材的性能具有重要意义。
名称管理器中的 LAMBDA
还需要 O365。您现在可以进入名称管理器并使用该LAMBDA()
函数创建一个函数。您可以GetTotalScore()
使用 Lambda 定义一个函数,然后在单元格公式中只需使用以下逻辑:
=IF( GetTotalScore(A1) = 0, "NA", GetTotalScore(A1) )
一旦定义了名称,您就可以像使用内置函数=GetTotalScore("Joe Smith")
一样使用它。GetTotalScore()
我上面的 if 语句调用了两次函数,所以如果你只想要可读性而不是更好的性能,那没问题。但你可以更进一步,仍然使用 LET()和一个名为 LAMBDA:
=LET(
totalScore, getTotalScore(A1),
IF( totalScore = 0, "NA", totalScore )
)
现在您仅调用了一次公式并且拥有可读的代码。
最后,请记住,您可以在名称管理器中“构建”复杂的 LAMBDA。当公式变得非常复杂时,这很有用:
- 定义 Lambda getScore1
- 定义另一个 Lambda getScore2
- 定义另一个 Lambda getScore3
- 定义一个将它们加在一起的 totalScore Lambda。