簡體   English   中英

VBA代碼 - 根據匹配條件將單元格中的單元格復制到Excel中的另一個工作表

[英]VBA Code - Copying cells from one sheet to another sheet in excel depending on matching condition

我在Excel中有兩張Sheet1和Sheet2 .Sheet 1有C1,C2,C3,C4,C5列。表2有C1,C2,C3列。現在我必須執行3次操作。

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

2.)將表2的C2,C3的值替換為表1的C2,C3(C4,C5保持不變),其中表1的C1的值與Sheet2的C1匹配。

3.)將表2的C1,C2,C3數據附加到表1中,其中表1中C1的值未在Sheet1的C1中找到(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

首先,讓我就第1步的解決方案發表兩點評論。

  1. 如果您從底部到頂部逐行顯示行,則可以刪除現場的行。 (行索引僅對已刪除行下的行進行更改。)
  2. IMO,最好使用rng2.Find而不是Applications.Match 范圍對象的此方法返回找到匹配項的單元格,如果沒有匹配則返回Nothing

現在到第2步:

使用步驟1的解決方案中的表示法,您可以使用rng2.Find(c.Value).EntireRow獲取sheet2中匹配的行。 然后,您可以使用其Cells屬性來獲取第二列和第三列。

第3步:

您已從步驟1中了解如何找出另一個工作表中沒有匹配的行。 您只需將前三列中的值復制到sheet1的最后一行之后的行中,而不是sheet1中的匹配項。 (最好保存最后一行,然后隨每個復制的行遞增。)

上面,我給出了每個步驟的簡單解決方案。 但是,如果您有非常大的表,這可能會有點慢。 基本上,使用此解決方案,您將循環遍歷行三次,每行,查詢工作表中的值並搜索另一個表中的所有行以進行匹配。

具有更好性能的方法是使用范圍的Value屬性或更好的Value2將整個范圍加載到二維數組中。 然后你可以做類似於合並連接的東西來解決你的三個問題,即你可以使用你最喜歡的n * log(n)排序算法按第一列對兩個數組進行排序,然后按升序逐步瀏覽這兩個列表。 單步執行時,可以保存要刪除的行,更新相應的行,並追加其他行。 要啟用此功能,您應該在排序數組時跟蹤原始行。 最后,您將從下到上遍歷標記為刪除的行並刪除它們。 (你不能馬上刪除,因為這會弄亂已刪除行下面的行的行索引。)

實現三個步驟的另一種方法是結合易用性和性能,是通過ADODB針對您的工作表編寫SQL查詢。

你的第一步看起來像這樣。

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

第2步是更新語句,第3步是insert into語句。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM