테이블에서 Excel 행 조인

테이블에서 Excel 행 조인

Excel에서 다음과 같은 표를 만드는 것이 가능합니까?

여기에 이미지 설명을 입력하세요

그리고 다음과 같이 하십시오:

여기에 이미지 설명을 입력하세요

따라서 테이블에 동일한 주소를 가진 사람이 두 명 이상 있는 경우 한 셀에는 모든 이름을 쓰고 다른 셀에는 공통 주소를 쓰는 행을 결합하고 싶습니다.

답변1

VBA에서 이 작업을 수행하는 의사 코드: (실제 코드를 실행할 수 있습니다) 이는 답변 내에만 작성되었으므로 빈칸을 채워야 하지만 각 주소를 순환하고 해당 주소와 일치하는 열이 있는 이름을 수집하는 일반적인 아이디어를 얻을 수 있기를 바랍니다.

dim address_on as string 'current address
dim names as string 'concatenate list of names
dim in_list_already as boolean

    For address_row = 1 to range().end(xldown).row
    'loop through addresses
        address_on = Range("Column" & address_row).value
        names = ""

        'First check if address_on is already in destination list?
        in_list_already = false
        for check_row = 1 to range("Destination").end(xldown).row
            If range("Destination Col" & check_row).value = address_on then
                in_list_already = true
                Exit for
            End if
        next

        if in_list_already = false then
            'Find all names that have this address
            for name_row = 1 to range().end(xldown).row
                If range("Address Column" & name_row).value = address_on then
                    names = names  & Range("Name Column" & name_row).value & ","
                End if
            next

            'remove last comma
            names = names.remove(Len(names)-1,1)

            'add to list
            Range("Column to insert to 1" & next_slot).value = names
            Range("Column to insert to 2" & next_slot).value = address_on 

        End if 

next

보시 names = names & Range("Name Column" & name_row).value & ","다시피 일치하는 항목이 있으면 목록에 연결됩니다.

위의 방법은 다음과 같습니다.

  1. 데이터 순환
  2. 항목이 이미 출력에 존재합니까? 그렇지 않은 경우 표시하지 마십시오(중복이 발생하지 않음).
  3. 당신이 살고 있는 주소를 가진 모든 이름을 수집하세요
  4. 출력 결과

답변2

질문에서와 같이 레코드가 집계된 경우 수식을 사용하면 간단합니다(일치하는 주소가 함께 있지 않으면 더 복잡합니다).

여기에 이미지 설명을 입력하세요

메소드를 표시하기 위해 열 숨기기를 해제합니다.

여기에 이미지 설명을 입력하세요

이름용과 필터링용으로 하나씩 두 개의 도우미 열을 만들었습니다. 질문에서 원하는 순서를 일치시키기 위해 왼쪽에 이름 도우미 열을 삽입했습니다. A2의 공식:

=IF(C2=C1,A1& ", " &B2,B2)

내 열 C는 주소 열입니다. 현재 행의 주소가 이전 행의 주소와 일치하는지 확인합니다. 그렇지 않은 경우 이는 새 주소임을 의미하며 관련 이름이 삽입됩니다. 이전 주소와 동일한 주소인 경우 쉼표와 행 이름을 이전 행의 결과에 연결합니다(따라서 일치하는 주소는 얼마든지 있을 수 있습니다).

도우미 열 D는 행의 주소가 해당 주소의 마지막 주소인지(즉, 다음 행의 주소가 다른지) 확인합니다. D2의 공식:

=C2<>C3

열 아래에 수식을 채운 후 메뉴에서 D1 및 자동 필터를 클릭합니다. D1 풀다운에서 FALSE를 선택 취소합니다. 그러면 각 주소의 마지막 행이 아닌 모든 행이 숨겨집니다.

영구적인 "깨끗한" 목록을 원한다면 원하는 필터링된 열을 복사하여 새 위치에 붙여넣으세요. 아래의 F 및 G 열과 같이 보이는 항목만 복사됩니다.

여기에 이미지 설명을 입력하세요

필터가 켜져 있는 동안 붙여넣을 수 있지만, 행이 숨겨진 범위에 붙여넣으면 필터를 끌 때까지 일부 결과가 숨겨집니다.

답변3

문제를 해결할 수 있는 UDF(사용자 정의 함수) 하나를 제안하고 싶습니다.

여기에 이미지 설명을 입력하세요

작동 방식:

  • Source Data in Range 라고 가정합니다 A2:B8.
  • 이 배열(CSE) 수식을 에 입력하고 E2다음으로 마무리합니다.Ctrl+Shift+Enter& 작성하세요.

    {=INDEX($B$2:$B$8, MATCH(SMALL(IF(COUNTIF($E$1:E1, $B$2:$B$8)=0, COUNTIF($B$2:$B$8, "<"&$B$2:$B$8), " "), 1), COUNTIF($B$2:$B$8, "<"&$B$2:$B$8), 0))}
    
  • 복사그리고반죽아래 코드는 다음과 같습니다. 기준 치수.

    Function ExtractinOneCell(LookupValue As String, LookupRange As Range, ColumnNumber As Integer, Char As String)
    
    Dim I As Long
    
    Dim xRet As String
    For I = 1 To LookupRange.Columns(2).Cells.Count
    
        If LookupRange.Cells(I, 2) = LookupValue Then
            If xRet = "" Then
                xRet = LookupRange.Cells(I, ColumnNumber) & Char
            Else
                xRet = xRet & "" & LookupRange.Cells(I, ColumnNumber) & Char
            End If
        End If
    
    Next
    
    ExtractinOneCell = Left(xRet, Len(xRet) - 2)
    
    End Function
    
  • 이 수식을 입력 D2하고 작성하세요.

    =ExtractinOneCell(E2,$A$2:$B$8,1,", ")
    

관련 정보