全部,我需要编写一个执行以下操作的宏:
将条目数据放入E列的最后一个空白单元格中,按E列按降序对整个工作表进行排序 . 一旦工作表被排序:2a . 将单元格复制到紧邻第一个输入数据的单元格左侧的相邻单元格2b . 将复制的数据粘贴到最初输入数据的同一行的第一列2c中 . 将光标移动到第一个输入数据的单元格右侧的相邻单元格
下面,我展示入门代码的排序,它的工作原理 . 但是,我无法让代码复制,粘贴和移动正确 . 我最常见的问题:数据输入后,行会移动,但光标会停留在首次输入数据的行中 . 有人可以帮忙吗? (我甚至无法在这篇文章中获得缩进权!)
Private Sub Worksheet_Change(ByVal Target As Range)
If Not (Application.Intersect(Worksheets("Sheet1").Range("E:E"), Target) Is Nothing) Then
DoSort
End If
End Sub
Private Sub DoSort()
Worksheets("Sheet1").Range("A:E").Sort Key1:=Worksheets("Sheet1").Range("E1"), Order1:=xlDescending, Header:=xlYes
End Sub
2 回答
关于1,2a和2b:在排序之前进行复制更直接 . 这样,复制的值将与其余值一起排序 .
这留下了关于如何在排序行之后将活动单元格移动到适当行的问题(2c) . 据推测,您希望用户在F列中输入更多数据?
同样,最直接的解决方案是首先进行此输入,然后进行排序 . 这将带来额外的好处,即用户不会在输入E列和F列中的数据之间跳转输入行 . 在用户输入所有数据之后,排序甚至可能只发生一次 .
当然,上述更多的是设计建议,而不是解决您的特定任务2c . 如果在排序后移动活动单元实际上是您想要的,那么解决方案将不可避免地变得更加复杂 . Excel的
Sort
方法不会返回索引,以便在排序后找到您的条目 . 您必须自己创建索引/ "serial number"并在排序后搜索它 . 这有效:如果所有条目都是唯一的(即没有重复),则不一定要制作索引;你原则上可以只搜索条目本身 . 但是,如果可能存在重复,那么搜索条目本身(而不是其索引)将更加混乱,并且可能导致不必要的行为,除非它的编程恰到好处 . 我觉得使用索引要干得多 .
我建议您保存已输入的值并在排序后搜索此值 .
请注意,我们可能会将重复数据添加到E列中,因此我们还需要存储其他列的信息,直到获得可靠的密钥 .
所以,一旦你知道的值(S),你需要搜索,发现细胞包含您的E列添加(可能是在任何其他行到现在,不仅在最后一个)的数据,并把它作为一个锚定到您的其他操作 .
有几种方法可以在矩阵中查找特定条目(使用Excel或纯VBA,如您所愿) . 如果您在实施它们时遇到问题,请告诉我们 .
使用包含刚刚添加的值的单元格地址(在E列中),您将使用
offset
函数来设置相邻值 . 同样,如果您在实施它时遇到问题,请告诉我们您的疑问 .希望能帮助到你 :)
RGDS