連結表中的 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 在 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,", ")
    

相關內容