【问题标题】:Want to Speed up If Statement想要加快 If 语句
【发布时间】:2016-11-20 06:16:05
【问题描述】:

如果可能,我正在考虑尝试加快下面的嵌套 If 语句,因为它会遍历我列中的每一行。这会影响我的宏的运行时间:

Set Col = Range("O2:O" & lastrowOU3)
For Each Cell In Col
If Cell.Offset(0, -2) = 0 And Cell.Offset(0, -1) = 0 Then Cell.Value = "NEW ITEM"
If Cell.Offset(0, -2) = 0 And Cell.Offset(0, -1) = "NEW ITEM" Then Cell.Value = "NOT VALIDATED"
If Cell.Offset(0, -2) < Date And Cell.Offset(0, -1) = "NEW ITEM" Then Cell.Value = "NOT VALIDATED"
If Cell.Offset(0, -2) < Date And Cell.Offset(0, -1) = "VALIDATED" Then Cell.Value = "NOT VALIDATED"
If Cell.Offset(0, -2) < Date And Cell.Offset(0, -1) = "NOT VALIDATED" Then Cell.Value = "NOT VALIDATED 1"
If Cell.Offset(0, -2) < Date And Cell.Offset(0, -1) = "NOT VALIDATED 1" Then Cell.Value = "NOT VALIDATED 2"
If Cell.Offset(0, -2) >= Date Then Cell.Value = "VALIDATED"
Next

一旦满足上述任何一种情况,是否有办法避免经历每种情况,以便宏直接进入下一行?或者也许有更快的方法?

谢谢,

康纳

【问题讨论】:

  • 1.) IF/ELSEIF/ENDIF 2.) 将值放在变量中,这样每个循环只会进入工作表两次。
  • 如果您想要更快,请使用 Excel 公式而不是 VBA

标签: excel loops if-statement vba


【解决方案1】:

至少:

Sub dural()
    Set Col = Range("O2:O" & lastrowOU3)
    Dim v1 As Variant, v2 As Variant, s As String

    For Each cell In Col
        v1 = cell.Offset(0, -2).Value
        v2 = cell.Offset(0, -1).Value
        If v1 = 0 And v2 = 0 Then s = "NEW ITEM"
        If v1 = 0 And v2 = "NEW ITEM" Then s = "NOT VALIDATED"
        If v1 < Date And v2 = "NEW ITEM" Then s = "NOT VALIDATED"
        If v1 < Date And v2 = "VALIDATED" Then s = "NOT VALIDATED"
        If v1 < Date And v2 = "NOT VALIDATED" Then s = "NOT VALIDATED 1"
        If v1 < Date And v2 = "NOT VALIDATED 1" Then s = "NOT VALIDATED 2"
        If v1 >= Date Then s = "VALIDATED"
        cell.Value = s
    Next
End Sub

【讨论】:

    【解决方案2】:

    使用“ElseIf”意味着只有在前面的步骤不正确时才会进行测试。

    Set Col = Range("O2:O" & lastrowOU3)
    For Each Cell In Col
    If Cell.Offset(0, -2) = 0 And Cell.Offset(0, -1) = 0 Then
        Cell.Value = "NEW ITEM"
    ElseIf Cell.Offset(0, -2) = 0 And Cell.Offset(0, -1) = "NEW ITEM" Then
        Cell.Value = "NOT VALIDATED"
    ElseIf Cell.Offset(0, -2) < Date And Cell.Offset(0, -1) = "NEW ITEM" Then
        Cell.Value = "NOT VALIDATED"
    ElseIf Cell.Offset(0, -2) < Date And Cell.Offset(0, -1) = "VALIDATED" Then
        Cell.Value = "NOT VALIDATED"
    ElseIf Cell.Offset(0, -2) < Date And Cell.Offset(0, -1) = "NOT VALIDATED" Then
        Cell.Value = "NOT VALIDATED 1"
    ElseIf Cell.Offset(0, -2) < Date And Cell.Offset(0, -1) = "NOT VALIDATED 1" Then
        Cell.Value = "NOT VALIDATED 2"
    ElseIf Cell.Offset(0, -2) >= Date Then
        Cell.Value = "VALIDATED"
    End If
    Next
    

    嵌套语句也会加快速度:

    Set Col = Range("O2:O" & lastrowOU3)
    For Each Cell In Col
    If Cell.Offset(0, -2) = 0 Then
        IF And Cell.Offset(0, -1) = 0 Then
            Cell.Value = "NEW ITEM"
        ElseIf Cell.Offset(0, -1) = "NEW ITEM" Then
            Cell.Value = "NOT VALIDATED"
        End If
    ElseIf Cell.Offset(0, -2) < Date Then
        If Cell.Offset(0, -1) = "NEW ITEM" Then
            Cell.Value = "NOT VALIDATED"
        ElseIf Cell.Offset(0, -1) = "VALIDATED" Then
            Cell.Value = "NOT VALIDATED"
        ElseIf Cell.Offset(0, -1) = "NOT VALIDATED" Then
            Cell.Value = "NOT VALIDATED 1"
        ElseIf Cell.Offset(0, -1) = "NOT VALIDATED 1" Then
            Cell.Value = "NOT VALIDATED 2"
        End If
    ElseIf Cell.Offset(0, -2) >= Date Then
        Cell.Value = "VALIDATED"
    End If
    Next
    

    使用 SELECT CASE 语句可能会加快速度,因为每个“Cell.Offset(0, x)”只需要评估一次(我认为):

    Set Col = Range("O2:O" & lastrowOU3)
    For Each Cell In Col
    Select Case Cell.Offset(0, -2)
        Case 0
            Select Case Cell.Offset(0, -1)
                Case 0
                    Cell.Value = "NEW ITEM"
                Case "NEW ITEM"
                    Cell.Value = "NOT VALIDATED"
                Case Else
            End Select
        Case < Date
            Select Case Cell.Offset(0, -1)
                Case "NEW ITEM"
                    Cell.Value = "NOT VALIDATED"
                Case "VALIDATED"
                    Cell.Value = "NOT VALIDATED"
                Case "NOT VALIDATED"
                    Cell.Value = "NOT VALIDATED 1"
                Case "NOT VALIDATED 1"
                    Cell.Value = "NOT VALIDATED 2"
                Case Else
            End Select
        Case Else
            Cell.Value = "VALIDATED"
    End Select
    Next
    

    【讨论】:

    • 干杯伙伴。快到了。感谢您在周日的帮助!
    猜你喜欢
    • 2017-08-29
    • 1970-01-01
    • 2012-10-25
    • 1970-01-01
    • 1970-01-01
    • 2019-04-24
    • 1970-01-01
    • 1970-01-01
    • 2012-07-20
    相关资源
    最近更新 更多