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...
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
[comentario movido a tema nuevo en el foro: http://www.necesitomas.com/convertir-horas-minutos]
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
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
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
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…..
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…..
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
Pues si me puedes poner en los libros que subi u otros un ejemplo ????
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
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...