循环帮助和转到

时间:2018-02-18 21:22:44

标签: vba loops 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的不良做法。我应该总是尽量避免使用它。我对它很新。

1 个答案:

答案 0 :(得分:1)

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

VB(A)有一些内置构造,​​用于需要GoTo的错误处理方式。那是不可避免的。应该避免所有其他的。

在这种情况下,相当容易,您可以使用For打破Exit 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