首页 文章

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

提问于
浏览
3

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

将条目数据放入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 回答

  • 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 方法不会返回索引,以便在排序后找到您的条目 . 您必须自己创建索引/ "serial number"并在排序后搜索它 . 这有效:

    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
    

    如果所有条目都是唯一的(即没有重复),则不一定要制作索引;你原则上可以只搜索条目本身 . 但是,如果可能存在重复,那么搜索条目本身(而不是其索引)将更加混乱,并且可能导致不必要的行为,除非它的编程恰到好处 . 我觉得使用索引要干得多 .

  • 0

    我建议您保存已输入的值并在排序后搜索此值 .

    请注意,我们可能会将重复数据添加到E列中,因此我们还需要存储其他列的信息,直到获得可靠的密钥 .

    所以,一旦你知道的值(S),你需要搜索,发现细胞包含您的E列添加(可能是在任何其他行到现在,不仅在最后一个)的数据,并把它作为一个锚定到您的其他操作 .

    有几种方法可以在矩阵中查找特定条目(使用Excel或纯VBA,如您所愿) . 如果您在实施它们时遇到问题,请告诉我们 .

    使用包含刚刚添加的值的单元格地址(在E列中),您将使用 offset 函数来设置相邻值 . 同样,如果您在实施它时遇到问题,请告诉我们您的疑问 .

    希望能帮助到你 :)

    RGDS

相关问题