2013-01-14 21:43:56 +0000 2013-01-14 21:43:56 +0000
20
20

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

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

このコンテキストで複数の値を処理する方法にアプローチする方法についてのどのような助けは感謝されています。ありがとうございます。

回答 (4)

14
14
14
2013-01-14 22:17:56 +0000

あなたが述べたように(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))

これは配列の数式ですので、コピーしてセルに貼り付けた後、あなたは&007をヒットする必要があります。私はそれを右と下にドラッグしました。

残りの値がない場合、それはCtrl+Shift+Enterエラーを与えます、私はアップロードされた画像の例で黄色の例を与えました。

5
5
5
2013-01-15 13:35:44 +0000
  1. 色がA列に、名前がB列になるように列を入れ替えて、色でソートします。2. C2の数式(下にコピー): =IF(A2<\>A1,B2,C1 & “, ” & B2)

  2. Formula in D2 (copy it down the column): =A2<>A3

  3. D列の “TRUE "にフィルタをかけて、目的の結果を得る。下図を参照してください。

4
4
4
2015-02-23 13:45:45 +0000

これが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
3
3
3
2013-01-14 21:59:35 +0000

あなたが式のアプローチをしたい場合は、それは別のセルで結果を得るためにはるかに簡単ですので、あなたの最初のテーブルが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

=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))))と確認され、渡ってそしてコピーされたE2のこのフォーミュラを試みなさい。一致がなくなるとブランクが出てきます。

式はExcel 2007以降を想定しています - 以前のバージョンの場合、IFERRORの代わりにCOUNTIFを使用することができます。