我的vba用于使用变量的下一个循环代码花费的时间太长

时间:2018-08-06 19:36:21

标签: excel-vba

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

2 个答案:

答案 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时的列偏移量,因为它们看起来很不正常