在 Excel 中,如何避免重复公式的大部分只是为了检查 return 值是否为空?
In Excel, how can I avoid repeating a big part of the formula just to check if the return value is blank?
我有一种情况,我在不同的工作表中引用单元格并从该工作表返回单元格的值。虽然它有效,但我发现我当前的方法效率低下,因为我必须在 IF 语句的逻辑测试部分重复公式:
=IF(**EXTREMELY LONG COMPLICATED FORMULA** <> "", **EXTREMELY LONG COMPLICATED FORMULA**, "")
如您所见,我必须重复公式的主要部分,只是为了先检查它是否为空。如果我不这样做,我会在单元格中得到一个零(对于引用工作表中的空白值)。我正在寻找更像的东西:
=IF(**EXTREMELY LONG COMPLICATED FORMULA** <> "", **RETURN VALUE**, "")
这对我来说看起来更清晰,因为我不必重复自己。此外,如果我们必须更新公式,我将不必将我的更改复制到重复的部分。 有办法吗?
以上实际上是我的问题的简化版本,但答案应该让我知道我需要去的地方。我的实际公式有嵌套的 IF 语句检查空白。作为参考,这里是:
=IFERROR(IF(SMALL(IF(ImportedData!$H:$H00>=DataFilters!$A,IF(ImportedData!$G:$G00=DataFilters!$A,ROW(ImportedData!A:A00)-ROW(ImportedData!A)+1)),ROWS(ImportedData!A:ImportedData!A2))<>"",IF(INDEX(ImportedData!A:A00,SMALL(IF(ImportedData!$H:$H00>=DataFilters!$A,IF(ImportedData!$G:$G00=DataFilters!$A,ROW(ImportedData!A:A00)-ROW(ImportedData!A)+1)),ROWS(ImportedData!A:ImportedData!A2)))<>"",INDEX(ImportedData!A:A00,SMALL(IF(ImportedData!$H:$H00>=DataFilters!$A,IF(ImportedData!$G:$G00=DataFilters!$A,ROW(ImportedData!A:A00)-ROW(ImportedData!A)+1)),ROWS(ImportedData!A:ImportedData!A2))),""),""),"")
最明显的解决方案是使用辅助列或单元格。只需将 EXTREMELY LONG COMPLICATED FORMULA
放在电子表格的某处,然后在 IF
公式中引用该单元格。
编辑
为了避免出现辅助列,这里是我偶尔使用的一个技巧:
=IFERROR(VALUE(long_formula&""),"")
它所做的是,将长公式的结果与一个空字符串连接起来(将其转换为字符串),然后取所有这些的值(如果可能,将其转换回数字),然后替换空白的任何错误。 (如果您尝试获取非数字值,则会发生错误。)
这仅在您有数值结果或空结果时才有效。如果您有文本结果,它将失败。
您是否需要单元格中的空白以进行进一步计算或 if 函数,或者您只是不想看到 0?
第二种情况:
只需为列使用数字格式,如
0,00;-0,00;"";@
第一种情况:
将以下代码放入模块中:
Option Explicit
Public Function IfEmpty(LongFormula As String) As String
If LongFormula = "" Then
IfEmpty = ""
Else
IfEmpty = LongFormula
End If
End Function
并在您的工作表中使用它,例如
=IfEmpty(**EXTREMELY LONG COMPLICATED FORMULA**)
截至 2020 年 3 月,Excel 包含 LET
函数。你可以这样写:
=LET(ELCF,**EXTREMELY LONG COMPLICATED FORMULA**,IF(ELCF <> "", ELCF, ""))
其中三个参数是:
- 您将用来引用您的计算的名称,
- 计算本身,
- 最终使用公式计算。
该函数还允许定义多个名称。一般语法是:
=LET(name1, name_value1, calculation_or_name2, [name_value2, calculation_or_name3...])
https://support.microsoft.com/en-us/office/let-function-34842dd8-b92b-4d3f-b325-b8b8f9908999
我有一种情况,我在不同的工作表中引用单元格并从该工作表返回单元格的值。虽然它有效,但我发现我当前的方法效率低下,因为我必须在 IF 语句的逻辑测试部分重复公式:
=IF(**EXTREMELY LONG COMPLICATED FORMULA** <> "", **EXTREMELY LONG COMPLICATED FORMULA**, "")
如您所见,我必须重复公式的主要部分,只是为了先检查它是否为空。如果我不这样做,我会在单元格中得到一个零(对于引用工作表中的空白值)。我正在寻找更像的东西:
=IF(**EXTREMELY LONG COMPLICATED FORMULA** <> "", **RETURN VALUE**, "")
这对我来说看起来更清晰,因为我不必重复自己。此外,如果我们必须更新公式,我将不必将我的更改复制到重复的部分。 有办法吗?
以上实际上是我的问题的简化版本,但答案应该让我知道我需要去的地方。我的实际公式有嵌套的 IF 语句检查空白。作为参考,这里是:
=IFERROR(IF(SMALL(IF(ImportedData!$H:$H00>=DataFilters!$A,IF(ImportedData!$G:$G00=DataFilters!$A,ROW(ImportedData!A:A00)-ROW(ImportedData!A)+1)),ROWS(ImportedData!A:ImportedData!A2))<>"",IF(INDEX(ImportedData!A:A00,SMALL(IF(ImportedData!$H:$H00>=DataFilters!$A,IF(ImportedData!$G:$G00=DataFilters!$A,ROW(ImportedData!A:A00)-ROW(ImportedData!A)+1)),ROWS(ImportedData!A:ImportedData!A2)))<>"",INDEX(ImportedData!A:A00,SMALL(IF(ImportedData!$H:$H00>=DataFilters!$A,IF(ImportedData!$G:$G00=DataFilters!$A,ROW(ImportedData!A:A00)-ROW(ImportedData!A)+1)),ROWS(ImportedData!A:ImportedData!A2))),""),""),"")
最明显的解决方案是使用辅助列或单元格。只需将 EXTREMELY LONG COMPLICATED FORMULA
放在电子表格的某处,然后在 IF
公式中引用该单元格。
编辑
为了避免出现辅助列,这里是我偶尔使用的一个技巧:
=IFERROR(VALUE(long_formula&""),"")
它所做的是,将长公式的结果与一个空字符串连接起来(将其转换为字符串),然后取所有这些的值(如果可能,将其转换回数字),然后替换空白的任何错误。 (如果您尝试获取非数字值,则会发生错误。)
这仅在您有数值结果或空结果时才有效。如果您有文本结果,它将失败。
您是否需要单元格中的空白以进行进一步计算或 if 函数,或者您只是不想看到 0?
第二种情况: 只需为列使用数字格式,如
0,00;-0,00;"";@
第一种情况: 将以下代码放入模块中:
Option Explicit
Public Function IfEmpty(LongFormula As String) As String
If LongFormula = "" Then
IfEmpty = ""
Else
IfEmpty = LongFormula
End If
End Function
并在您的工作表中使用它,例如
=IfEmpty(**EXTREMELY LONG COMPLICATED FORMULA**)
截至 2020 年 3 月,Excel 包含 LET
函数。你可以这样写:
=LET(ELCF,**EXTREMELY LONG COMPLICATED FORMULA**,IF(ELCF <> "", ELCF, ""))
其中三个参数是:
- 您将用来引用您的计算的名称,
- 计算本身,
- 最终使用公式计算。
该函数还允许定义多个名称。一般语法是:
=LET(name1, name_value1, calculation_or_name2, [name_value2, calculation_or_name3...])
https://support.microsoft.com/en-us/office/let-function-34842dd8-b92b-4d3f-b325-b8b8f9908999