我需要在同一行中用一组列(从左到右)填充第一个非空条目的单元格 - 类似于SQL中的coalesce()。
在以下示例表
中---------------------------------------
| | A | B | C | D |
---------------------------------------
| 1 | | x | y | z |
---------------------------------------
| 2 | | | y | |
---------------------------------------
| 3 | | | | z |
---------------------------------------
我想在A行的每个单元格中放置一个单元格函数,以便我得到:
---------------------------------------
| | A | B | C | D |
---------------------------------------
| 1 | x | x | y | z |
---------------------------------------
| 2 | y | | y | |
---------------------------------------
| 3 | z | | | z |
---------------------------------------
我知道我可以通过级联的IF函数来实现这一点,但在我的实际工作表中,我有30列可供选择,所以如果有更简单的方法我会很高兴。
答案 0 :(得分:44)
=INDEX(B2:D2,MATCH(FALSE,ISBLANK(B2:D2),FALSE))
这是一个数组公式。输入公式后,按 CTRL + Shift + 输入以使Excel将其评估为数组公式。这将返回给定单元格范围的第一个非空值。对于您的示例,公式将在标题为“a”
的列中输入 A B C D
1 x x y z
2 y y
3 z z
答案 1 :(得分:6)
或者,如果要比较单个单元格,可以在VBA中创建Coalesce函数:
Public Function Coalesce(ParamArray Fields() As Variant) As Variant
Dim v As Variant
For Each v In Fields
If "" & v <> "" Then
Coalesce = v
Exit Function
End If
Next
Coalesce = ""
End Function
然后在Excel中调用它。在您的示例中,A1中的公式为:
=Coalesce(B1, C1, D1)
答案 2 :(得分:6)
我用过:
=IF(ISBLANK(A1),B1,A1)
这将测试您要使用的第一个字段是否为空白,然后使用另一个。您可以使用“嵌套如果”当你有多个字段。
答案 3 :(得分:2)
将VBA方法更进一步,我重新编写它以允许两个(或任一个)单个细胞和细胞范围的组合:
Public Function Coalesce(ParamArray Cells() As Variant) As Variant
Dim Cell As Variant
Dim SubCell As Variant
For Each Cell In Cells
If VarType(Cell) > vbArray Then
For Each SubCell In Cell
If VarType(SubCell) <> vbEmpty Then
Coalesce = SubCell
Exit Function
End If
Next
Else
If VarType(Cell) <> vbEmpty Then
Coalesce = Cell
Exit Function
End If
End If
Next
Coalesce = ""
End Function
现在在Excel中,您可以在A1中使用以下任何公式:
=Coalesce(B1, C1, D1)
=Coalesce(B1, C1:D1)
=Coalesce(B1:C1, D1)
=Coalesce(B1:D1)
答案 4 :(得分:1)
如果您只想合并为 0(这是一个非常常见的用例),您可以简单地围绕单个值使用 SUM()
函数。为方便起见,人们将所有空白都视为零,而且由于它很短,所以特别方便。
不是像其他答案那样的通用解决方案,而是在许多情况下这正是您想要的有用的捷径。
答案 5 :(得分:0)
在数组内输入不允许的变量。
Function Coalesce(ParamArray Fields() As Variant) As Variant
Dim v As Variant
For Each v In Fields
If IsError(Application.Match(v, Array("", " ", 0), False)) Then
Coalesce = v
Exit Function
End If
Next
Coalesce = ""
End Function
答案 6 :(得分:0)
如果您知道列之间不会有任何重叠,或者想要重叠,那么这是解决合并的一种非常快速的方法。以下公式不适用于您的值和列,而是适用于我的模型,因此您需要进行调整以使其相关。
=LEFT(TRIM(CONCATENATE(Q38,R38,S38,T38,U38,V38,W38,X38,Y38)),1)
答案 7 :(得分:0)
根据您要检查的单元格数量,您可以将多个 ISBLANK 检查链接在一起。
例如,在检查 A、B 列和 C 列时:
=IF(ISBLANK(A1),IF(ISBLANK(B1),C1,B1),A1)
对于 A、B、C 和 D 列:
=IF(ISBLANK(A1),IF(ISBLANK(B1),IF(ISBLANK(C1),D1,C1),B1),A1)
...等等。
答案 8 :(得分:0)
使用 excel 中更新的 IFS 函数,您无需嵌套。你可以尝试类似