동일한 조회 값(기본 키)을 가진 여러 줄의 데이터에 대해 Excel에서 Vlookup을 수행합니다.

동일한 조회 값(기본 키)을 가진 여러 줄의 데이터에 대해 Excel에서 Vlookup을 수행합니다.

동일한 기본 키에 대해 여러 줄이 있는 이름에 대한 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 대신 Ctrl-Shift-Enter를 사용하십시오). SimpleCatVBA 연결 워크시트 기능입니다.

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

SimpleCat이 특정 인스턴스에 작동하는 A는 다음과 같습니다.

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배열 수식으로 평가할 때 전체 테이블 열을 단일 값과 비교하면 s와 s 의 배열이 생성됩니다 FALSE. 를 사용하면 IF의 true 쪽인 경우 사용 중인 배열의 올바른 위치에서 값을 가져오고, IF의 false 쪽인 경우 값에 사용 중인 빈 문자열을 채우는 방식 으로 새 배열이 생성됩니다 IF. 이 SimpleCat함수는 비어 있지 않은 모든 값을 이 새 배열에 쉼표와 함께 넣습니다.

답변2

두 가지 문제. 첫째, 이는 기본 키가 아닙니다. 둘째, Excel에는 원하는 결과를 제공하는 기본 제공 기능이 없습니다.

기본 키는 단일 레코드에 연결되고 절대 반복되지 않는 고유 식별자여야 합니다. 이것이 바로 Excel의 조회 기능 대부분이 작동하도록 설계된 기능입니다. 따라서 일치 항목을 찾으면 중지됩니다. 일치 항목이 이미 발견된 경우 매번 전체 범위를 살펴볼 필요가 없으므로 리소스가 절약됩니다.

여러 값을 단일 문자열로 가져오는 등 여기에서 찾고 있는 종류의 통합을 수행할 수 있는 유일한 방법은 매크로나 사용자 정의 함수를 사용하는 것입니다. 정확히 어떤 코드가 필요한지는 원하는 정확한 결과에 따라 달라지며 이 답변의 범위를 벗어납니다.

답변3

이 기능을 사용하겠습니다...

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)

관련 정보