循环帮助和转到

Loop Help and Goto

我有 3 个工作表。我将前 2 个转换为两个数组 (array1 & array2),然后在它们之间进行计算以创建第三个。

我创建的宏利用了这段代码---

Z = 1

For x = 1 To UBound(array1, 1)
    For y = 1 To UBound(array2, 1)
        If array1(x, 4) = 0 Then
            GoTo Line1
        End If
        If array1(x, 1) = array2(y, 1) And array1(x, 2) = array2(y, 3)Then
            If array1(x, 4) > array2(y, 5) Then
                array3(z, 1) = array1(x, 3)
            ElseIf array1(x, 4) = array2(y, 5) Or array1(x, 4) < array2(y, 5) Then
                array3(z, 1) = array1(x, 3)
            End If
            z = z + 1
        End If
    Next y
Line1:
Next x

它取 array1 的一部分并将其循环通过 array2 并在 array3

中创建结果

基本上array1(x, 4) = 0时,我需要它才能进入下一个X。如果没有 GoTo Line1,我不知道如何循环播放。

如果我将它向下移动,那么它将继续循环 array2(y),而不是移动到下一个 X。如果我把它移到上面,然后 y 重置并且它再次运行 For y 循环

也在使用 GoTo Line X,VBA 中的不良做法。我应该总是尽量避免使用它吗?我对它还很陌生。

编写依赖于 GoTo 的代码被广泛认为是糟糕的风格。

VB(A) 有几个 built-in 构造用于其需要 GoTo 的错误处理方式。那些是不可避免的。所有其他的都应该避免。

在这种情况下相当简单,您可以使用 Exit For:

来打破 For 循环
Z = 1

For x = 1 To UBound(array1, 1)
    For y = 1 To UBound(array2, 1)
        If array1(x, 4) = 0 Then Exit For
        If And array1(x, 1) = array2(y, 1) And array1(x, 2) = array2(y, 3) Then
            If array1(x, 4) > array2(y, 5) Then
                array3(z, 1) = array1(x, 3)
            ElseIf array1(x, 4) = array2(y, 5) Or array1(x, 4) < array2(y, 5) Then
                array3(z, 1) = array1(x, 3)
            End If
            z = z + 1            
        End If
    Next y
Next x

备选方案(多一层嵌套):

For x = 1 To UBound(array1, 1)
    If array1(x, 4) <> 0 Then
        For y = 1 To UBound(array2, 1)
            If And array1(x, 1) = array2(y, 1) And array1(x, 2) = array2(y, 3) Then
                If array1(x, 4) > array2(y, 5) Then
                    array3(z, 1) = array1(x, 3)
                ElseIf array1(x, 4) = array2(y, 5) Or array1(x, 4) < array2(y, 5) Then
                    array3(z, 1) = array1(x, 3)
                End If
                z = z + 1            
            End If
        End If
    Next y
Next x