Tìm mối quan hệ giữa các mục trong danh sách Excel


1

Tôi có một danh sách Excel trông như thế này:

Project  ID
ABC      Al
ABC      Bob
ABC      Chad
DEF      Bob
DEF      Dick

Tôi đang cố gắng tìm một chức năng để tôi chỉ có thể có các liên kết giữa các ID. Danh sách cuối cùng sẽ như thế này:

Al Bob
Al Chad
Bob Chad
Bob Dick

Nói cách khác, bạn có thể thấy từ đầu vào mà những người Al, Bob và Dick làm việc trong dự án ABC. Trong dữ liệu của tôi, điều đó có nghĩa là họ có mối quan hệ (tức là họ đã làm việc trên cùng một dự án). Vì vậy, tôi muốn có một dòng cho mỗi mối quan hệ.


Bạn có thể giải thích phương pháp thủ công để tạo đầu ra đó từ đầu vào đã cho không? Bảng trên của bạn có năm mục, nhưng bảng dưới cùng chỉ có bốn mục.
Jason Aller

Nếu tôi hiểu những gì bạn đang hỏi thì danh sách cuối cùng sẽ như thế nào: 1-1, 1-2, 1-3, 2-2, 2-4 có năm mục? Biến ABC và DEF thành các số nối tiếp có thể được thực hiện với một công thức sắp xếp và so sánh nếu đó là trường hợp.
Jason Aller

Không hẳn vậy. Tôi không muốn có 1-1 hoặc 2-2 vì cả hai đều đề cập đến cùng một người. Thêm vào đó, 2 và 3 đều làm việc trong dự án ABC, vì vậy họ cũng nên là một phần của danh sách.
dùng1029296

Trong cột trên cùng của bạn, cột một là tên dự án, là cột hai người?
Jason Aller

Có, Cột 1 là tên dự án, cột 2 là id người.
dùng1029296

Câu trả lời:


2

Đây là một giải pháp VBA. Bạn sẽ chỉ cần chọn hai cột dữ liệu của mình (không chọn tiêu đề) rồi chạy Partners.

Sub Partners()
Dim tmpColl As Collection, Projects As Object, v() As Variant, tmp As Variant
Dim s As Worksheet, k As Variant
Set Projects = CreateObject("scripting.dictionary")
Set tmpColl = New Collection
v = Selection.Value
'Use project as a dictionary key. Each key is paired with a collection of the IDs for that project.
For i = LBound(v, 1) To UBound(v, 1)
    If Projects.Exists(v(i, 1)) Then
        Set tmpColl = Projects.Item(v(i, 1))
        tmpColl.Add v(i, 2)
        Projects.Remove v(i, 1)
        Projects.Add v(i, 1), tmpColl
    Else
        Set tmpColl = New Collection
        tmpColl.Add v(i, 2)
        Projects.Add v(i, 1), tmpColl
    End If
Next i
'Create output sheet.
Set s = ThisWorkbook.Worksheets.Add
s.Name = "Output"
s.Range("A1") = "ID1"
s.Range("B1") = "ID2"
For Each k In Projects.Keys
    tmp = ListPairs(Projects.Item(k))
    s.UsedRange.Offset(s.UsedRange.Rows.Count, 0).Resize(UBound(tmp, 1), 2).Value = tmp
Next k
End Sub

Function ListPairs(C As Collection) As Variant
Dim v() As Variant, idx As Long
'Returns each pair combination from collection of items.
idx = 1
If C.Count > 1 Then
    ReDim v(1 To C.Count * (C.Count - 1) / 2, 1 To 2) As Variant
    For i = 1 To C.Count - 1
        For j = i + 1 To C.Count
            v(idx, 1) = C.Item(i)
            v(idx, 2) = C.Item(j)
            idx = idx + 1
        Next j
    Next i
End If
ListPairs = v
End Function

Mã này sẽ xuất các kết hợp trên một trang tính mới có tên "Đầu ra". Nếu có một bảng tên hiện có, sẽ có một lỗi. Trong trường hợp này, bạn có thể chỉnh sửa dòng

s.Name = "Output"

để thay đổi tên của bảng đầu ra.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.