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

12 envíos / 0 nuevos
Último envío
eugeniocol
Imagen de eugeniocol
Offline
última acción: Hace 2 años 3 meses
Nivel 1 - 200 puntos
alta: 29/08/2017 - 17:21
Puntos: 1675
Cómo salir de un bucle infinito de una macro ???

Buenas.

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 x, 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?

Salud2...

eugeniocol
Imagen de eugeniocol
Offline
última acción: Hace 2 años 3 meses
Nivel 1 - 200 puntos
alta: 29/08/2017 - 17:21
Puntos: 1675
respuesta

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

 

Rosario (no verificado)
Imagen de Rosario
convertir horas en minutos


[comentario movido a tema nuevo en el foro: http://www.necesitomas.com/convertir-horas-minutos]

Cron
Imagen de Cron
Offline
última acción: Hace 8 meses 1 día
Nivel 1 - 200 puntosNivel 2 - 500 puntosNivel 3 - 1000 puntosNivel 4 - 2000 puntosNivel 5 - 4000 puntos
alta: 23/06/2010 - 12:30
Puntos: 12735
HolaA ver, por partes. Cuando

Hola

A ver, por partes. Cuando pones End, lo que estés ejecutando se termina sin preguntar, sin liberar memoria, sin limpiar variables, sin mirar atrás. Termina y ya. Y funciona.

Si no te funciona, es porque no lo tienes puesto donde debes. Como no tenemos tu código, no podemos saber qué es lo que ocurre para que no te funcione.

En tu respuesta no entiendo qué querías hacer. Lo que hace es que si el valor en C36 es igual al valor en B38, la macro termina. Si no, entonces ejecuta la rutina Macrotiempo2 y cuando termina de ejecutarla, termina la ejecución. No tiene mucho sentido poner un End justo delante del End Sub.

Seguramente tu problema se encuentre dentro de la macro Macrotiempo2, o de cualquier otra rutina a la que llames.

 

Un saludo

eugeniocol
Imagen de eugeniocol
Offline
última acción: Hace 2 años 3 meses
Nivel 1 - 200 puntos
alta: 29/08/2017 - 17:21
Puntos: 1675
respuesta

Es un poco largo pero creo que es la única forma de hacerse entender:

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.

El botón de arranque del ciclo es :

Todas tienen un tiempo de ejecución.

Sub ABRIRYGUARDAR()

Call MACROTIEMPO1 = macro grabar

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

Call MACROTIEMPO3 = macro Cierra libro

End Sub

El tema es que se cuando se cumple el ciclo de grabación se ejecute otra macro que es la que ya abre el libro de la siguiente carpeta y sigue mismo proceso.

He llegado hasta cuando se cumple el proceso de condición que esta en el libro 1 If Range("C36") = Range("B38") que podría ser If Range("B37") =  “PARAR” de esta forma:

Sub Grabar()

For A = 1 To 5

Select Case A

Case 1

hoja = "Hoja1"

Call OTRA

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("AG" & Rows.Count).End(xlUp).Offset(1, 0).Value = .Range("AG37")

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

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

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

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

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

 

End With

End Sub

 

Sub OTRA()

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

End Sub

Hasta qui llegue ahora seria abrir esta macro ABRIRLIBROSOLO_SEGUNDA y cerrar el Libro 1 con la macro Cerrarlibro

Lo intente de varias formas una de ellas:

Sub OTRA()

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

End

Cerrarlibro

End Sub

De todas formas adjunto libros

Un Saludo Feliz 2019


 

AdjuntoTamaño
File foro_ciclo_grabar_foro.rar259.95 KB
Cron
Imagen de Cron
Offline
última acción: Hace 8 meses 1 día
Nivel 1 - 200 puntosNivel 2 - 500 puntosNivel 3 - 1000 puntosNivel 4 - 2000 puntosNivel 5 - 4000 puntos
alta: 23/06/2010 - 12:30
Puntos: 12735
Feliz año nuevo!!Tío, tienes

Feliz año nuevo!!

Tío, tienes un cacao montado que no sé por dónde cogerlo. Tu código necesita un refactoring urgente. No sé qué es lo que quieres.

Parece que quieres arrancar las tres macros esperando un tiempo cada vez... ¿Por qué no vas una a una?

Parece que cierras el archivo inicial para ir ejecutando las macros que hay en los archivos que vas abriendo, y esas macros son iguales en todos... ¿Por qué no utilizas un archivo que solo sirva para tener el botón y las macros, y lo mantienes abierto todo el rato, y controlas mejor la ejecución del código?

Esto último es lo que yo suelo hacer. Voy abriendo y cerrando archivos según lo necesito, pero me hago un archivo "de tratamiento", que es donde está el código y es el que va abriendo y cerrando cada archivo con datos.

Luego hay cosas como esta. Tienes un bucle for que da valores a i de 1 a 5, y dentro un select case que hace una cosa por cada valor de i. Te puedes ahorrar la estructura for y la estructura select case, y el código hará exactamente lo mismo.

 

En definitiva, yo haría muchos apaños. Pero lo principal sería poner todo el código en un libro que no se cierre nunca, y desde ahí ir controlando qué quieres que pase en cada momento.

 

Un saludo

eugeniocol
Imagen de eugeniocol
Offline
última acción: Hace 2 años 3 meses
Nivel 1 - 200 puntos
alta: 29/08/2017 - 17:21
Puntos: 1675
respuesta

Me preguntas:

Parece que quieres arrancar las tres macros esperando un tiempo cada vez... ¿Por qué no vas una a una?

Pues porque intente hacerlo de una en una y me dio un montón de problemas, cuando graba en ciclo de grabar  al libro 1 estaba todavía abierto no se había cerrado. Por eso las macros con tiempos, para dar tiempo abrir, grabar y cerrar los libros en este caso son 3 pero tengo hasta 10 en una carpeta.

Entiendo que dices de hacer un libro maestro desde el cual controle todo???

Pero.... el montaje que trato de hacer es que  3 libros en sus carpetas correspondientes, comienza en carpeta 2010-2011  termina en carpeta 2018-2019

La teoría que trato de llevar a la práctica es que desde Libro 1 carpeta inicial 2010-2011 comience a grabar hojas hasta la condición en la Hoja 1 libro 3 (esto lo he cambiado el orden inicial) Range("C36") = Range("B38") y cuando se cumpla la condición en LIBRO 3 salte al siguiente LIBRO 1 carpeta 2011-2012  y suma y sigo hasta el final carpeta 2018-2019

Lo del Libro Maestro ¿?? Pues no lo acabo de ver mientras no consiga que el primer ciclo de grabar en la 1º carpeta los tres libros y salte al Libro 1 carpeta 2011-2012 cerrando el último Libro3  de carpeta 2010-2011 que es donde estoy ahora y no logro cerrar el ultimo Libro 3  y subo rar, (habrá que cambiar las rutas( pues lo del libro maestro acabo de ver su utilidad.

En cada carpeta la condición final de grabar es diferente su valor, puede ser 30, 35,40 ect…

Pdta.

Las estructuras y diseño de la macros para lo que pretendo seguro que se puede hacer mejor, pero yo de macros lo justito o menos.

Salud2…..

 

 

AdjuntoTamaño
File foro_ciclo_grabar_foro.rar305.71 KB
eugeniocol
Imagen de eugeniocol
Offline
última acción: Hace 2 años 3 meses
Nivel 1 - 200 puntos
alta: 29/08/2017 - 17:21
Puntos: 1675
respuesta

Mientras que encuentro la solución ,sigo trasteando ahora con estas macros eliminado las macros tiempos (veremos que pasa cuando esten el libro real que pesa mas)

Sub ABRIRYGUARDAR()

Call Grabar

Call ABRIRLIBROSOLO

Call Cerrarlibro

End Sub

Sub ABRIRLIBROSOLO()

Application.ScreenUpdating = False

Sheets("Hoja1").Select

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

Exit Sub

Workbooks.Open ThisWorkbook.Path & "\LIBRO 1.xlsm"

Sheets("Hoja1").Select

Range("F1").Select

Application.Run "'LIBRO 1.xlsm'!ABRIRYGUARDAR"

Exit Sub

End

End Sub

 Cuando en LIBRO3 que es el salto ahora al libro de siguiente carpeta, si LIBRO 3 tiene grabado hasta 3 ok salta al libro siguiente carpeta, pero si esta en 2 para completar a 3FINAL graba y cierra libro3 ya no sigue al libro siguiente carpeta.

Salud2…..

Cron
Imagen de Cron
Offline
última acción: Hace 8 meses 1 día
Nivel 1 - 200 puntosNivel 2 - 500 puntosNivel 3 - 1000 puntosNivel 4 - 2000 puntosNivel 5 - 4000 puntos
alta: 23/06/2010 - 12:30
Puntos: 12735
El problema que yo le sigo

El problema que yo le sigo viendo es que quieres iniciar una macro, y que sigan ejecutándose cosas cuando cierres el libro que tiene la macro. Es decir, como programador pierdes el control y se lo cedes al siguiente libro.

Sin embargo, en VBA no se pueden ejecutar dos macros a la vez (creo que hay alguna técnica black hat por ahí que permite algo parecido, pero básicamente es una línea cada vez).

Además, cuando lanzas una macro desde otra mediante call, lo que haces es ejecutarla en ese punto, pero la macro original se queda esperando a que termine y luego retoma el control. No estás lanzando hilos de ejecución en paralelo que ejecutan varias cosas a la vez. Eso no se puede hacer en VBA.

Si en la macro 2, que has lanzado desde la macro 1, cierras el libro, se deja de ejecutar.

Por eso mi sugerencia de tener todo el código en un libro que permanezca abierto todo el tiempo (solo un código se ejecuta a la vez, pero puede haber muchos libros abiertos en paralelo). Además, la sugerencia no es una idea feliz que se me ocurrió al responderte, es como resuelvo yo el mismo problema (actualizar varios libros de una tacada) para mis clientes.

 

Un saludo

eugeniocol
Imagen de eugeniocol
Offline
última acción: Hace 2 años 3 meses
Nivel 1 - 200 puntos
alta: 29/08/2017 - 17:21
Puntos: 1675
respuesta

Pues si me puedes poner en los libros que subi u otros un ejemplo ????

Cron
Imagen de Cron
Offline
última acción: Hace 8 meses 1 día
Nivel 1 - 200 puntosNivel 2 - 500 puntosNivel 3 - 1000 puntosNivel 4 - 2000 puntosNivel 5 - 4000 puntos
alta: 23/06/2010 - 12:30
Puntos: 12735
La verdad es que hacer eso

La verdad es que hacer eso lleva tiempo, y últimamente no voy muy sobrado para regalarlo.

Pero te contaré la idea lo más sencillamente que pueda.

Primero: Crear un archivo para hacer este trabajo. En este archivo estarán todas las macros, y desde este archivo se abrirán y cerrarán todos los demás.

Segundo: De alguna manera, permitir al usuario elegir las carpetas con las que vamos a trabajar. Esto se puede hacer con Application.FileDialog(msoFileDialogFolderPicker)

Tercero: Recorrer las carpetas seleccionadas por el usuario en el orden en que las suministró. Esto se puede hacer con la instrucción dir y con el método Workbooks.open

Cuarto: Tras abrir cada archivo, hacer lo que haya que hacer dentro y cerrarlo. Los datos que deban ser compartidos entre archivos se guardarán en variables preparadas para eso.

Siempre puedes volver al archivo inicial utilizando la constante ThisWorkBook.

Yo suelo crear una variable para referirme al archivo que abro, de manera que no tengo que recordar su nombre. Algo así como:

Workbooks.open(nombredellibro)
set wb as Activeworkbook
wb.sheets("Hoja1").cells(1,1).blablablabla

.

Application.DisplayAlerts = False
wb.close SaveChanges:=True
Application.DisplayAlerts = True

 

De esta manera, si lo que tienes que hacer en los libros es parecido, puedes meterlos en un bucle y facilitar mucho las cosas.

 

Un saludo

eugeniocol
Imagen de eugeniocol
Offline
última acción: Hace 2 años 3 meses
Nivel 1 - 200 puntos
alta: 29/08/2017 - 17:21
Puntos: 1675
respuesta

gracias por tu respuesta, pero ya lo solucione en estos dias si necesidad de un libro menu.

Empieza pinchando boton en Hoja1 en carpeta 2010-11 libro 1 y finaliza en carpeta 2013-14 libro 3

En libros originales con mas carpetas y mas hojas a grabar 10 hojas por libro ect.. o sea mas pesados, to ok.

Salud2...

 

AdjuntoTamaño
File foro_ciclo_grabar_foro.rar594.84 KB