sql-Excel中是否有类似合并的函数?

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

Fabian asked 2020-08-12T01:14:16Z
6个解决方案
47 votes
=INDEX(B2:D2,MATCH(FALSE,ISBLANK(B2:D2),FALSE))

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

    A   B   C   D
1   x   x   y   z
2   y       y   
3   z           z
Howard Renollet answered 2020-08-12T01:14:23Z
10 votes

我用了:

=IF(ISBLANK(A1),B1,A1)

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

neil collins answered 2020-08-12T01:14:47Z
7 votes

或者,如果您想比较单个单元格,则可以在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)
AndyMc answered 2020-08-12T01:15:12Z
3 votes

使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)
AndyMc answered 2020-08-12T01:15:36Z
0 votes

在数组内输入不允许的变量。

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
Felipe answered 2020-08-12T01:15:56Z
0 votes

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

=LEFT(TRIM(CONCATENATE(Q38,R38,S38,T38,U38,V38,W38,X38,Y38)),1)
Aaron Rainey answered 2020-08-12T01:16:17Z
translate from https://stackoverflow.com:/questions/20103881/is-there-a-coalesce-like-function-in-excel