【问题标题】:compare rows differences between two workbooks比较两个工作簿之间的行差异
【发布时间】:2016-01-28 16:26:34
【问题描述】:

我在比较两个工作簿之间的行时遇到问题。我想比较两个工作簿中的行,并将主工作簿中的更新数据添加到另一个工作簿中的下一个空白行。但是,我的代码只复制所有行而不是只复制新行。

Sub test()
  Dim varSheetA As Variant
  Dim varSheetB As Variant
  Dim strRangeToCheck As String
  Dim strRangeToC As String
  Dim iRow As Long
  Dim iRow2 As Long
  Dim iCol As Long
  Dim wbkA As Workbook
  Dim eRow As Long
  Dim cfind As Range
  Dim c As Range
  Dim rng As Range
  Dim i, j, k As Integer
  Dim newarr As String
  Dim existarr As String
  Dim b As Boolean
  Set wbkA = Workbooks.Open(Filename:="C:\Users\mandy\Desktop\fortest.xlsx")
  strRangeToCheck = "A:C"
  strRangeToC = "C:E"
  varSheetA = wbkA.Worksheets("Sheet1").Range(strRangeToCheck)
  varSheetB = ThisWorkbook.Worksheets("Sheet1").Range(strRangeToC)

  For iRow = LBound(varSheetA, 1) To UBound(varSheetA, 1)
    For iRow2 = LBound(varSheetB, 1) To UBound(varSheetB, 1)
      For iCol = LBound(varSheetA, 2) To UBound(varSheetA, 2)
        If ThisWorkbook.Sheets("Sheet1").Range("C").Value = wbkA.Sheets("Sheet1").Range("A") Then
          If ThisWorkbook.Sheets("Sheet1").Range("D").Value = wbkA.Sheets("Sheet1").Range("B") Then
            If ThisWorkbook.Sheets("Sheet1").Range("E").Value = wbkA.Sheets("Sheet1").Range("C") Then
              If varSheetA(iRow, iCol).EntireRow = varSheetB(iRow, iCol).EntireRow Then
              ' Cells are identical.
              ' Do nothing
              Else
                If ThisWorkbook.Sheets("Sheet1").Range("C" & iRow2).Value = wbkA.Sheets("Sheet1").Range("A" & iRow).Value Then
                  b = False
                Else
                  If ThisWorkbook.Sheets("Sheet1").Range("D" & iRow2).Value = wbkA.Sheets("Sheet1").Range("B" & iRow).Value Then
                    b = False
                  Else
                    If ThisWorkbook.Sheets("Sheet1").Range("E" & iRow2).Value = wbkA.Sheets("Sheet1").Range("C" & iRow).Value Then
                      b = False
                    Else
                      eRow = ThisWorkbook.Worksheets("Sheet1").Cells(Rows.Count, 3).End(xlUp).Row + 1
                      ThisWorkbook.Sheets("Sheet1").Range("C" & eRow & ":E" & eRow).EntireRow = wbkA.Sheets("Sheet1").Range("A" & iRow & ":C" & iRow).EntireRow
                      Exit For
                    End If
                  End If
                End If
              End If
            End If
          End If
        End If
      Next
    Next
  Next
  wbkA.Close savechanges:=False
End Sub

enter image description here

【问题讨论】:

  • 搞笑:....Range("A")... 总是为我弹出错误:(
  • 呃,我为什么还要打开这个问题。那些级联的结束语句是 pythonista 的噩梦。一般来说,如果你能避免嵌套如此深的东西(这很可能不是这里的问题),你可能会更好地破译你的逻辑。
  • 为了方便比较,将列比较为 Join(Array(cells(row1,col1),cells(row1,col2),cells(row1,col3),"")
  • 这段代码真的编译运行了吗? varSheetA 是一个变体数组(3 个完整的列!)所以你不能调用 varSheetA(iRow, iCol).EntireRow

标签: vba excel


【解决方案1】:

你能试试这个吗:

Sub test()

    Dim WbA As Workbook
    Set WbA = ActiveWorkbook

    Dim WbB As Workbook
    Set WbB = Workbooks.Open(Filename:="C:\Users\mandy\Desktop\fortest.xlsx")

    Dim SheetA As Worksheet
    Dim SheetB As Worksheet
    SheetA = WbA.Sheets("Sheet1")
    SheetB = WbB.Sheets("Sheet1")

    Dim eRowA As Integer
    Dim eRowB As Integer
    eRowA = (SheetA.Cells(SheetA.Rows.Count, 1).End(xlUp).Row) 'Last line with data in Workbook A (ActiveWorkbook)
    eRowB = (SheetB.Cells(SheetB.Rows.Count, 1).End(xlUp).Row)  'Last line with data in Workbook B (Opened Workbook)

    Dim RowA As Integer
    Dim RowB As Integer

    For RowA = 1 To eRowA
        For RowB = 1 To eRowB
            If SheetA.Rows(RowA) = SheetB.Rows(RowB) Then
                'Do nothing
            Else
                SheetB.Rows(RowB).Copy
                SheetA.Rows(eRowA + 1).Paste
            End If
        Next RowB
    Next RowA

    WbB.Close (False)

End Sub

这没有经过测试,但我认为它应该可以工作。我会很高兴收到反馈。

【讨论】:

  • 这不是必需的,因为新数据已经检查过了,因此您不必增加 eRowA。而且我对此不太确定,但不应该增加它本身,因为它必须在每次被调用时重新计算??
  • 该值是在循环之前设置的 - 如果只复制一行没有问题,但如果多行,那么它们都会去同一个地方。
  • 嗨 Kathara,我已经尝试了代码。但是,我遇到了“If SheetA.Rows(RowA) = SheetB.Rows(RowB) Then”行的类型不匹配错误。
  • 嗯.. 好的,尝试在 (RowA) 和 (RowB) 之后添加 .Values。如果这不起作用,那么我将创建另一个循环,循环遍历一行的列并比较它们......
猜你喜欢
  • 1970-01-01
  • 2018-04-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-05-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多