【问题标题】:Excel vba for loop [duplicate]Excel vba for循环[重复]
【发布时间】:2020-06-19 20:00:43
【问题描述】:
Sub letr()

Dim i As Integer

For i = 3 To 25

    If Cells(i, 7) <> "CA" Then
    Rows(i).Delete
    End If

Next i

End Sub

上面的代码并没有删除所有的结果(总共4个)。我必须运行代码两次才能删除所有 4 个结果。谁能告诉我我做错了什么?

【问题讨论】:

  • 这是一个反复出现的问题。从底部运行删除,或者您根本不迭代所有行。要看到这种情况发生,请使用 F8 单步执行您的代码并查看每一步的结果。再说一次,最好不要一个接一个地删除,而是在你使用Union之后一次性删除。这是example。让我知道这是否能回答您的问题,以便我们关闭此线程。
  • 如果您从上到下删除,您实际上是在向上移动行,而您的迭代器 i 仍在向前推进。这意味着如果您有 3:NY 4:NY 5:CA 则在 i = 3 时,第一个 NY 将被删除。现在您还有 3:NY 4:CA,但您的迭代器已经前进并且 i = 4。由于您删除了第 3 行,因此在这种情况下,新的第 3 行仍保留值 NY,但您的循环已继续检查第 4 行。

标签: excel vba


【解决方案1】:

正如其他人所说,您需要从数据的底部到顶部, 如果您只对第 3 到 25 行感兴趣,请尝试:

For i = 25 To 3 Step -1

【讨论】:

    【解决方案2】:

    可以通过增加索引,使用 While 循环。

    当您不删除一行时,只需增加索引以测试下一行。

    当您删除一行时,不要前进,因为下一行已移至当前行。而是将边界减一。

    Dim I As Integer, N As Integer
    I = 3
    N = 25
    While I <= N
        If Cells(I, 7) <> "CA" Then
            Rows(I).Delete
            N = N - 1
        Else
            I = I + 1
        End If
    Wend
    

    【讨论】:

      【解决方案3】:

      如果您仍想自上而下并且知道开始行和结束行,则可以使用 while 循环。

      Dim i As Integer: i = 3
      Dim c As Integer: c = 1
      
      Do While c < (25 - 3 + 2)
          If Cells(i, 7).Value <> "CA" Then
              Rows(i).Delete
          Else
              i = i + 1
          End If
          c = c + 1
      Loop
      

      或者使用for循环

      For c = 3 To 25
          If Cells(i, 7).Value <> "CA" Then
              Rows(i).Delete
          Else
              i = i + 1
          End If
      Next c
      

      【讨论】:

      • 有趣。使用这种方法,实际上用For 循环替换Do While 更简单,因为索引c 总是增加。
      • @Jean-ClaudeArbaut 是的,使用 for 循环迭代 c 在语法上也会更简洁。我将添加到我的答案中。谢谢!
      猜你喜欢
      • 2013-12-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-05-15
      • 1970-01-01
      • 2016-02-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多