如何解决Excel VBA:先排序,然后复制并粘贴
| 所有,我需要编写一个执行以下操作的宏: 在将数据输入到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
解决方法
关于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的“ 2”方法不返回索引,以便在排序后找到您的条目。您必须自己创建一个索引/“序列号”,并在排序后进行搜索。这有效:
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,-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
如果您所有的条目都是唯一的(即没有重复项),则不一定要建立索引;您原则上可以只搜索条目本身。但是,如果可能存在重复项,则搜索条目本身(而不是其索引)将更加混乱,并且可能会导致不良行为,除非对其进行了正确的编程。我发现只使用索引会更清洁。
,建议您保存输入的值,并在排序后搜索该值。
请注意,我们可能已将dup数据添加到E列中,因此我们还需要存储另一列的信息,直到拥有可靠的密钥为止。
因此,一旦您知道需要搜索的值,就可以找到包含您在列E中添加的数据的单元格(该数据可能在当前的任何其他行中,不仅限于最后一行),并将其用作锚定到您的其他操作。
有几种方法可以找到矩阵中的特定条目(根据需要使用Excel或纯VBA)。如果您在实施它们时遇到问题,请告诉我们。
单元格地址(在E列中)包含刚刚添加的值,您将使用offset
函数来设置相邻的值。再次,如果您在执行它时遇到问题,请告诉我们您的疑问。
希望能帮助到你 :)
Rgds
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。