特定のキーに対して複数の参照値を検索して返すためにExcelを使用したいと考えています。 VLookupは私が必要とするものと非常によく似たことをします - ただ一つのマッチを返すだけです。
私はそれが配列を返す方法と処理方法を含むだろうと思いますが、私はこれらについて以前に扱いませんでした。グーグルの中には、解決策の一部としてif([lookuparray] = [value]、row [lookuparray])に頼り始めている人もいますが、単一のマッチを返すことはできませんが...
たとえば、この参照データがあるとします。
Adam Red
Adam Green
Adam Blue
Bob Red
Bob Yellow
Bob Green
Carl Red
右側に複数の戻り値を取得しようとしています。 (可能であれば、カンマ区切り)
Red Adam, Bob, Carl
Green Adam, Bob
Blue Adam
Yellow Bob
(私はすでに左側にキー値があります - それらの値を引き出す必要はありません)
この文脈で複数の値を処理する方法については、どのような手助けでも評価されます。ありがとう。
(VLOOKUPを使用せずに、まだ式を使用して)前述のように式アプローチが必要であると仮定して、私がデータをレイアウトした方法は次のとおりです。
セルC12に次の数式を使用しました。
=INDEX($C$2:$C$8, SMALL(IF($B12=$B$2:$B$8, ROW($B$2:$B$8)-MIN(ROW($B$2:$B$8))+1, ""), 1))
これは配列式なので、コピーしてセルに貼り付けた後はCtrl+Shift+Enter
を押す必要があります。それからそれを右と下にドラッグしました。
#NUM!
エラーを返す値が残っていない場合は、アップロードされた画像の例で黄色の例を示しました。
大量の行がある場合は、VBA /マクロのアプローチがより良い解決策になると思います。
色が列Aに、名前が列Bになるように列を入れ替えてから、色で並べ替えます。
C2の式(列の下にコピー):= IF(A2 <A1、B2、C1& "、"&B2)
D2の式(列の下にコピー):= A2 <> A3
望ましい結果を得るために、列Dで "TRUE"をフィルターに掛けます。下記参照:
これがあなたのためのVBAソリューションです。まず、結果は次のようになります。
そしてこれがそのコードです。
Option Explicit
Function LookupCSVResults(lookupValue As Variant, lookupRange As Range, resultsRange As Range) As String
Dim s As String 'Results placeholder
Dim sTmp As String 'Cell value placeholder
Dim r As Long 'Row
Dim c As Long 'Column
Const strDelimiter = "|||" 'Makes InStr more robust
s = strDelimiter
For r = 1 To lookupRange.Rows.Count
For c = 1 To lookupRange.Columns.Count
If lookupRange.Cells(r, c).Value = lookupValue Then
'I know it's weird to use offset but it works even if the two ranges
'are of different sizes and it's the same way that SUMIF works
sTmp = resultsRange.Offset(r - 1, c - 1).Cells(1, 1).Value
If InStr(1, s, strDelimiter & sTmp & strDelimiter) = 0 Then
s = s & sTmp & strDelimiter
End If
End If
Next
Next
'Now make it look like CSV
s = Replace(s, strDelimiter, ",")
If Left(s, 1) = "," Then s = Mid(s, 2)
If Right(s, 1) = "," Then s = Left(s, Len(s) - 1)
LookupCSVResults = s 'Return the function
End Function
数式アプローチが必要な場合は、別々のセルに結果を表示する方がはるかに簡単なので、最初のテーブルがA2:B8で、色がD2:D5に再び表示されているとします。 E2でこの式を試してください
=IFERROR(INDEX($A$2:$A$8,SMALL(IF($B$2:$B$8=$D2,ROW($B$2:$B$8)-ROW($B$2)+1),COLUMNS($E2:E2))),"")
CTRL+SHIFT+ENTER
で確認し、上下にコピーしました。試合が尽きると空白になります。
FormulaはExcel 2007以降を想定しています - それ以前のバージョンの場合はIFERRORの代わりにCOUNTIFを使用できます。
=IF(COLUMNS($E2:E2)>COUNTIF($B$2:$B$8,$D2),"",INDEX($A$2:$A$8,SMALL(IF($B$2:$B$8=$D2,ROW($B$2:$B$8)-ROW($B$2)+1),COLUMNS($E2:E2))))