检查两个不同的行,但同一列

我试图让Excel查看两个不同的工作表中的两个不同的行,但同一列来validation在一个单独的列中的数字的移动。 我怎样才能摆脱我拥有的当前循环,以减less加载时间? 因为到现在为止需要长时间。 此外,我知道我不应该使用循环,我用它低的希望,它会工作,一样好

Sub repeatingrows() Dim oldsheet As Worksheet Dim newsheet As Worksheet Set newsheet = Application.ActiveSheet Set oldsheet = ThisWorkbook.Worksheets(3) Set newsheet = ThisWorkbook.Worksheets(2) 'CHECK IF THE ROWS ARE SIMILAIR TO PREVIOUS SHEET Dim rrow As Integer Dim srow As Integer For rrow = 3 To 397 For srow = 3 To 397 If oldsheet.Cells(rrow, 2) = newsheet.Cells(srow, 2) Then If oldsheet.Cells(rrow, 5) = newsheet.Cells(srow, 5) Then If oldsheet.Cells(rrow, 6) = newsheet.Cells(srow, 6) Then With newsheet oldsheet.Range(oldsheet.Cells(rrow, 16), oldsheet.Cells(rrow, 19)).Copy .Range(.Cells(srow, 16), .Cells(srow, 19)).PasteSpecial xlPasteValues, xlPasteSpecialOperationAdd End With '^COPY AND PASTES THE ROW Else End If Else End If Else End If Next srow Next rrow End Sub 

摆脱物体! 访问对象成员可能非常耗时。 写入对象最差。 所以你可以caching读取和写入,并获得大的时间。 另外,避免复制/过去,使用.Value = …

 Sub repeatingrows() Dim oldsheet As Worksheet Dim newsheet As Worksheet Set newsheet = Application.ActiveSheet Set oldsheet = ThisWorkbook.Worksheets(3) Set newsheet = ThisWorkbook.Worksheets(2) Dim oldv, newv, c 'CHECK IF THE ROWS ARE SIMILAIR TO PREVIOUS SHEET Dim rrow As Integer Dim srow As Integer oldv = oldsheet.Range(oldsheet.Cells(1, 1), oldsheet.Cells(397, 19)) newv = newsheet.Range(newsheet.Cells(1, 1), newsheet.Cells(397, 19)) For rrow = 3 To 397 For srow = 3 To 397 If oldv(rrow, 2) = newv(srow, 2) And oldv(rrow, 5) = newv(srow, 5) And oldv(rrow, 6) = newv(srow, 6) Then For c = 16 To 19 'can't use range1.Value = range2.Value in VB arrays newv(srow, c) = newv(srow, c) + oldv(rrow, c) Next End If Next Next 'Finally, write results newsheet.Range(oldsheet.Cells(1, 1), oldsheet.Cells(397, 19)) = newv End Sub 

在程序开始时,您必须将数据从两个表存储到两个数组。 然后,所有的逻辑你将使用caching数组,而不是引用数千次的单元格的值(这是相当“昂贵”的操作)。