
答案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 在 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,", ")