全部,我需要编写一个执行以下操作的宏:
将条目数据放入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
答案 0 :(得分:3)
关于1,2a和2b:在排序之前进行复制更直接。这样,复制的值将与其余值一起排序。
Private Sub Worksheet_Change(ByVal Target As Range)
If Not (Application.Intersect(Worksheets("Sheet1").Range("E:E"), Target) _
Is Nothing) Then
' First copy
Target.Offset(0, -1).Copy Destination:=Target.Offset(0, -4)
' Then sort
DoSort
End If
End Sub
这留下了问题(2c),了解如何在排序行之后将活动单元格移动到适当的行。据推测,您希望用户在F列中输入更多数据?
同样,最直接的解决方案是首先进行此输入,然后进行排序。这将带来额外的好处,即用户不会在输入E列和F列中的数据之间跳转输入行。在用户输入所有数据之后,排序甚至可能只发生一次。
当然,上述更多的是设计建议,而不是解决您的特定任务2c。如果在排序后移动活动单元实际上是您想要的,那么解决方案将不可避免地变得更加复杂。 Excel的Sort
方法不会返回索引,以便在排序后找到您的条目。您必须自己制作索引/“序列号”并在排序后搜索它。这有效:
Private Sub Worksheet_Change(ByVal Target As Range)
Dim newIndex As Long
If Not (Application.Intersect(Worksheets("Sheet1").Range("E:E"), Target) _
Is Nothing) Then
' Index the new entry in column B. (You can put the index elsewhere.)
newIndex = WorksheetFunction.Max(Range("B:B")) + 1
Target.Offset(0, -3).Value = newIndex
' Copy the entry.
Target.Offset(0, -1).Copy Destination:=Target.Offset(0, -4)
' Sort
DoSort
' Search for the new index after sorting. Select cell in column 6 (F).
Cells(WorksheetFunction.Match(newIndex, Range("B:B"), 0), 6).Select
End If
End Sub
如果您的所有条目都是唯一的(即没有重复),则不一定要制作索引;你原则上可以只搜索条目本身。但是,如果可以重复,那么搜索条目本身(而不是其索引)会更加混乱,并且可能会导致不必要的行为,除非它的编程恰到好处。我觉得使用索引要干得多。
答案 1 :(得分:0)
我建议您保存已输入的值,并在排序后搜索此值。
请注意,我们可能会将重复数据添加到E列中,因此我们还需要存储其他列的信息,直到获得可靠的密钥。
因此,一旦您知道需要搜索的值,找到包含您在E列中添加的数据的单元格(此时可能在任何其他行中,而不仅仅是在最后一行中)并使用它是你其他行动的锚点。
有几种方法可以在矩阵中查找特定条目(使用Excel或纯VBA,如您所愿)。如果您在实施它们时遇到问题,请告诉我们。
使用包含刚刚添加的值的单元格地址(在E列中),您将使用offset
函数来设置相邻值。同样,如果你在实施它时遇到问题,请告诉我们你的疑问。
希望有所帮助:)
RGDS