【问题标题】:VBA, for loop with a nested do while loopVBA,带有嵌套do while循环的for循环
【发布时间】:2020-12-30 05:34:47
【问题描述】:

我有一个数据集,其中每一行都有一个缩写,然后是一个与之关联的日期。然后下一行是与下一个日期相同的缩写。在日期“范围”的末尾,它变为下一个缩写,贯穿另一个日期范围。

我当然想遍历整个数据集,但是我想为每个缩写的子集创建一个内部循环。我的想法是在内循环中增加外循环,这样当内循环完成时,外循环跳到下一组缩写,但我不认为外循环允许我这样做。

代码如下所示。有没有办法让 For 循环不遍历每个值,而是“向前跳”到这个 Do 循环的最后一个值?

    For i = 2 To LastRow
    
'Create a loop through the abbreviations
        Do While Cells(i, 1).value <> Cells(i + 1, 1).value
        i = i + 1
        Loop
        
        
    Next i

【问题讨论】:

  • 当使用For...Next 循环时,改变循环内的循环计数器被认为是不好的做法。如果您需要做类似的事情,那么Do 循环是更好的选择。
  • 我看到你已经编辑了标题以专注于 Do 而不是 For 循环。但是您已经有了一个广泛解释如何做到这一点的答案。如果您需要更多帮助,最好编辑您的问题以包含一些示例数据、预期输出(均作为文本)、您当前使用 Do 循环获得的代码、您当前获得的输出以及您获得的任何错误.
  • 好的听起来不错。我试图回到堆栈溢出的好意,只是改变了标题。我是一个完整的新手,我疯了一样跌跌撞撞。感谢指导

标签: excel vba


【解决方案1】:

一种方法是简单地使用两个Do While 循环并在您的条件不成立时增加i

    i = 2

    Do While i <= LastRow
    
        'Create a loop through the abbreviations
        If Cells(i, 1).value <> Cells(i + 1, 1).value Then
           Do While Cells(i, 1).value <> Cells(i + 1, 1).value
              i = i + 1
           Loop
        Else
           i = i + 1
        End If
    Loop

【讨论】:

  • 我不太清楚为什么我需要这里的 IF 语句。你能解释一下如果我们简单地忽略它并有 2 个 DO 循环会发生什么吗?
  • 如果省略If 语句,那么只要代码不执行内部Do While 循环,它就不会在该迭代中执行i = i + 1,因此@987654327 的值@ 保持不变,程序陷入无限循环。因此,If 语句使代码的行为类似于For 循环,但还具有在适用的情况下有条件地向前跳转的额外好处。另一种方法是使用布尔值来检测是否进入了内部循环,如果没有则增加i
  • 我意识到我可以简单地将 i = i + 1 放在循环之外,并且在没有 IF 的情况下也可以正常工作。非常感谢你的帮助。真的需要将其视为 2 个 DO 循环,而不是找出一个 FOR
  • 你可以毫无问题地做到这一点,只要它在调用内部循环时有意义,因为在这种情况下,i 会有一个额外的增量。只需对其进行测试并将其调整为最适合您的方式:)
猜你喜欢
  • 1970-01-01
  • 2021-08-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-26
  • 1970-01-01
相关资源
最近更新 更多