同じルックアップ値(主キー)で複数行のデータに対してExcelでVlookupを実行する


1

同じ主キーに対して複数の行がある名前に対してVlookupを実行したいのですが。

Deal ID (Primary Key) | Name
437                   | Tom Jones
437                   | Frank Thomas
437                   | Mary Smith

Vlookupはレコードの最初の名前のみを返します(Tom Jones)。私にしてもらいたいのは、これです:Tom Jones、Frank Thomas、Mary Smith。

回答:


1

あなたがリレーショナルデータベースとしてExcelを使用しようとしているように見えます。最後に、最近変更がない限り(Excel 2010より後のものを使用するのが嬉しいことではありません)、範囲または配列を区切り文字列に変換するワークシート関数はありません。それを行うVBAワークシート関数を考え出す必要があります。

あなたはあなたが望むことをするために配列式とVBAの組み合わせを使うことができます。先に進む前に、このようなことを定期的に行っているのであれば、実際のデータベースプログラムを使用することを強くお勧めします。私はこれまで、単純なリレーショナルデータベースのようなタスクを実行するためにExcelを悪用してきましたが、単純なものだけです。もっと複雑なことをしなければならないとしたら、それは非常に苦痛でした。

検索するIDがセル内にあるとします F1 そしてあなたのテーブルが呼び出されます Table1として、次のように入力します。 配列式 (enterの代わりにcontrol-shift-enterを使ってください)。 SimpleCat VBA連結ワークシート関数です。

=SimpleCat(IF(Table1[Deal ID (Primary Key)]=$F$1, Table1[Name], ""))

A SimpleCat この特定のインスタンスで機能するのは以下のとおりです。

Function SimpleCat(Args() As Variant) As Variant
    Dim a As Variant
    SimpleCat = ""
    For Each a In Args
        If a <> "" Then SimpleCat = SimpleCat & a & ", "
    Next
    If Len(SimpleCat) > 0 Then SimpleCat = Left$(SimpleCat, Len(SimpleCat) - 2)
End Function

私はあなたが拡大するための練習としてそれを残します SimpleCat より一般的なものにするには、よりフル機能の汎用連結関数を持つことが誰のツールボックスにも役立つからです。

説明:

配列式として評価した場合、テーブル列全体を単一の値と比較すると TRUEFALSE s。を使う IF あなたが使用している配列の正しい位置から値を引いて新しい配列を構築します。 IFそして、もしあなたが使っている空の文字列をfalseの場合はその値に埋めます。 IF。の SimpleCat functionは、この新しい配列内のすべての空でない値を、それらの間のコンマと共に入れます。


0

2つの問題まず、これは主キーではありません。第二に、あなたがあなたが期待している結果をあなたに与えることになるであろうExcelの組み込み機能性がありません。

主キーは、単一のレコードに関連付けられた一意の識別子である必要があります。これが、ExcelのほとんどのLookup関数が動作するように設計されているためです。これは、一致が見つかったときにそれらが停止する理由です。

ここで探している種類の統合を実行する唯一の方法は、複数の値を単一の文字列に引き込むことです。マクロまたはカスタム関数を使用することです。まさにあなたが必要とするコードはあなたが後にしている正確な結果に依存するでしょう、そしてこの答えの範囲外です、私は恐れています。


0

私はこの機能を取ります...

Function ConcatRange(inputRange As Range, Optional delimiter As String) As String
    Dim oneCell As Range
    Dim usedRange As Range

    Set usedRange = Application.Intersect(inputRange.Parent.usedRange, inputRange.Cells)
    If Not (usedRange Is Nothing) Then
        For Each oneCell In usedRange
            If oneCell.Text <> vbNullString Then
                ConcatRange = ConcatRange & delimiter & Trim(oneCell.Text)
            End If
        Next oneCell
        ConcatRange = Mid(ConcatRange, Len(delimiter) + 1)
    End If
End Function

そしてそれを修正して、次のような新しい機能を作成します。

Function ConcatIf(KeyRange as Range, KeyValue as Variant, DataColumnOffset As Integer)

KeyRange内の各セルをループ処理し、その値がKeyValueと等しい場合に限り、の値を連結します。 oneCell.Offset(0, DataColumnOffset)

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