【问题标题】:Excel/VBA removing duplicate rows from multiple sheetsExcel/VBA 从多个工作表中删除重复行
【发布时间】:2018-10-04 21:22:18
【问题描述】:

目前,我从我们的一个数据库中收到每月转储,其中包含我们所有有效的公共交通订阅。将这些上传到 SAP 是我的任务,但只有与上个月不同的值。因此,应该选择所有新订阅,以及与上个月相比,不同列之一中的值之一不同的所有订阅。如果行完全一样,我就不需要了。

我收到的文件包含 7 列,A 列包含每个员工的唯一键。

我想使用 VBA 比较两个 excel 文件,方法是将上个月的文件粘贴到 Sheet1,将本月的文件粘贴到 Sheet2。我想找到那些相等的行并将它们从Sheet2 中删除。

我已经找到了一些执行此操作的 VBA 代码示例,但似乎没有任何工作正常。下面这个是我用的最后一个,下面这行代码Do While Not IsEmpty(wsA.Range(keyColA & intRowCounterA).Value)出现语法错误。

Sub CleanDupes()
Dim wsA As Worksheet
Dim wsB As Worksheet
Dim keyColA As String
Dim keyColB As String
Dim rngA As Range
Dim rngB As Range
Dim intRowCounterA As Integer
Dim intRowCounterB As Integer
Dim strValueA As String


keyColA = "A"
keyColB = "B"

intRowCounterA = 1
intRowCounterB = 1

Set wsA = Worksheets("Sheet1")
Set wsB = Worksheets("Sheet2")

Do While Not IsEmpty(wsA.Range(keyColA & intRowCounterA).Value)
    intRowCounterB = 1
    Set rngA = wsA.Range(keyColA & intRowCounterA)
    strValueA = rngA.Value
    Do While Not IsEmpty(wsB.Range(keyColB & intRowCounterB).Value
        Set rngB = wsB.Range(keyColB & intRowCounterB)
        If strValueA = rngB.Value Then
             'Code to delete row goes here, but I'm not sure exactly'
             'what it is.'
             wsB.Range(Rows(intRowCounterB)).EntireRow.Delete
             intRowCounterB = intRowCounterB - 1
        End If
        intRowCounterB = intRowCounterB + 1
    Loop
    intRowCounterA = intRowCounterA + 1
Loop

结束子

有什么想法吗?

尼克

【问题讨论】:

  • 如果您尝试了不起作用的代码,您应该将它包含在您的帖子中,并准确解释它是如何不起作用的。
  • 抱歉,对 VBA 和本网站来说还是很陌生。我更新了我原来的问题。

标签: vba excel duplicates


【解决方案1】:

下面的代码在Sheet2 中查找来自Sheet1 的重复行。它将Sheet1.Row(id) 连接中的所有行值与Sheet2.Row(id) 连接中的所有行值进行比较

最后,它将重复项移动到名称模式为"Sheet2 Dupes - yyyymmdd-hhmmss"(当前日期时间)的新工作表

Public Sub RemoveDuplicateRows()
    Dim ur1 As Range, ur2 As Range, dupeRows As Range
    Dim r1 As Range, s1 As String, r2 As Range, s2 As String

    Set ur1 = Worksheets("Sheet1").UsedRange.Rows
    Set ur2 = Worksheets("Sheet2").UsedRange.Rows  'Find duplicates from Sheet1 in Sheet2

    Set dupeRows = ur2(Worksheets("Sheet2").UsedRange.Rows.Count + 1)
    For Each r1 In ur1
        s1 = Join(Application.Transpose(Application.Transpose(r1)))
        For Each r2 In ur2
            s2 = Join(Application.Transpose(Application.Transpose(r2)))
            If s1 = s2 Then
                If Intersect(dupeRows, r2) Is Nothing Then
                    Set dupeRows = Union(dupeRows, r2)
                End If
            End If
        Next
    Next

    Dim wb As Workbook, wsDupes As Worksheet    'Move duplicate rows to new Sheet
    Application.ScreenUpdating = False
    Set wb = ThisWorkbook
    Set wsDupes = wb.Worksheets.Add(After:=wb.Worksheets(wb.Worksheets.Count))
    wsDupes.Name = "Sheet2 Dupes - " & Format(Now, "yyyymmdd-hhmmss")
    dupeRows.Copy
    With wsDupes.Cells(1)
        .PasteSpecial xlPasteAll
        .PasteSpecial xlPasteColumnWidths
        .Select
    End With
    dupeRows.EntireRow.Delete
    Application.ScreenUpdating = True
End Sub

【讨论】:

  • 您好,非常感谢您的回复!它似乎可以通过删除所有重复项来工作。您知道是否可以将差异放在新工作表中而不是在 Sheet2 中删除它们?
  • 嗨,我更新了将重复行移动到新工作表的答案
  • 您好,非常感谢您的反馈。我尝试了您提供的代码,但是没有填充新工作表,我认为我的解释不够清楚。我想保持 Sheet1 和 Sheet2 不变,并且我希望将差异写在 Sheet3 中。所以没有删除重复项,只需在 Sheet3 中写入唯一值。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-07-24
  • 1970-01-01
相关资源
最近更新 更多