Excel-複数の値を返すためにvlookupする方法は?


18

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

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

このコンテキストで複数の値を処理する方法についてのヘルプは歓迎されます。ありがとう。

回答:


13

記載されている式アプローチ(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 /マクロアプローチがより良いソリューションになると思います。


取得した値の合計を求めている場合(順序は関係ありません)、配列でIFを使用する方が簡単=SUM(IF($B$2:$B$8="Key", $C$2:$C$8, 0))
です。– Aralox

私はこの式を試しましたが、上下にドラッグした後に得られる出力はAdamとBobのみを返します-私は何か間違っていますか?こちらのスクリーンショットをご覧くださいsnag.gy/qW7UKM.jpg
ziggy

@ziggy ctrl + shift + enterを押しましたか?
ダン

5
  1. 色が列Aに、名前が列Bにあるように列を交換し、色で並べ替えます。

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

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

  4. 望ましい結果を得るには、列Dで「TRUE」をフィルタリングします。下記参照:

ここに画像の説明を入力してください


TILでは、不格好なCONCATENATE()式の代わりに「&」演算子を使用できます。ありがとう!
bpcookson

3

数式アプローチが必要な場合は、個別のセルで結果を取得する方がはるかに簡単です。したがって、最初のテーブルが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

こちらが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
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.