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

Vba 检查两个不同的行,但检查同一列,vba,excel,Vba,Excel,我试图让Excel在两张不同的表中查看两行,但在同一列中,验证数字在单独列中的移动。 如何摆脱当前的循环,从而缩短加载时间?因为到目前为止,它需要的时间太长了。 另外,我知道我不应该使用循环,我使用它时希望它能正常工作,就像使用循环一样 Sub repeatingrows() Dim oldsheet As Worksheet Dim newsheet As Worksheet Set newsheet = Application.ActiveSheet Set oldsheet = Thi

我试图让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

在程序开始时,必须将数据从两张图纸存储到两个阵列。然后使用缓存数组执行所有逻辑,而不是数千次引用单元格的值(这是一个相当“昂贵”的操作)。

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

使用
工作表函数。匹配
或数组进行比较。不用嵌套的
if
,你可以使用
运算符将所有语句组合成一个。@Nathan_Sav是这样的,而不是循环和ifs,或者只是if?@MichałTurczyn不是很大的优化,而是和运算符vba@MichałTurczyn,除了VBA不提供快捷方式和计算。将所有
If
语句组合成一个大语句,每次都会强制对所有3个条件进行评估。将它们作为单独的语句允许代码跳过对1或2
If
s的求值,如果前面的任何语句是
False
。虽然节省了一点,但确实节省了一点。非常感谢,我正要让阵列完全不同。唯一的问题是,它说的是对象“\u工作表”的方法“Range”失败了。特别是对于
newv=newsheet.Range(oldsheet.Cells(1,1),oldsheet.Cells(397,19))
是的,当我再次仔细查看它时,我刚刚看到了它。再次感谢:)