【问题标题】:Exit a while loop in VBS/VBA在 VBS/VBA 中退出 while 循环
【发布时间】:2010-11-19 07:22:28
【问题描述】:

在 VBS/VBA 中有退出/破坏while 的方法吗?

以下代码无法按预期工作:

num = 0
while (num < 10)

    if (status = "Fail") then
        exit while
    end if

    num = num+1
wend

【问题讨论】:

    标签: vba vbscript


    【解决方案1】:

    VBScript 的While 循环不支持提前退出。为此使用Do 循环:

    num = 0
    do while (num < 10)
      if (status = "Fail") then exit do
      num = num + 1
    loop
    

    【讨论】:

      【解决方案2】:

      将while循环改为do while循环怎么样

      然后使用退出

      Exit Do
      

      【讨论】:

      • 将我的while循环更改为while循环将使我的代码更加复杂。所以我找到了一个解决方法,如果你想使用vbscripts从while循环中退出,只要设置了条件将while循环设置为循环的不匹配条件。例如:while(num
      【解决方案3】:

      While Loop 是一个过时的结构,我建议您将“While loop”替换为“Do While..loop”,这样您就可以使用 Exit 子句了。

      check = 0 
      
      Do while not rs.EOF 
         if rs("reg_code") = rcode then 
            check = 1 
            Response.Write ("Found") 
            Exit do
         else 
            rs.MoveNext 
          end if 
      Loop 
      
      if check = 0 then 
         Response.Write "Not Found" 
      end if}
      

      【讨论】:

      • while 循环不被认为是“过时的”——至少,不会比 VBScript 多。
      【解决方案4】:

      令人难以置信的老问题,但请记住 OP 说他不想使用 Do While 并且其他解决方案都没有真正起作用...这是完全相同相同的东西作为Exit Loop:

      如果状态已经是“失败”,这将永远不会运行...

      While (i < 20 And Not bShouldStop)
          If (Status = "Fail") Then
              bShouldStop = True
          Else
              i = i + 1
              '
              ' Do Something
              '
          End If  
      Wend
      

      而这个总是先处理一些东西(并增加循环变量),然后再决定它是否应该再次循环。

      While (i < 20 And Not bShouldStop)
          i = i + 1
          '
          ' Do Something
          '
      
          If (Status = "Fail") Then
              bShouldStop = True
          End If  
      Wend
      

      最终,如果变量 StatusWhile 内部被修改(假设您在 while 之外不需要 i,这实际上并没有什么区别,但只是想呈现多个选项......

      【讨论】:

      • 在您的两个示例中,循环的当前迭代将在设置为“失败”时继续到结束。这与退出语句的行为不同,其中循环的执行立即停止并将控制权传递回外部逻辑块。
      • 所以你说它们不一样,因为在bShouldStop 设置为True 之后,它跳转到End If,然后返回评估条件并最终转到@ 987654331@,而Exit Loop 将直接转到底部的Loop。当然,我会给你那个。但是现在让我问你这个问题:这是一个 脚本 还是一个每次跳转都很重要的汇编应用程序?最终结果完全相同相同,没有变量被更改,没有不应该执行的代码被执行,当 Status = Fail 时它停止。但是,请使用 while/wend 想出一个更好的解决方案...
      【解决方案5】:

      使用 Do...Loop 和 until 关键字

      num=0
      Do Until //certain_condition_to_break_loop
       num=num+1
      Loop
      

      这个循环会继续执行,直到条件变为真

      虽然...Wend 是旧语法并且不提供中断循环的功能!更喜欢做while循环

      【讨论】:

      • 用条件替换评论
      【解决方案6】:

      我知道这已经很老了,但它在谷歌中的排名很高。

      解决方案 maddy 实现的问题(响应 rahul)以维持使用 While...Wend 循环有一些缺点

      在给出的例子中

      num = 0
      While num < 10
        If status = "Fail" Then
          num = 10
        End If
        num = num + 1
      Wend
      

      在 status = "Fail" 之后,num 实际上等于 11。循环没有在失败条件下结束,而是在下一次测试时结束。检查后的所有代码仍在处理中,您的计数器可能不是您所期望的。

      现在取决于您在循环中所做的一切,这可能无关紧要,但如果您的代码看起来更像:

      num = 0
      While num < 10
        If folder = "System32" Then
          num = 10
        End If
        RecursiveDeleteFunction folder
        num = num + 1
      Wend
      

      使用Do WhileDo Until 允许您使用Exit Do 停止循环的执行,而不是在循环条件中使用诡计来维护While ... Wend 语法。我建议改用它。

      【讨论】:

      • 什么额外的3个字符?
      • 天哪,那是 5 年前的事了。我想一定有人编辑了一些东西。在某些时候有一条关于使用 while wend over do while I think 保存字符的评论
      • 但请记住,这些问题的目的是为后代保留,包括答案,您现在应该编辑您的问题以确保它有意义。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-05-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-03-01
      • 1970-01-01
      • 2015-08-15
      相关资源
      最近更新 更多