【问题标题】:returning back to loop after using GoTo使用 GoTo 后返回循环
【发布时间】:2017-03-06 11:05:27
【问题描述】:

我尝试了几种方法,但都没有成功。我的问题是-运行loop1,如果满足某个条件,运行loop2直到满足某个条件,返回loop1。

sub program()
Dim i As Integer
Dim q As Integer

For i=1 to 350
If Range("A"&i).value=1 And Range("D"&i).Value<15 Then Goto 1
Next i

1:q=0
  Do While List1.Range("A"&i+q).Value<>""
  Range("E"&i+q)="K"
  q=q+1
  Loop

End Sub

我还没有找到执行“1循环”后如何返回到“For Next Loop”并继续下一个i的方法。也许这是不可能的,我必须在第一个循环中包含某种代码?!谢谢

【问题讨论】:

  • 我不了解 VBA,所以无法给出完整的答案,但您尝试实现的是“状态机”。一种非常强大的技术。

标签: vba


【解决方案1】:

1 处的代码变成一个函数并调用它而不是使用 goto。当函数退出时,你的第一个循环将从它停止的地方继续执行。

【讨论】:

  • 我已经尝试过了,但由于某种原因它无法正常工作,所以使用了第二个答案。但是如果将来有人使用这种方法,则需要将变量声明为全局 - stackoverflow.com/questions/2722146/…
【解决方案2】:

我实际上并不了解 VBA(我最后一次使用 VB 是在 1996 年左右),但这应该或多或少是正确的:

sub program()
Dim i As Integer
Dim q As Integer

i = 1
Do while i <= 350
  If Range("A"&i).value=1 And Range("D"&i).Value<15 Then
    Do While i <= 350 And List1.Range("A"&i).Value<>""
      Range("E"&i)="K"
      i=i+1
    Loop
  Else
      i=i+1
  End If
Loop
end do
End Sub

【讨论】:

  • 效果很好。 VBA 中的代码没有“end do”语句(Do While 仅由循环完成)。谢谢!
【解决方案3】:

即使是 MSDN 也不鼓励使用 GoTo(您应该只将它用于与 Resume 配对的错误处理),但既然您问了,这就是方法:

Sub program()
    Dim i As Integer
    Dim q As Integer

    For i=1 to 350
        If ((Range("A"&i).value=1) And (Range("D"&i).Value<15)) Then Goto OtherLoop
FirstLoop:
    Next i

Exit Sub

OtherLoop:
   q=0
   Do While List1.Range("A"&i+q).Value<>""
       Range("E"&i+q)="K"
       q=q+1
   Loop
   Goto FirstLoop

End Sub

您需要 Exit 语句来阻止您的代码在完成“FirstLoop”时进入“OtherLoop”,并且还需要告诉它返回到您之前所在的位置。 再次,避免使用这些东西。更推荐使用循环内的循环(缩进 整理一下)和辅助过程调用(调用另一个子程序或函数)。

【讨论】:

    猜你喜欢
    • 2016-01-21
    • 2015-11-04
    • 2023-01-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多