Excel中是否有类似合并的功能?

时间:2013-11-20 18:22:50

标签: sql excel xls coalesce

我需要在同一行中用一组列(从左到右)填充第一个非空条目的单元格 - 类似于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列可供选择,所以如果有更简单的方法我会很高兴。

9 个答案:

答案 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 函数,您无需嵌套。你可以尝试类似

  1. 在右侧创建一个空白单元格 然后进入。 =IFS(ISBLANK(A1),B1,ISBLANK(A1),C1,ISBLANK(A1),D1) 根据需要突出显示列并粘贴。