我正在尝试让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
答案 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)
在程序开始时,您必须将数据从两个表存储到两个数组。然后你将使用缓存数组执行所有逻辑,而不是数千次引用单元格的值(这非常"昂贵"操作)。