vba的新功能,只是开始循环。我的下一个循环代码缺少某些内容。我有大量要审核的数据集,而宏的一部分则使用简单的if语句,如果单元格匹配,则返回true / false。当前有43列,最多可以有7万行。我目前在以下43列中分别使用以下内容:
ActiveCell.FormulaR1C1 = "=IF(RC[-2]=RC[-1],TRUE,FALSE)"
ActiveCell.AutoFill Range(ActiveCell, ActiveCell.Offset(0, -7).End(xlDown).Offset(0, 7))
我想简化代码,并希望通过下面的代码加快宏的速度。两种方法都可以,但是由于某种原因,第二种方法花费的时间更长。我已经测试过,可以立即看到这些值的填充,但是然后我只是等待了大约一分钟。有人可以告诉我为什么值输入后应用程序这么长时间思考吗?
Dim lastrow As Long
lastrow = Range("a" & Rows.Count).End(xlUp).Row
Dim i As Long
Dim x As Integer
For i = 3 To lastrow
For x = 5 To 134 Step 3
For Each cell In Cells(i, x)
If cell.Offset(0, -2).Value = cell.Offset(0, -1).Value Then
cell.Value = True
Else
cell.Value = False
End If
Next cell
Next x
Next i
答案 0 :(得分:1)
应该始终将父表包含到任何Range对象中,这种做法在代码开始变得更加复杂时会有所帮助。
迭代时使用Variant数组。您实际上在工作表和vba代码之间来回进行了数百甚至数千次旅行。每次这样做都会使代码变慢一点。
With Worksheets("Sheet1")
Dim lastrow As Long
lastrow = .Range("a" & Rows.Count).End(xlUp).Row
Dim rngArr As Variant
rngArr = .Range("C3:ED" & lastrow).Value
Dim i As Long
For i = LBound(rngArr, 1) To UBound(rngArr, 1)
Dim x As Long
For x = LBound(rngArr, 2) + 2 To UBound(rngArr, 2) Step 3
rngArr(i, x) = rngArr(i, x - 2) = rngArr(i, x - 1)
Next x
Next i
.Range("C3:ED" & lastrow).Value = rngArr
End With
答案 1 :(得分:0)
自从Scott解决了第二个变体以来,我想我会对第一个变体做些细微的更新
Sub option1()
ActiveCell.FormulaR1C1 = "=EXACT(RC[-2],RC[-1])"
ActiveCell.AutoFill Range(ActiveCell, Cells(ActiveCell.Offset(0, -1).End(xlDown).row, ActiveCell.Column))
End Sub
我将您使用的公式更改为EXACT
函数,因为这是您使用IF
重新创建的公式,并且我还调整了AutoFill
时的列偏移量,因为它们看起来很不正常