我需要填写的小区,其同一行中的一组列的第一个非空条目(从左至右) - 类似于合并()的SQL。
在以下例子中片
---------------------------------------
| | 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列从选择,所以我会很高兴,如果有一个简单的方法。
=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
我用了:
=IF(ISBLANK(A1),B1,A1)
这个测试,如果你想使用的第一个字段为空,然后用其他的。您可以使用“嵌套如果”当你有多个字段。
或者,如果你想比较各个细胞,你可以创建一个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)
服用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)
数组里面输入是不允许的变量。
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