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

Fab*_*ian 43 sql excel xls coalesce

我需要用同一行中的一组列(从左到右)填充第一个非空条目的单元格 - 类似于SQL中的coalesce().

在以下示例表中

---------------------------------------
|     |  A   |   B   |   C   |    D   |
---------------------------------------
|  1  |      |   x   |   y   |    z   |
---------------------------------------
|  2  |      |       |   y   |        |
---------------------------------------
|  3  |      |       |       |    z   |
---------------------------------------
Run Code Online (Sandbox Code Playgroud)

我想在A行的每个单元格中放置一个单元格函数,以便我得到:

---------------------------------------
|     |  A   |   B   |   C   |    D   |
---------------------------------------
|  1  |  x   |   x   |   y   |    z   |
---------------------------------------
|  2  |  y   |       |   y   |        |
---------------------------------------
|  3  |  z   |       |       |    z   |
---------------------------------------
Run Code Online (Sandbox Code Playgroud)

我知道我可以通过级联的IF函数来实现这一点,但在我的实际工作表中,我有30列可供选择,所以如果有更简单的方法我会很高兴.

How*_*let 47

=INDEX(B2:D2,MATCH(FALSE,ISBLANK(B2:D2),FALSE))
Run Code Online (Sandbox Code Playgroud)

这是一个数组公式.输入公式后,按CTRL+ Shift+ Enter使Excel将其评估为数组公式.这将返回给定单元格范围的第一个非空值.对于您的示例,公式将在标题为"a"的列中输入

    A   B   C   D
1   x   x   y   z
2   y       y   
3   z           z
Run Code Online (Sandbox Code Playgroud)

  • 很有帮助。如果您使用它来合并一系列 vlookups 的结果,请将 `isblank` 替换为 `isna` (2认同)
  • @TimBarrass你可能不再需要这个了,但是尝试从右到左: =INDEX(B2:D2,1+SUM(IF(B2:D2=B2:D2,1,0))-MATCH(FALSE,索引(B2:D2,1,N(IF({1},SUM(IF(B2:D2=B2:D2,1,0))+列(B2)-列(B2:D2))))&" “=”,假)) (2认同)

小智 10

我用了:

=IF(ISBLANK(A1),B1,A1)
Run Code Online (Sandbox Code Playgroud)

这将测试您要使用的第一个字段是否为空白,然后使用另一个。当您有多个字段时,可以使用“嵌套的条件”。

  • 它不应该 - 它只测试两个字段,想象一下您在更多字段中搜索第一个非空字段,例如。整行 (2认同)

小智 7

或者,如果要比较单个单元格,可以在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
Run Code Online (Sandbox Code Playgroud)

然后在Excel中调用它.在您的示例中,A1中的公式为:

=Coalesce(B1, C1, D1)
Run Code Online (Sandbox Code Playgroud)


小智 7

进一步采用 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
Run Code Online (Sandbox Code Playgroud)

现在,在 Excel 中,您可以在 A1 中使用以下任意公式:

=Coalesce(B1, C1, D1)
=Coalesce(B1, C1:D1)
=Coalesce(B1:C1, D1)
=Coalesce(B1:D1)
Run Code Online (Sandbox Code Playgroud)


Aar*_*ney 5

如果您知道列之间不会有任何重叠,或者想要重叠,那么这是解决合并问题的一种非常快速的方法。以下公式不适用于您的值和列,而是适用于我的模型,因此您需要进行调整以使其相关。

=LEFT(TRIM(CONCATENATE(Q38,R38,S38,T38,U38,V38,W38,X38,Y38)),1)
Run Code Online (Sandbox Code Playgroud)