web-dev-qa-db-ja.com

Excel - 複数の値を返すようにvlookupする方法

特定のキーに対して複数の参照値を検索して返すために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

(私はすでに左側にキー値があります - それらの値を引き出す必要はありません)

この文脈で複数の値を処理する方法については、どのような手助けでも評価されます。ありがとう。

18
overflew

(VLOOKUPを使用せずに、まだ式を使用して)前述のように式アプローチが必要であると仮定して、私がデータをレイアウトした方法は次のとおりです。

Data Layout

セル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 /マクロのアプローチがより良い解決策になると思います。

12
Dan
  1. 色が列Aに、名前が列Bになるように列を入れ替えてから、色で並べ替えます。

  2. C2の式(列の下にコピー):= IF(A2 <A1、B2、C1& "、"&B2)

  3. D2の式(列の下にコピー):= A2 <> A3

  4. 望ましい結果を得るために、列Dで "TRUE"をフィルターに掛けます。下記参照:

enter image description here

5
F106dart

これがあなたのためのVBAソリューションです。まず、結果は次のようになります。

Screenshot

そしてこれがそのコードです。

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
3
Engineer Toast

数式アプローチが必要な場合は、別々のセルに結果を表示する方がはるかに簡単なので、最初のテーブルが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))))

3
barry houdini