Excel VBA:排序,然后复制和粘贴

时间:2011-05-24 21:48:51

标签: excel-vba vba excel

全部,我需要编写一个执行以下操作的宏:

  
      
  1. 将条目数据放入E列的最后一个空白单元格中,按E列按降序对整个工作表进行排序

  2.   
  3. 工作表排序后:

         
        

    2a上。将单元格立即复制到相邻单元格中,直接复制到首次输入数据的单元格的

      
  4.         
        

    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 个答案:

答案 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