Этот модуль VBA должен решить вашу проблему. Просто скопируйте код в новый модуль, объявите столбцы ввода и вывода и номер первой строки вашего списка. Обратите внимание, что код остановится, как только попадет в строку, где ячейка «Уникальный идентификатор» пуста. Кроме того, он требует, чтобы ваш список был отсортирован по вашему «уникальному идентификатору». Если уникальный идентификатор появляется только один раз, он все равно будет записан в список вывода, но только один раз, а outColNation2 останется пустым в этой строке. Если это нежелательно и его следует полностью исключить, просто удалите закомментированный оператор if.
Пример изображения вывода
Также обратите внимание, что уникальный идентификаторможет повторить не более 100 раз. Я предполагаю, что ни один из них не появляется так часто, поскольку это создаст смехотворно длинный список вывода.
Option Compare Text
Sub COMBINATIONS()
Dim i As Long, j As Long, k As Long, l As Long, n As Long
Dim arr(100) As String
Dim UI As String
Dim inColUI As Integer, inColNation As Integer
Dim outColUI As Integer, outColNation1 As Integer, outColNation2 As Integer
Dim FirstRowOfData As Integer
Dim YourWS As Worksheet
inColUI = 1 'Column of the "Unique Identifier"
inColNation = 2 'Column of the "Nations" in your example
outColUI = 4
outColNation1 = 5 'output columns
outColNation2 = 6
FirstRowOfData = 2 'First Row of data
Set YourWS = Application.Worksheets("Sheet1") 'Put in your Worksheet Name here.
i = FirstRowOfData
n = FirstRowOfData
With YourWS
Do Until .Cells(i, inColUI) = ""
j = 0
UI = .Cells(i, inColUI)
Do Until .Cells(i - 1, inColUI) <> .Cells(i, inColUI) And j > 0 Or .Cells(i, inColUI) = ""
arr(j + 1) = .Cells(i, inColNation)
i = i + 1
j = j + 1
Loop
If j = 1 Then '<- remove this if-statement and the following marked lines if single appearing UIs should be omitted entirely
.Cells(n, outColUI) = UI '<---
.Cells(n, outColNation1) = arr(1) '<---
n = n + 1 '<---
Else '<---
For k = 1 To j
For l = 1 To j
If arr(k) <> arr(l) Then
.Cells(n, outColUI) = UI
.Cells(n, outColNation1) = arr(k)
.Cells(n, outColNation2) = arr(l)
n = n + 1
End If
Next l
Next k
End If '<---
Loop
End With
End Sub
Редактировать: немного очистить код