¿Cómo salir de un bucle infinito de una macro?

Ejecuto una macro que llama a otras, una de ellas graba varias hojas del libro y cunado acaba de grabar en el libro 1 sigue con el libro 2 y para que pare hay en una hoja un valor POR, es cuando entra en acción esta macro:

Sub Macro()
If Range("C36") = Range("B38") Then End
End Sub

Hace su papel en parar la grabación en hojas de los libros pero sigue abriendo el libro 1 y 2 una y otra vez a entrado en bucle, ¿cómo salir del bucle?

2 respuestas

Respuesta
1

De excel no tengo ni idea, pero ¿has probado con

... then

Exit sub

eso no es, despues de de tanto trasteo veo que necesito parar o que no de ejecute otra Macro para parar el bucle, ejmplo :

Sub Macro()
If Range("C36") = Range("B38") Then End 
   MACROTIEMPO2
   End
End Sub

Peo esto no va tampoco. ni End ni Exit ni  End sub me refiro a parar la macro MACROTIEMPO2 

No te fijes en las tablas ni en el código, es para que veas como para la ejecución. Si tengo una tabla

Le voy a decir que mientras el valor sea 1 me ponga en mensaje un texto y que en el momento que no lo sea, detenga la ejecución

Pulso el botón y 

Como ves el cursor se ha ido al registro de valor 2 pero no ha puesto nada y no sigue pese a que en el código le digo que recorra todo el formulario

Private Sub Comando7_Click()
DoCmd.GoToRecord , , acFirst
Dim i As Byte
For i = 1 To Me.Recordset.RecordCount
If Valor = 1 Then
Mensaje = "Hola buenas tardes"
ElseIf Valor <> 1 Then
Exit Sub
End If
DoCmd.GoToRecord , , acNext
Next
End Sub

Como puedes ver, al principio le digo que recorra todos los registros, pero que si el valor es distinto de 1 ya no siga, y efectivamente no sigue.

Perdona pero esta macro hace refencia al valor 1no siga, pero mi refencia esta en una hoja concreta en una celda concreta como indica la macro

If Range("C36") = Range("B38"

Y donde para esta macro  MACROTIEMPO2  ????

Un Saludo.

La respuesta correcta es la que te da James Bond. En access podrías decir, por ejemplo

If valor=dlookup("otrocampo","otratabla","Pais=""Alemania""") then

exit sub

Pero como te dije Excel no es lo mío, aunque en código VBA Excel y Access sean iguales.

Respuesta

Prueba así, ambas celdas son iguales termina el programa en caso contrario activara la macro, por cierto un bucle o es do while, for each... o for i=1 to por, aquí no veo más que una condicional.

Sub Macro()
If Range("C36") = Range("B38") Then

    End 

else
    MACROTIEMPO2
End
End Sub

Ya he probado varias combinaciones de este tipo y no funciona, estac concretamente da error BLOQUE IF SIN END IF

Esta a si montada una de las macros que es la que graba :

Dim hoja As String

Sub Grabar()

For A = 1 To 4

Select Case A

Case 1

hoja = "hoja 1"

Call OTRAMAS

Call resultados

Case 2

hoja = "hoja2"

Call resultados

Case 3

hoja = "hoja3"

Call resultados

Case 4

hoja = "hoja4"

Call resultados

End Select

Next A

End Sub

Sub resultados()

On Error Resume Next

With Sheets(hoja)

.Range("D" & Rows.Count).End(xlUp).Offset(1, 0).Value = .Range("D37")

.Range("E" & Rows.Count).End(xlUp).Offset(1, 0).Value = .Range("E37")

.Range("F" & Rows.Count).End(xlUp).Offset(1, 0).Value = .Range("F37")

.Range("G" & Rows.Count).End(xlUp).Offset(1, 0).Value = .Range("G37")

.Range("H" & Rows.Count).End(xlUp).Offset(1, 0).Value = .Range("H37")

.Range("I" & Rows.Count).End(xlUp).Offset(1, 0).Value = .Range("I37")

.Range("J" & Rows.Count).End(xlUp).Offset(1, 0).Value = .Range("J37")

.Range("AL" & Rows.Count).End(xlUp).Offset(1, 0).Value = Now

End With

End Sub

--------------------------------------------------------------------------------------------------------------------------

Sub OTRAMAS()

If Range("C36") = Range("B38") Then End

End Sub

en hoja1 que es donde esta la celda de referncia para que pare de grabar,  con la llamada  a la macro OTRAMAS, que de hecho ya no sigue grabando en el libro, pero como el inicio de arranque desde un boton es a esta macro:

Sub ABRIRYGUARDAR()
Call MACROTIEMPO1
Call MACROTIEMPO2
Call MACROTIEMPO3
End Sub

Que es la que quiero que pare, por que MACROTIEMPO2 abre otro libro y este otro libro ect...

Un Saludo.

He corrido tu macro y solo le encuentro un defecto y es este

If Range("C36") = Range("B38") Then End

El valor de ambas celdas para salir es siempre el mismo, es decir si copia valores de las otras 3 hojas si el valor de ambas celdas de la hoja1 permanece constante la condición siempre sera falsa por lo tanto nunca saldrás del filtro además esta mal colocada si quieres impedir que la macro tiempo2 no se ejecute entonces esta instrucción debería estar en abrir y guardar no en otramas, por ejemplo esta macro llama a macrotiempo1 y en cuanto termina de ejecutarse pregunta si quieres detener la macro, en caso afirmatico hasta ahí llega la macro, puedes poner tu instrucción aquí, lo único es como dije hacer que los valores de ambas celdas sean verdaderos.

Sub ABRIRYGUARDAR()
Call MACROTIEMPO1
ask = MsgBox("detener la macro", vbYesNo, "aviso") = 6
If ask Then End
Call MACROTIEMPO2
Call MACROTIEMPO3
End Sub

C36 tiene la formula contara pertenece a la columna donde se va grabando,  B38 tiene un valor fijo que recoge de otra hoja , por lo tanto cuando C36 llega al numero de B38 son iguales “PARA  GRABACION” también tengo en otra celda B37 que cuando C36 y B38 son iguales sale el texto PARAR, esto ultimo como comodin para poder acoplar en sustitución de If Range("C36") = Range("B38") que podría ser If Range("B37") =  “PARAR”

Acabo de probar la macro SI pero NO, no quiero ningún aviso de SI o NO actuar como NO  sin mas. Pero paso a explicar lo mas posible al detalle.

Boton de arranque inicial de macro  todas las Call tiene su tiempo Application.OnTime Now + TimeValue("00:00:03") ect…

Sub ABRIRYGUARDAR()

Call MACROTIEMPO1 = macro grabar

Call MACROTIEMPO2 = macro que abre otro libro de la misma carpeta

Call MACROTIEMPO3 = macro Cierra libro

End Sub

Son varios libros en una carpeta con su año, están montados para que graben datos desde el arranque de libro 1 hasta regresara  a este y solo parara cuando se cumpla en libro 1 Range("C36") = Range("B38")  y se cumple este ciclo de grabación.

Una vez cumplido el ciclo tengo esta otra macro

ABRIRLIBROSOLO_SEGUNDA

Que se tendrá que ejecutar para saltar a otro libro que esta en otra carpeta y ara lo mismo que este y suma y sigo hasta llegar a la carpeta de año 2019.

O sea mi intención es que des la 1º carpeta 2010 ejecute libro1 y acabe el proceso en el libro1 de carpeta 2019.

El montaje que tengo ahora si hago el proceso de los libros carpeta por carpeta todo ok, pero quiero que lo realice de tiron.

Este parrafo tienen un error

Acabo de probar la macro SI pero NO, no quiero ningún aviso de SI o NO actuar como NO  sin mas. Pero paso a explicar lo mas posible al detalle.

Quiero decir no quiero ningún aviso de SI o NO detener la macro actuar la macro  como SI  sin mas. 

Salud2....

El aviso si/no te lo puse de ejemplo, en ese lugar va tu condición y no en un modulo aparte ya que cuando se cumple la condición es ese modulo el que finaliza y no todas las macros, si lo haces y sigue sin detenerse entonces la única razón por la que no te saca del bucle es porque la condición no esa esta cumpliendo.

Quizás no me explico bien sobre esta macro

ask = MsgBox("detener la macro", vbYesNo, "aviso") = 6
If ask Then End

Sale un cartel de SI quiero detener o No, lógicamente Si quiero detener ya que con la coincidencia de esta condición de la otra macro se cumple

Sub OTRA()

If Range("B37") = "PARAR" Then End

End Sub

Y lo que quiero decir es que la 1º macro( que funciona dando a SI o no) en lugar de salir el aviso de Si o NO, sea sin aviso y cumpliendo la condición de SI, estoy intentando googleando encontrar como y no soy capaz con esto como ejemplo

If ask = vbYes Then End

If ask = MsgBoxResult.Yes Then

Si consigo este paso, lo siguiente seria que ejecutase a continuación 1º una macro y después una 2º macro, que seria macro de abrir libro de siguiente carpeta y macro de cerrar libro actual.

Un Saludo.

Perdon de Nuevo la macro

ask = MsgBox("detener la macro", vbYesNo, "aviso") = 6

If ask = vbYes Then End

Al estar metida en macros de llamada con tiempo, no le di el tiempo suficiente después del mensaje y le de a SI o No la macro continua MACROTIEMPO2

Se me ocurrio esto y si para todo…

Esta macro

Sub OTRA()

'OK OK

If Range("B37") = "PARAR" Then End

End Sub

Esta incluida en la macro:

Sub Grabar()

For A = 1 To 5

Select Case A

Case 1

hoja = "Hoja1"

Call OTRA

Y hace su papel para la macro de grabar, ahora he puesto en la macro de arranque inicial la macro OTRA

Sub ABRIRYGUARDAR()

Call MACROTIEMPO1

Call OTRA

Call MACROTIEMPO2

Call MACROTIEMPO3

End Sub

Y ya no abre ningún otro libro se queda el libro parado total que es lo que pretendía

Ahora me faltaría que cuando llegue este momento If Range("B37") = "PARAR" Then End

Ejecute la macro ABRIRLIBROSOLO_SEGUNDA

Esta imagen si tienes en contar el valor de 1 (es decir tiens solo una fila) y corres la macro esta cuando c6=b8 se detiene haciendo lo que quieres pero si tienes valor mayores a 2 en contar entonces la macro correrá infinitamente porque los valores nunca serán iguales, el problema es el parar este tendría que ir cambiando, es valor veo que lo sacas de la hoja b5, una solución seria que c6>b8 entonces cuando sea mayor a 2 la maco en automático se detendrá.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas