【发布时间】:2022-01-28 23:26:56
【问题描述】:
我正在为我的情况寻找解决方案。现在我有一个包含 3 张纸的文件,其中我有 2 张纸中的数据。在第一张表“sheet1”中,我有许多行(~10k 行数据)和 10 列(A:J)的原始数据,在第二张表“sheet2”(~1k-8krows 数据)中,我有相同的 10 列像“sheet1”(A:J),数据只在“C”列。我使用的代码是:
Option Explicit
Sub CopyDuplicates()
MsgBox "Procesul a inceput. Daca nu se regasesc date in 'Sheet3', " & _
"inseamna ca datele din coloana 'C - Sheet2' nu se regasesc in 'Sheet1'"
Dim ws1 As Worksheet, ws2 As Worksheet, ws3 As Worksheet
Dim lr1 As Long, lr2 As Long, r As Long, r3 As Long
Dim ar As Variant, i As Long
Set ws1 = Sheets("Sheet1")
Set ws2 = Sheets("Sheet2")
Set ws3 = Sheets("Sheet3")
ws3.Cells.Clear
lr1 = ws1.UsedRange.Rows.Count
lr2 = ws2.UsedRange.Rows.Count
ws1.UsedRange.Interior.ColorIndex = xlNone
ws2.UsedRange.Interior.ColorIndex = xlNone
' dictionar sheet2 coloana C
Dim dict, key As String
Set dict = CreateObject("Scripting.Dictionary")
For r = 1 To lr2
key = Trim(ws2.Cells(r, "C"))
If Len(key) > 0 Then
If dict.exists(key) Then
dict(key) = dict(key) & ";" & r
Else
dict.Add key, r
End If
End If
Next
Application.ScreenUpdating = False
r3 = 1 ' Sheet3
' scaneaza datele din Sheet1 daca se regasesc in Sheet2
For r = 1 To lr1
key = Trim(ws1.Cells(r, "C"))
If dict.exists(key) Then
' functie copiere/stergere - datele regasite in urma scanarii le copiaza in Sheet3 urmand a fi sterse din Sheet1
ar = Split(dict(key), ";")
For i = LBound(ar) To UBound(ar)
ws1.Range("A" & r).Resize(1, 10).Copy ws3.Range("A" & r3) ' A:J
ws1.Range("A" & r).Rows.Delete
r3 = r3 + 1
Next
End If
Next
Application.ScreenUpdating = True
MsgBox "Proces finalizat cu succes."
End Sub
我的脚本将“sheet1”中的数据与“sheet2”中插入“C”列的数据进行比较,如果匹配,则从“sheet1”复制“sheet3”中的行,然后删除“sheet1”中匹配的行+第一行(表头)。如何从“sheet1”上的删除功能中跳过第一行(表头)?
【问题讨论】: