回答:
あなたがリレーショナルデータベースとして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 より一般的なものにするには、よりフル機能の汎用連結関数を持つことが誰のツールボックスにも役立つからです。
説明:
配列式として評価した場合、テーブル列全体を単一の値と比較すると TRUE 砂 FALSE s。を使う IF あなたが使用している配列の正しい位置から値を引いて新しい配列を構築します。 IFそして、もしあなたが使っている空の文字列をfalseの場合はその値に埋めます。 IF。の SimpleCat functionは、この新しい配列内のすべての空でない値を、それらの間のコンマと共に入れます。
2つの問題まず、これは主キーではありません。第二に、あなたがあなたが期待している結果をあなたに与えることになるであろうExcelの組み込み機能性がありません。
主キーは、単一のレコードに関連付けられた一意の識別子である必要があります。これが、ExcelのほとんどのLookup関数が動作するように設計されているためです。これは、一致が見つかったときにそれらが停止する理由です。
ここで探している種類の統合を実行する唯一の方法は、複数の値を単一の文字列に引き込むことです。マクロまたはカスタム関数を使用することです。まさにあなたが必要とするコードはあなたが後にしている正確な結果に依存するでしょう、そしてこの答えの範囲外です、私は恐れています。
私はこの機能を取ります...
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)