如何使用范围和字符串比较减少代码的运行时间

时间:2012-11-16 19:59:08

标签: excel-vba vba excel

我有以下代码,它完全符合我的需要但是,循环运行时间太长(3分钟+)。我是VBA的新手所以我不确定1)最好的选择是什么2)如何使用适当的语法替代该代码并使我的代码运行完美无缺。谢谢!

Dim i As Integer
For i = 2 To 13000

If Sheets("Sheet1").Range(Cells(i, 3), Cells(i, 3)) = "Police" 
    And Sheets("Sheet1").Range(Cells(i, 14), Cells(i, 14)) = "Bi-wkly Uniform Pay" Then _
Sheets("Sheet1").Range(Cells(i, 3), Cells(i, 3)) = "Police - Uniform"

Next i

3 个答案:

答案 0 :(得分:1)

在循环中访问工作表非常慢。更好的方法是将数据复制到数组上的Variant数组循环中,然后将结果复制回工作表

这样的事情:

Sub Demo()
    Dim i As Long
    Dim datCol3 As Variant
    Dim datCol14 As Variant

    With Sheets("Sheet1")
        ' Copy data into a Variant Array
        datCol3 = .Range(.Cells(1, 3), .Cells(13000, 3)).Formula
        datCol14 = .Range(.Cells(1, 14), .Cells(13000, 14)).Value
        ' Loop over the array
        For i = 2 To 13000
            If datCol3(i, 1) = "Police" And datCol14(i, 1) = "Bi-wkly Uniform Pay" Then
                datCol3(i, 1) = "Police - Uniform"
            End If
        Next
        'Return the results to the sheet
        .Range(.Cells(1, 3), .Cells(13000, 3)).Formula = datCol3
    End With
End Sub

答案 1 :(得分:0)

这可能不是最佳答案,但请尝试设置局部变量

Var sht1 = Sheets(“Sheet1”)可能会略微减少对象的选择。此外,没有必要使用(i,3)选择范围和单元格,因为它是单个单元格的范围,因此组合起来就像

 If sht1.Range.Cells(i,3) = "Police" And sht1.Range.Cells(i,14) = "Bi-wkly Uniform Pay" Then sh1.Range.Cells(i,3) = "Police Uniform" 
Next i

如果这不起作用并且您可以将它放在不同的列中(比如列O或15),那么您只需使用公式然后拖动/双击,或者您可以使用整个数组公式列相似,然后按ctrl + shift + enter使其计算为数组公式。

希望这有点帮助。

答案 2 :(得分:0)

建议1

替换:

If Sheets("Sheet1").Range(Cells(i, 3), Cells(i, 3)) = "Police" 
    And Sheets("Sheet1").Range(Cells(i, 14), Cells(i, 14)) = "Bi-wkly Uniform Pay" Then _
  Sheets("Sheet1").Range(Cells(i, 3), Cells(i, 3)) = "Police - Uniform"

由:

With Sheets("Sheet1")
  If .Range(Cells(i, 3), Cells(i, 3)) = "Police" _
      And .Range(Cells(i, 14), Cells(i, 14)) = "Bi-wkly Uniform Pay" Then _
    .Range(Cells(i, 3), Cells(i, 3)) = "Police - Uniform"
End With

建议2

替换:

.Range(Cells(i, 3), Cells(i, 3))

通过

.Cells(i, 3)

建议3

添加:

Application.ScreenUpdating = False

如果没有此声明,屏幕将重新绘制每次更改。这比其他任何东西都要花费更多的时间。