Есть ли функция, подобная coalesce, в Excel?
мне нужно заполнить ячейку первой непустой записью в наборе столбцов (слева направо) в той же строке - аналогично coalesce () в SQL.
в следующем примере sheet
---------------------------------------
| | 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 столбцов для выбора, поэтому я был бы счастлив, если бы был более простой способ.
4 ответов
=INDEX(B2:D2,MATCH(FALSE,ISBLANK(B2:D2),FALSE))
Это формула массива. После ввода формулы нажмите CTRL + Shift + Enter чтобы Excel оценил его как формулу массива. Это возвращает первое значение nonblank заданного диапазона ячеек. Для вашего примера формула будет введена в столбец с заголовком "a"
A B C D
1 x x y z
2 y y
3 z z
или если вы хотите сравнить отдельные ячейки, вы можете создать функцию, объединить в VBA:
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