循环帮助和转到
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
我有 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