2011-05-24 144 views
3

一切,我需要写一个宏,执行以下操作:Excel的VBA:排序,然后复制并粘贴

  1. 在进入数据到E列的最后一个空白单元格,排序的整个工作表通过以降序

  2. 一旦工作表排序的列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

谢谢您的帮助,@ Jean-FrançoisCorbett。请参阅下面的评论。 – 2011-05-25 14:25:08

回答

0

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

注意,我们可能会将dup数据添加到E列中,所以我们需要存储另一列的信息,直到拥有可靠的密钥。

因此,一旦知道了需要搜索的值,找到包含您在列E中添加的数据的单元格(现在可能在其他任何行中,而不仅仅是最后一行)以及将其用作其他操作的锚点。

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

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

希望它能帮助:)

RGDS

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 

建立索引不是绝对必要的,如果所有的条目是唯一的(即无重复);你原则上可以只搜索条目本身。但是,如果可以重复,那么搜索条目本身(而不是其索引)会更加混乱,并且可能会导致不必要的行为,除非它的编程正确。我发现使用索引更简洁。

+0

啊哈,用户需求差和不完整导致程序员混淆。 – 2011-05-25 14:02:49

+0

@Tiago Cardoso:谢谢。这些都是很好的答案,不幸的是我的情况不会起作用。我现在想知道我是否试图解决一个不合时宜的现有解决方案的问题。我将在一个问题“Excel:创建可排序的化合物ID”中更详细地发布我的问题。 再次感谢! – 2011-05-25 15:41:31

+0

@Steve T:这个答案是你在问题中所要求的。 – 2011-05-25 19:39:35