我有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的不良做法。我应该总是尽量避免使用它。我对它很新。
答案 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