Vba 如果使用多个or语句创建无限循环

Vba 如果使用多个or语句创建无限循环,vba,excel,Vba,Excel,我有一个循环,它沿着一列向下走,并标识单元格是否等于列出的安全类型之一。如果没有,它将剪切数据偏移量1列并粘贴到左侧。有时数据偏移1-3列,这就是为什么我添加i=i-1来检查同一行,直到它满足if。此代码导致两个问题: 一,。对于带有多个or的If语句,是否有更简单的代码行 二,。这段代码是分段工作的,但当它在整个工作表上运行时,大约29K行,它进入了一个无止境的循环。你知道为什么会这样吗 LastCashrow = Sheets("Cash Data").Range("A" & She

我有一个循环,它沿着一列向下走,并标识单元格是否等于列出的安全类型之一。如果没有,它将剪切数据偏移量1列并粘贴到左侧。有时数据偏移1-3列,这就是为什么我添加i=i-1来检查同一行,直到它满足if。此代码导致两个问题:

一,。对于带有多个or的If语句,是否有更简单的代码行

二,。这段代码是分段工作的,但当它在整个工作表上运行时,大约29K行,它进入了一个无止境的循环。你知道为什么会这样吗

LastCashrow = Sheets("Cash Data").Range("A" & Sheets("Cash Data").Rows.Count).End(xlUp).Row

For i = 8 To LastCashrow

SecType = Left(Cells(i, 5), 2)

  If SecType = "aw" Or SecType = "ca" Or SecType = "cb" Or SecType = "cd" Or SecType = "cl" Or SecType = "cp" Or SecType = "cs" Or SecType = "cv" Or SecType = "ep" _
                Or SecType = "ex" Or SecType = "fi" Or SecType = "fm" Or SecType = "gb" Or SecType = "gm" Or SecType = "hf" Or SecType = "lp" Or SecType = "mb" _
                Or SecType = "mf" Or SecType = "oa" Or SecType = "pf" Or SecType = "pr" Or SecType = "ps" Or SecType = "pt" Or SecType = "re" Or SecType = "rl" _
                Or SecType = "tb" Or SecType = "tp" Or SecType = "ut" Or SecType = "wt" Or SecType = "zb" Or SecType = "zt" Then

  ElseIf IsEmpty(SecType) = "True" Then
        Exit For

  Else
        Set Shift = Range(Cells(i, 5), Cells(i, 17))
        Shift.Cut
        Cells(i, 4).Select
        ActiveSheet.Paste
        Application.CutCopyMode = False
        i = i - 1

  End If

Next i

您可以这样做以简化多重或多重条件:

If InStr(1, "/aw/ca/cb/cd/cl/cp/cs/cv/ep/ex/fi/fm/gb/gm/hf/lp/mb/mf/oa" + _
            "/pf/pr/ps/pt/re/rl/tb/tp/ut/wt/zb/zt", SecType) > 1 Then
一,。对于带有多个or的If语句,是否有更简单的代码行

对。我将从以下方式改进您的代码开始:

' Declare all of your variables explicitly
Dim LastCashRow As Long
Dim i As Long
Dim SecType As String
Dim cell As Range

Dim validSecTypes() As String
validSecTypes = Split("aw,ca,cb,cd", ",") ' write all of your values here...
' returns an array of strings: ["aw", "ca", "cb", "cd"]

LastCashRow = 12

For i = 8 To LastCashRow
    Set cell = Cells(i, 5)
    If IsEmpty(cell) Then Exit For ' This is really the first thing to check for.

    SecType = Left(cell.Value, 2)

    If ArrayContains(validSecTypes, SecType) Then 
        MsgBox SecType & " is IN!"
    Else
        MsgBox "This is OUT: " & SecType
        'your lines of code go here
    End If

Next i
这将使用辅助函数:

Function ArrayContainsValue(arr As Variant, val As Variant) As Boolean
    ArrayContainsValue = (UBound(Filter(arr, val)) > -1)
End Function
二,。这段代码是分段工作的,但当它在整个工作表上运行时,大约29K行,它进入了一个无止境的循环。你知道为什么会这样吗

LastCashrow = Sheets("Cash Data").Range("A" & Sheets("Cash Data").Rows.Count).End(xlUp).Row

For i = 8 To LastCashrow

SecType = Left(Cells(i, 5), 2)

  If SecType = "aw" Or SecType = "ca" Or SecType = "cb" Or SecType = "cd" Or SecType = "cl" Or SecType = "cp" Or SecType = "cs" Or SecType = "cv" Or SecType = "ep" _
                Or SecType = "ex" Or SecType = "fi" Or SecType = "fm" Or SecType = "gb" Or SecType = "gm" Or SecType = "hf" Or SecType = "lp" Or SecType = "mb" _
                Or SecType = "mf" Or SecType = "oa" Or SecType = "pf" Or SecType = "pr" Or SecType = "ps" Or SecType = "pt" Or SecType = "re" Or SecType = "rl" _
                Or SecType = "tb" Or SecType = "tp" Or SecType = "ut" Or SecType = "wt" Or SecType = "zb" Or SecType = "zt" Then

  ElseIf IsEmpty(SecType) = "True" Then
        Exit For

  Else
        Set Shift = Range(Cells(i, 5), Cells(i, 17))
        Shift.Cut
        Cells(i, 4).Select
        ActiveSheet.Paste
        Application.CutCopyMode = False
        i = i - 1

  End If

Next i
不,我们得看看你的床单

但你真的确定这是无止境的吗?因为使用当前编写的代码处理这么多行可能需要一些时间

正如我所猜测的,您的代码只是需要很长时间才能运行

罪魁祸首可能是以下代码:

    Shift.Cut
    Cells(i, 4).Select
    ActiveSheet.Paste

检查它是否等于true,然后检查它是否有任何值,然后执行最后一个else移动i=i-1并从底部循环。对于i=LastCashrow至8步骤-1@ScottCraner为什么?如果不是因为这个问题没有回答一半,我会+1如果SecType=/c,则^^失败。然后您使用其他的/作为分隔符,因为没有一个sec类型有a/,我现在觉得这不是问题。我认为您没有抓住重点。单元格中的值可能恰好是/c,它不是有效的secttype值,但此代码会接受它。如果你选择一个不同的分隔符,同样的推理也适用。不,我完全明白这一点。你的方法肯定更有说服力。我想说,这取决于请求者理解他的数据,然后选择一种他觉得最适合的方法。他想简化if,我给了他一个选择,效果很好。你是对的,它并没有产生一个无止境的循环。我相信多个or语句导致代码运行缓慢。