同じ行の列のセット(左から右へ)の最初の空でないエントリをセルに入力する必要があります-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の列から選択できるので、もっと簡単な方法があれば幸いです。
=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)
これは、使用する最初のフィールドが空白かどうかをテストし、もう一方を使用します。複数のフィールドがある場合、「ネストされたif」を使用できます。
または、個々のセルを比較する場合は、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