Vba 检查两个不同的行,但检查同一列
我试图让Excel在两张不同的表中查看两行,但在同一列中,验证数字在单独列中的移动。 如何摆脱当前的循环,从而缩短加载时间?因为到目前为止,它需要的时间太长了。 另外,我知道我不应该使用循环,我使用它时希望它能正常工作,就像使用循环一样Vba 检查两个不同的行,但检查同一列,vba,excel,Vba,Excel,我试图让Excel在两张不同的表中查看两行,但在同一列中,验证数字在单独列中的移动。 如何摆脱当前的循环,从而缩短加载时间?因为到目前为止,它需要的时间太长了。 另外,我知道我不应该使用循环,我使用它时希望它能正常工作,就像使用循环一样 Sub repeatingrows() Dim oldsheet As Worksheet Dim newsheet As Worksheet Set newsheet = Application.ActiveSheet Set oldsheet = Thi
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或2If
s的求值,如果前面的任何语句是False
。虽然节省了一点,但确实节省了一点。非常感谢,我正要让阵列完全不同。唯一的问题是,它说的是对象“\u工作表”的方法“Range”失败了。特别是对于newv=newsheet.Range(oldsheet.Cells(1,1),oldsheet.Cells(397,19))
是的,当我再次仔细查看它时,我刚刚看到了它。再次感谢:)