VBA代码 – 根据匹配条件在Excel中将单元格从一个表格复制到另一个表格

我在Excel中有两个工作表Sheet1和Sheet2。工作表1有C1,C2,C3,C4,C5两列。工作表2有C1,C2,C3列。现在我需要执行3个操作。

1.)删除Sheet1中的所有行,其中列1的值在Sheet2的列1中找不到。

2.)将Sheet 2的C2,C3的值replace为Sheet 1中C1的值与Sheet2中的C1相匹配的C2中的C1,C3中的C3(C4,C5保持不变)。

3.)将Sheet 2的C1,C2,C3数据追加到Sheet1中,Sheet1中C1的值未在Sheet1的C1中find(C4,C5将为空白)。

我可以编写操作1的VB代码。请帮我操作2和操作3。

Sub delete_selected_rows() Dim rng1 As Range, rng2 As Range, rngToDel As Range, c As Range Dim lastRow As Long With Worksheets("Sheet1") lastRow = .Cells(.Rows.Count, "A").End(xlUp).Row Set rng1 = .Range("A2:A" & lastRow) End With Set rng2 = Worksheets("Sheet2").Range("A:A") For Each c In rng1 If IsError(Application.Match(c.Value, rng2, 0)) Then 'delete incidents which are not in process If rngToDel Is Nothing Then Set rngToDel = c Else Set rngToDel = Union(rngToDel, c) End If End If Next c If Not rngToDel Is Nothing Then rngToDel.EntireRow.Delete End Sub 

首先,让我对你的第一步的解决scheme发表两点评论。

  1. 如果您从底部到顶部逐行浏览,则可以现场删除这些行。 (行索引仅在已删除行的下一行中更改)。
  2. 国际海事组织,这将是更好的使用rng2.Find而不是Applications.Match 。 范围对象的这种方法返回find匹配的单元格,如果没有匹配,则返回Nothing

现在到第2步:

在步骤1的解决scheme中使用表示法,可以使用rng2.Find(c.Value).EntireRow获取sheet2中的匹配行。 然后你可以使用它的Cells属性来获得第二和第三列。

第3步:

你已经知道从第一步如何找出一行在另一张表中没有匹配。 您只需将前三列中的值复制到sheet1的最后一行之后的行中,而不是在sheet1中匹配。 (最好保存最后一行,然后每个复制的行增加。)

上面,我给出了一个简单的解决scheme,每一步。 但是,如果你有非常大的表,这可能会有点慢。 基本上,通过这个解决scheme,您可以在每一行循环访问三行,在工作表中查询值并search另一个表中的所有行以查找匹配项。

具有更好性能的方法是使用范围的Value属性将整个范围加载到二维数组中,或者使用Value2更好。 然后,你可以做一个像合并连接一样的东西来解决你的三个问题,也就是说,你可以使用你最喜欢的n * log(n)sortingalgorithm在第一列对两个数组进行sorting,然后按升序列出这两个列表。 在逐步执行时,可以保存要删除的行,更新相应的行并追加附加的行。 要启用这个function,您应该在sorting数组的同时跟踪原始行。 最后,您将从底部到顶部标记为删除的行并删除它们。 (您不能立即删除,因为这会弄乱已删除行下的行索引。)

另一种实现你的三个步骤的方法是结合易用性和性能,通过ADODB写入SQL查询。

你的第一步看起来像这样。

 DELETE [sheet1$] WHERE [sheet1$].'header of first column' NOT IN (SELECT [sheet2$].'header of first column') 

第2步是更新声明,第3步是插入声明。