【发布时间】:2012-03-14 17:13:48
【问题描述】:
我想知道是否有人可以帮助我扩展以下代码以处理 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
解释:B 恰好是两个组的领导者。我需要将他与所有其他成员进行比较,在他们单元格的右侧,有一列显示他们获得的数字。
问题:配备了 Assylias 的代码,我现在正尝试将其扩展到我的数据集。我的数据集有 6 列,因此有一堆定性列来描述每个成员(如 State、ID# 等),我需要帮助扩展代码以包含此内容。此外,如果可能的话,对某些步骤的解释(可能以 cmets 的形式)将使我能够更好地真正连接这些点。 (大多数情况下,我不明白 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
结束子
【问题讨论】:
-
我做了一些研究,发现此代码中使用的“字典”对象不支持多维性。那我们应该把它作为一个数组重新做吗?
-
这可能是一个解决方案。您可以在以下主题中找到一些灵感:stackoverflow.com/questions/4873182/… 和 stackoverflow.com/questions/152319/vba-array-sort-function