以下是我正在使用的 excel 数据:
name | poss | curr | diff | weight
Adv TV | 16.0 | 0 | -16.0 | 8
Tablets | 16.0 | 0 | -16.0 | 7
CRU GA | 16.0 | 0 | -16.0 | 6
D. L. | 5.0 | 0 | -5.0 | 5
Go Phone| 15.0 | 0 | -15.0 | 4
Close | 16.0 | 0 | -16.0 | 3
Acc GP | 16.0 | 0 | -16.0 | 2
Overtime| 0.00 | -2.00 | -2.0 | 1
name
、poss
(可能)和curr
(当前)正在从电子表格中的其他单元格中提取。 diff
只是curr
减去poss
.重量是赋予每个项目的相对权重。
我想做的是:首先,按diff
升序排序。然后,按weight
降序排序。因此,例如,无论权重如何,diff
为 -16 的行将始终排序在diff
较低(我猜实际上在技术上是更高的差异)的行之上,并且具有相同diff
值的行的位置由它们的权重决定。我希望这是动态完成的,以便当确定name
、poss
或curr
的其他单元格之一发生更改时,排序会自动更改。然后我想在电子表格的单独部分中显示所有这些,尽管我确信我可以通过 VLOOKUP 和/或 INDEX 解决这个问题 - 数据的实际排序是让我发疯的原因。
此Worksheet_Change事件宏将重新处理源自 A1 的数据块,并将值传输到从 H3 开始的新块。
右键单击工作表的名称选项卡,然后选择"查看代码"。当 VBE 打开时,将其粘贴到代码表中。
Private Sub Worksheet_Change(ByVal Target As Range)
If Not Intersect(Target, Range("A:C")) Is Nothing Then
On Error GoTo bm_Safe_Exit
Application.EnableEvents = False
With Cells(1, 1).CurrentRegion
.Cells.Sort Key1:=.Columns(4), Order1:=xlAscending, _
Key2:=.Columns(5), Order2:=xlDescending, _
Key3:=.Columns(1), Order3:=xlAscending, _
Orientation:=xlTopToBottom, Header:=xlYes
Range("H3").Resize(.Rows.Count, .Columns.Count) = .Cells.Value2
End With
End If
bm_Safe_Exit:
Application.EnableEvents = True
End Sub
你对目的地有点模糊,所以我随意使用了H3。命名范围可能更好。它肯定会有助于清除任何旧条目,这是您的下一步。我无法提出如何清除旧条目的方法,因为其细节可能会根据确切位置而变化。