Мне было интересно, может ли кто-нибудь помочь мне расширить следующий код для работы с 6 столбцами. Это уже работает довольно хорошо для любого количества строк. Как добавить ту же конструкцию для столбцов? Имя пользователя: assylias создал этот код, и я пытаюсь адаптировать его для своих потребностей сортировки.
Проблема:
Мне нужно отсортировать что-то вроде этого
X A 3
X B 7
X C 2
X D 4
Y E 8
Y A 9
Y B 11
Y F 2
Его нужно отсортировать следующим образом: Столбец, где X и Y представляют группы. Буквы: A, B, C, D, E, F обозначают членов группы. Числа - это некоторая метрика, по которой мы сравниваем их. Наибольшее число и связанный с ним участник, который получил это число, является «лидером» этой группы, и я хочу отсортировать данные таким образом, чтобы каждый руководитель каждой группы сравнивался с каждым членом этой группы следующим образом:
X B A 3
X B C 2
X B D 4
Y B E 8
Y B A 9
Y B F 2
Объяснение: Б оказывается лидером обеих групп. Мне нужно сравнить его со всеми другими членами и справа от их ячейки, иметь столбец, показывающий число, которое они заработали.
Проблема: в коде Ассилии я сейчас пытаюсь расширить его до своего набора данных. В моем наборе данных есть 6 столбцов, поэтому есть множество качественных столбцов для описания каждого члена (например, State, ID # и т. Д.), И мне нужна помощь в расширении кода, чтобы охватить это. Также, если это возможно, объяснения некоторых шагов (возможно, в форме комментариев) позволили бы мне лучше соединить точки лучше. (В основном, я не понимаю, что такое dict1 / dict2 и что именно они делают ... (например, dict1.exists (data (i, 1))) для меня неочевидно.
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
doIt
End Sub
Public Sub doIt()
Dim data As Variant
Dim result As Variant
Dim i As Long
Dim j As Long
Dim dict1 As Variant
Dim dict2 As Variant
Set dict1 = CreateObject("Scripting.Dictionary")
Set dict2 = CreateObject("Scripting.Dictionary")
data = Sheets("Sheet1").UsedRange
For i = LBound(data, 1) To UBound(data, 1)
If dict1.exists(data(i, 1)) Then
If dict2(data(i, 1)) < data(i, 3) Then
dict1(data(i, 1)) = data(i, 2)
dict2(data(i, 1)) = data(i, 3)
End If
Else
dict1(data(i, 1)) = data(i, 2)
dict2(data(i, 1)) = data(i, 3)
End If
Next i
ReDim result(LBound(data, 1) To UBound(data, 1) - dict1.Count, 1 To 4) As Variant
j = 1
For i = LBound(data, 1) To UBound(data, 1)
If data(i, 2) <> dict1(data(i, 1)) Then
result(j, 1) = data(i, 1)
result(j, 2) = dict1(data(i, 1))
result(j, 3) = data(i, 2)
result(j, 4) = data(i, 3)
j = j + 1
End If
Next i
With Sheets("Sheet2")
.Cells(1, 5).Resize(UBound(result, 1), UBound(result, 2)) = result
End With
End Sub