
답변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 & ","
다시피 일치하는 항목이 있으면 목록에 연결됩니다.
위의 방법은 다음과 같습니다.
- 데이터 순환
- 항목이 이미 출력에 존재합니까? 그렇지 않은 경우 표시하지 마십시오(중복이 발생하지 않음).
- 당신이 살고 있는 주소를 가진 모든 이름을 수집하세요
- 출력 결과
답변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,", ")