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

时间:2017-07-17 12:25:59

标签: excel vba excel-vba

我正在尝试让Excel查看两个不同工作表中的两个不同的行,但是使用相同的列来验证数字在单独列中的移动。 如何摆脱现有的循环,以减少加载时间?因为到目前为止,太长。 另外,我知道我不应该使用循环,我用它的希望很低,它会起作用,就像一样好

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

2 个答案:

答案 0 :(得分:1)

摆脱对象! 访问对象成员可能非常耗时。写对象最差。因此,您可以缓存读写,并获得大量时间。另外,避免复制/过去,使用.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

答案 1 :(得分:0)

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