Tengo un bucle for sobre una matriz. Lo que quiero hacer es probar una determinada condición en el ciclo y saltar a la siguiente iteración si es verdadera:
For i = LBound(Schedule, 1) To UBound(Schedule, 1)
If (Schedule(i, 1) < ReferenceDate) Then
PrevCouponIndex = i
Continue '*** THIS LINE DOESN'T COMPILE, nor does "Next"
End If
DF = Application.Run("SomeFunction"....)
PV = PV + (DF * Coupon / CouponFrequency)
Next
Sé que puedo hacer:
If (Schedule(i, 1) < ReferenceDate) Then Continue For
pero quiero poder registrar el último valor de i en la variable PrevCouponIndex.
¿Algunas ideas?
Gracias
vba
conditional
loops
Richard H
fuente
fuente
If (Schedule(i, 1) < ReferenceDate) Then Continue For
" : ¿Estás seguro de eso?Continue
no es una palabra clave de VBA.Respuestas:
¿No podrías hacer algo tan simple como esto?
fuente
IF
para la prueba, así que esto no es tan caro en cuanto al código. Sin embargo, debe asegurarse de que el resultado más comúnSchedule(i, 1)
sea menor queReferenceDate
para evitar ejecutarElse
más a menudo de lo necesario. De lo contrario, utilice(ReferenceDate>=Schedule(i, 1))
. (si la prueba es 50/50, entonces no es necesario optimizar)VBA no tiene una
Continue
palabra clave equivalente ni ninguna otra para saltar inmediatamente a la siguiente iteración del ciclo. Sugeriría un uso juicioso deGoto
como solución, especialmente si esto es solo un ejemplo artificial y su código real es más complicado:Sin embargo, si eso es realmente todo su código, @Brian es absolutamente correcto. Simplemente ponga una
Else
cláusula en suIf
declaración y termine con ella.fuente
On Error Goto
).Continue
declaración). Se puede argumentar que el uso deContinue
en otros idiomas debe evitarse y, por lo tanto, también debe evitarse aquí. De alguna manera, el enlace que publicaste hace mi punto. El enlace es a laGoTo
declaración en VB.Net. VB.Net tiene un manejo de errores estructurado y declaracionesContinue For
/Continue Do
. Realmente no hay necesidad deGoTo
en VB.Net; Sospecho que se dejó en su lugar en gran parte para admitir una conversión más fácil del código VBA / VB6 existente.GoTo
tiene la ventaja de reducir el anidamiento. Omitir una iteración de bucle sin agregar un nivel de sangría es, en mi opinión, uno de los pocos usos legítimos deGoTo
en VBA / VB6. Especialmente si extrae el cuerpo del bucle en su propio procedimiento .Puede usar una especie de
continue
usando un anidadoDo ... Loop While False
:fuente
Continue For
no es válido en VBA o VB6.Desde esta página de MSDN , parece que se ha introducido en VB.Net en VS 2005./Net 2.
Como han dicho los demás, en realidad no hay otra opción que usar
Goto
o unElse
.fuente
Hola, también estoy enfrentando este problema y lo resuelvo usando el siguiente código de ejemplo
fuente
Tal vez intente ponerlo todo al final si y use otro para omitir el código, esto hará que no pueda usar GoTo.
fuente