【问题标题】:Comparing source sheet and Dest sheet , and copying the unmatched data in the source sheet比较源表和目标表,并复制源表中不匹配的数据
【发布时间】:2017-07-18 09:48:58
【问题描述】:

我有两张床单 Sht1 和 Sht2。

我将 sheet1 的 A 列与 sheet2 的 A 列进行比较。两张表的 A 列都包含 ID。

如果 sheet2 中有不匹配的 ID,那么我想复制 sheet1 中不匹配的行。

我尝试了下面的代码,问题是,它只是多次复制不匹配的 sheet2 最后一行,并且在没有退出的情况下继续运行。

谁能帮助我如何纠正它。

Sub trialtest()
    Dim srcLastRow As Long, destLastRow As Long
    Dim srcWS As Worksheet, destWS As Worksheet
    Dim i As Long, j As Long
    Application.ScreenUpdating = False
    Set srcWS = ThisWorkbook.Sheets("S2")
    Set destWS = ThisWorkbook.Sheets("S1")
    srcLastRow = srcWS.Cells(srcWS.Rows.Count, "A").End(xlUp).Row
    destLastRow = destWS.Cells(destWS.Rows.Count, "A").End(xlUp).Row
    For i = 5 To destLastRow
        For j = 5 To srcLastRow
            If destWS.Cells(i, "A").Value <> srcWS.Cells(j, "A").Value Then
                 destWS.Cells(i, "A") = srcWS.Cells(j, "A")
                 destWS.Cells(i, "B") = srcWS.Cells(j, "B")
                 destWS.Cells(i, "C") = srcWS.Cells(j, "C")
                 destWS.Cells(i, "D") = srcWS.Cells(j, "D")
                 destWS.Cells(i, "E") = srcWS.Cells(j, "E")
                 destWS.Cells(i, "F") = srcWS.Cells(j, "F")
                 destWS.Cells(i, "G") = srcWS.Cells(j, "G")
                 destWS.Cells(i, "H") = srcWS.Cells(j, "H")
                 destWS.Cells(i, "I") = srcWS.Cells(j, "I")
                 destWS.Cells(i, "J") = srcWS.Cells(j, "J")
                 destWS.Cells(i, "K") = srcWS.Cells(j, "K")
                 destWS.Cells(i, "L") = srcWS.Cells(j, "L")
                 destWS.Cells(i, "M") = srcWS.Cells(j, "M")
                 destWS.Cells(i, "N") = srcWS.Cells(j, "N")
                 destWS.Cells(i, "O") = srcWS.Cells(j, "O")
                 destWS.Cells(i, "P") = srcWS.Cells(j, "P")
                 destWS.Cells(i, "Q") = srcWS.Cells(j, "Q")
                 destWS.Cells(i, "R") = srcWS.Cells(j, "R")
                 destWS.Cells(i, "S") = srcWS.Cells(j, "S")
             End If
         Next j
    Next i

    Application.ScreenUpdating = True
End Sub

【问题讨论】:

  • 你想要“完整的不匹配行”是什么意思?
  • @user1 抱歉,这是一个错字。它是比较
  • 你想如何“比较”不匹配的行?为什么要比较
  • @user1 很抱歉造成混乱。我已经编辑了这个问题,我希望现在很清楚

标签: vba excel


【解决方案1】:

我知道您已经接受了答案,但是我只想与您分享这种方法:

如果我正确理解了您的问题,如果表 1 中的 ID 不等于表 2 中的 ID,那么将表 1 ID 替换为表 2 中的 ID?

Option Explicit
Dim i, n As Long

Sub IDReplace()

n = Sheets("Sheet1").Cells(Rows.Count, 1).End(xlUp).Row

With Sheets("Sheet1")
    For i = 2 To n
        If .Cells(i, 1).Value <> .Parent.Sheets("Sheet2").Cells(i, 1).Value Then
            .Cells(i, 1).Value = .Parent.Sheets("Sheet2").Cells(i, 1).Value
        End If
    Next i
End With


End Sub

基于 Sheet 1 是您关注的主要工作表这一事实,您只需计算 Sheet 1 的行数而不是 Sheet2

乐于助人:)

【讨论】:

  • 好吧,我猜你没有正确理解这个问题。您要做的是将Sheet1.A2Sheet2.A2 进行比较,然后将Sheet1.A3Sheet2.A3 进行比较,依此类推,如果不相等则替换值。但是 OP 想要匹配 Sheet1.A2Sheet2.A2 - Sheet2.A(lastrow)
【解决方案2】:

试试这个代码

Sub trialtest()
    Dim srcLastRow As Long, destLastRow As Long, rowIndex As Long
    Dim srcWS As Worksheet, destWS As Worksheet
    Dim i As Long, j As Long
    Dim found As Boolean

    Application.ScreenUpdating = False

    Set srcWS = ThisWorkbook.Sheets("S2")
    Set destWS = ThisWorkbook.Sheets("S1")
    srcLastRow = srcWS.Cells(srcWS.Rows.Count, "A").End(xlUp).Row
    destLastRow = destWS.Cells(destWS.Rows.Count, "A").End(xlUp).Row
    rowIndex = destLastRow
    found = False
    For i = 5 To srcLastRow
        For j = 5 To destLastRow
            'Debug.Print srcWS.Cells(i, "A").Value & " : " & destWS.Cells(j, "A").Value
            If srcWS.Cells(i, "A").Value = destWS.Cells(j, "A").Value Then
                found = True
                'rowIndex = rowIndex + 1
                'destWS.Cells(rowIndex, "A") = srcWS.Cells(j, "A")
                Exit For
            End If
        Next j
        If found = False Then
            rowIndex = rowIndex + 1
            'destWS.Cells(rowIndex, "A") = srcWS.Cells(i, "A")
            destWS.Range("A" & rowIndex & ":S" & rowIndex).Value = srcWS.Range("A" & i & ":S" & i).Value
        End If
        found = False
    Next i

    Application.ScreenUpdating = True
End Sub

如果有什么不清楚的地方请告诉我。

【讨论】:

    【解决方案3】:

    我会在这里使用 find 方法。使用 find 方法,您可以查看 Sheet S2 中的 ID 是否在 Sheet S1 中。

    如果它在工作表 S1 中找到 ID,则变量 c 具有 ID 值。如果在 Sheet S1 中没有找到 ID,则 c 的值为 Nothing。 然后代码将从表 S1 复制 ID 列表末尾的行。

    Sub trialtest()
    Dim srcLastRow As Long, destLastRow As Long
    Dim srcWS As Worksheet, destWS As Worksheet
    Dim i As Long, j As Long
    Application.ScreenUpdating = False
    Set srcWS = ThisWorkbook.Sheets("S2")
    Set destWS = ThisWorkbook.Sheets("S1")
    srcLastRow = srcWS.Cells(srcWS.Rows.Count, "A").End(xlUp).Row
    destLastRow = destWS.Cells(destWS.Rows.Count, "A").End(xlUp).Row
    
    
    
    With destWS.Range(Cells(5, 1), Cells(destLastRow, 1))
        For j = 5 To srcLastRow
    
            Set c = .Find(srcWS.Cells(j, "A").Value, LookIn:=xlValues)
            ' if value not in destWS copy it form srcWS
            If c Is Nothing Then
                srcWS.Range("A" & j & ":S" & j).Copy _
                Destination:=destWS.Cells(destLastRow + 1, 1)
                destLastRow = destLastRow + 1
            End If
    
        Next j
    End With
    
    Application.ScreenUpdating = True
    End Sub
    

    【讨论】:

      猜你喜欢
      • 2020-07-20
      • 2015-08-04
      • 2021-08-06
      • 1970-01-01
      • 2017-09-30
      • 1970-01-01
      • 2015-04-04
      • 2020-08-31
      • 1970-01-01
      相关资源
      最近更新 更多