jose lopez contreras 9 Informar mensaje Publicado el 28 de diciembre Quisiera ver si es posible que una macro se ejecute solo el día 30 de diciembre de cada año siempre y cuando no sea domingo, ahora si es domingo que se ejecute un día antes es decir el sábado, 30 de diciembre. Compartir este mensaje Enlace a mensaje Compartir con otras webs
Leopoldo Blancas 381 Informar mensaje Publicado el 28 de diciembre Hace 3 horas, jose lopez contreras dijo: Quisiera ver si es posible que una macro se ejecute solo el día 30 de diciembre de cada año siempre y cuando no sea domingo, ahora si es domingo que se ejecute un día antes es decir el sábado, 30 de diciembre. Osea le vamos a cambiar la fecha del calendario? Para todo el mundo...??? Compartir este mensaje Enlace a mensaje Compartir con otras webs
jose lopez contreras 9 Informar mensaje Publicado el 28 de diciembre Hace 1 minuto , Leopoldo Blancas dijo: Osea le vamos a cambiar la fecha del calendario? Para todo el mundo...??? @Leopoldo Blancas Perdón quise decir que una macro que tengo quiero se ejecute el día 31 de diciembre siempre y cuando no sea domingo, si llegase a ser domingo se ejecute el día sábado, 30 de diciembre. Mira lo que tengo a lo mejor podrás ayudarme Guarda libro FinAño.rar Compartir este mensaje Enlace a mensaje Compartir con otras webs
Leopoldo Blancas 381 Informar mensaje Publicado el 28 de diciembre (editado) Una solución...(pude ahorrar variables... pero para que te quede mas claro!!!) Sub FinDeAño() Dim Dia$, nDia&, Mes$, Dia2$, nDia2&, Mes2$ Dia = VBA.Format(VBA.Now + 1, "dddd") nDia = VBA.Format(VBA.Now + 1, "d") Mes = VBA.Format(VBA.Now + 1, "mmmm") Dia2 = VBA.Format(VBA.Now, "dddd") nDia2 = VBA.Format(VBA.Now, "d") Mes2 = VBA.Format(VBA.Now, "mmmm") If Dia = "domingo" And nDia = 31 And Mes = "diciembre" Then 'Ejecuta la Macro ElseIf Dia2 <> "domingo" And nDia2 = 31 And Mes2 = "diciembre" Then 'Ejecuta la Macro End If End Sub Saludos Editado el 28 de diciembre por Leopoldo Blancas 1 jose lopez contreras reacted to this Compartir este mensaje Enlace a mensaje Compartir con otras webs
jose lopez contreras 9 Informar mensaje Publicado el 28 de diciembre @Leopoldo Blancas excelente trabajo, pero aquí como le podre hacer para que tu instrucción no se ejecute una segunda vez ya que pretendo ponerla en ThisWorkbook ya que el libro se abre varias veces al día Compartir este mensaje Enlace a mensaje Compartir con otras webs
Leopoldo Blancas 381 Informar mensaje Publicado el 28 de diciembre (editado) Hace 19 minutos , jose lopez contreras dijo: pero aquí como le podre hacer para que tu instrucción no se ejecute una segunda vez ya que pretendo ponerla en ThisWorkbook ya que el libro se abre varias veces al día ... que paso con esa falta de ideas... imaginación... cualquier chispa que salga de esas neuronas es bueno... APRENDE LO BÁSICO DE VBA EXCEL.... Una simple solución... hay muchas. Sub FinDeAño() Dim Dia$, nDia&, Mes$, Dia2$, nDia2&, Mes2$ If Hoja1.Cells(1, 1) = "YA SE EJECUTO LA MACRO" Then Exit Sub Dia = VBA.Format(VBA.Now + 1, "dddd") nDia = VBA.Format(VBA.Now + 1, "d") nMes = VBA.Format(VBA.Now + 1, "mmmm") Dia2 = VBA.Format(VBA.Now, "dddd") nDia2 = VBA.Format(VBA.Now, "d") nMes2 = VBA.Format(VBA.Now, "mmmm") If Dia = "domingo" And nDia = 31 And Mes = "diciembre" Then 'Ejecuta la Macro Hoja1.Cells(1, 1) = "YA SE EJECUTO LA MACRO" ElseIf Dia2 <> "domingo" And nDia2 = 31 And Mes2 = "diciembre" Then 'Ejecuta la Macro Hoja1.Cells(1, 1) = "YA SE EJECUTO LA MACRO" End If End Sub . . . Saludos!!! Editado el 28 de diciembre por Leopoldo Blancas 1 1 Alfonso5597 y avalencia reacted to this Compartir este mensaje Enlace a mensaje Compartir con otras webs
jose lopez contreras 9 Informar mensaje Publicado el 28 de diciembre Hace 46 minutos , Leopoldo Blancas dijo: ... que paso con esa falta de ideas... imaginación... cualquier chispa que salga de esas neuronas es bueno... APRENDE LO BÁSICO DE VBA EXCEL.. con tu apoyo y motivación Sub FinDeAño() Application.ScreenUpdating = False 'evita que se vean los cambios de las ventanas Application.DisplayAlerts = False 'evita que se vean los anuncios al guardar Dim Dia$, nDia&, Mes$, Dia2$, nDia2&, Mes2$ Dia = VBA.Format(VBA.Now + 1, "dddd") nDia = VBA.Format(VBA.Now + 1, "d") Mes = VBA.Format(VBA.Now + 1, "mmmm") Dia2 = VBA.Format(VBA.Now, "dddd") nDia2 = VBA.Format(VBA.Now, "d") Mes2 = VBA.Format(VBA.Now, "mmmm") If Dia2 <> "domingo" And nDia2 <> 31 Then Sheets("Hoja1").Range("F2").ClearContents End If If Sheets("Hoja1").Range("F2") = "Datos Copiados" Then Exit Sub If Dia = "domingo" And nDia = 31 And Mes = "diciembre" Then 'Ejecuta la Macro '//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// Sheets("Hoja1").Range("F2") = "Datos Copiados" Workbooks.Open ThisWorkbook.Path & "\Reporte anual\Reporte anual.xlsx" 'abrir el archivo en cualquier escritorio Workbooks("Libro1.xlsm").Worksheets("Hoja2").Copy After:=Workbooks("Reporte anual.xlsx").Sheets(1) ' copiar hoja en otro libro ActiveSheet.Name = Year(Now()) ' dar nombre del año a nueva hoja ActiveWorkbook.Save 'salva el arvhivo ActiveWindow.Close 'lo cierra Worksheets("Hoja2").Select Range("A1").Select Rows("2:" & Rows.Count).ClearContents '//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// Else If Dia2 <> "domingo" And nDia2 = 31 And Mes2 = "diciembre" Then 'Ejecuta la Macro '//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// Sheets("Hoja1").Range("F2") = "Datos Copiados" Workbooks.Open ThisWorkbook.Path & "\Reporte anual\Reporte anual.xlsx" 'abrir el archivo en cualquier escritorio Workbooks("Libro1.xlsm").Worksheets("Hoja2").Copy After:=Workbooks("Reporte anual.xlsx").Sheets(1) ' copiar hoja en otro libro ActiveSheet.Name = Year(Now()) ' dar nombre del año a nueva hoja ActiveWorkbook.Save 'salva el arvhivo ActiveWindow.Close 'lo cierra Worksheets("Hoja2").Select Range("A1").Select Rows("2:" & Rows.Count).ClearContents End If End If Application.DisplayAlerts = True 'activa las alertas Application.ScreenUpdating = True 'activa la actualización de la pantalla End Sub quedo al final. Compartir este mensaje Enlace a mensaje Compartir con otras webs
ikanni 108 Informar mensaje Publicado el 30 de diciembre Hola, Yo creo que se puede enfocar tambien de otra manera. En vez de buscar la ultima fecha del año, para hacer copia o algo parecido, se puede trabajar con la primera vez que se abre el excel en un año. Osea Si tu abres el excel y es la primera vez del año que la abres se podria hacer entonces la copia. Ademas que te aseguras que ya esta cerrado el año anterior. que me enrollo. Lo hago es que compruebe la ultima fecha que se ha modificado el archivo y si es un año mas que haga la copia. Sub FinDeAno() Dim fecha As String fecha = filedatetime(ActiveWorkbook.Path) If VBA.Format(CDate(fecha), "yyyy") = VBA.Format(Date, "yyyy") + 1 Then 'ejecuta Macro End If End Sub Cita 1 Leopoldo Blancas reacted to this Compartir este mensaje Enlace a mensaje Compartir con otras webs
Gerson Pineda 3255 Informar mensaje Publicado el 30 de diciembre Hace 9 horas, ikanni dijo: Hola, Yo creo que se puede enfocar tambien de otra manera. En vez de buscar la ultima fecha del año, para hacer copia o algo parecido, se puede trabajar con la primera vez que se abre el excel en un año. Osea Si tu abres el excel y es la primera vez del año que la abres se podria hacer entonces la copia. Ademas que te aseguras que ya esta cerrado el año anterior. que me enrollo. Lo hago es que compruebe la ultima fecha que se ha modificado el archivo y si es un año mas que haga la copia. Sub FinDeAno() Dim fecha As String fecha = filedatetime(ActiveWorkbook.Path) If VBA.Format(CDate(fecha), "yyyy") = VBA.Format(Date, "yyyy") + 1 Then 'ejecuta Macro End If End Sub Pero se te escapa, comparar si es 30 Dic y si no es sábado, asumo que el libro debe estar actualizado para esa fecha Saludos a todos! Compartir este mensaje Enlace a mensaje Compartir con otras webs
Leopoldo Blancas 381 Informar mensaje Publicado el 30 de diciembre Hace 9 horas, ikanni dijo: Hola, Yo creo que se puede enfocar tambien de otra manera. En vez de buscar la ultima fecha del año, para hacer copia o algo parecido, se puede trabajar con la primera vez que se abre el excel en un año. Osea Si tu abres el excel y es la primera vez del año que la abres se podria hacer entonces la copia. Ademas que te aseguras que ya esta cerrado el año anterior. que me enrollo. Lo hago es que compruebe la ultima fecha que se ha modificado el archivo y si es un año mas que haga la copia. Sub FinDeAno() Dim fecha As String fecha = filedatetime(ActiveWorkbook.Path) If VBA.Format(CDate(fecha), "yyyy") = VBA.Format(Date, "yyyy") + 1 Then 'ejecuta Macro End If End Sub Se te escapa verificar si es 31 y es domingo y si el mes diciembre.... revisa por favor los primeros Post..... Saludos. Compartir este mensaje Enlace a mensaje Compartir con otras webs
Antoni 4223 Informar mensaje Publicado el 30 de diciembre Hace 1 hora, Leopoldo Blancas dijo: Se te escapa verificar si es 31 y es domingo y si el mes diciembre.... revisa por favor los primeros Post..... Saludos. Pero, ¿has entendido lo que propone ikanni?, porqué me da la impresión que no. Compartir este mensaje Enlace a mensaje Compartir con otras webs
Leopoldo Blancas 381 Informar mensaje Publicado el 30 de diciembre Hace 11 minutos , Antoni dijo: Pero, ¿has entendido lo que propone ikanni?, porqué me da la impresión que no. Perfectamente...!!! y por eso respondio Gerson Pineda: Hace 1 hora, Gerson Pineda dijo: Pero se te escapa, comparar si es 30 Dic y si no es sábado, asumo que el libro debe estar actualizado para esa fecha Saludos a todos! Saludos. Compartir este mensaje Enlace a mensaje Compartir con otras webs
Leopoldo Blancas 381 Informar mensaje Publicado el 30 de diciembre Hace 17 minutos , Antoni dijo: Pero, ¿has entendido lo que propone ikanni?, porqué me da la impresión que no. Si Antoni, te explico... Sub FinDeAno() Dim fecha As String' DECLARA VARIABLE ' SACA LA FECHA DEL ARCHIVO DE LA ULTIMA VEZ QUE FUE GUARDADO. fecha = filedatetime(ActiveWorkbook.Path) 'COMPARA SI YA ES OTRO AÑO CON LA FECHA DE LA ULTIMA VEZ QUE SE GUARDO EL ARCHIVO If VBA.Format(CDate(fecha), "yyyy") = VBA.Format(Date, "yyyy") + 1 Then 'CUANDO SE EJECUTA LA MACRO YA VAMOS A ESTAR EN EL 2019 Y 'EL SOLICITANTE TIENE QUE EJECUTAR LA MACRO ANTES QUE TERMINE EL AÑO, 'EL DIA 30 SI EL 31 ES DOMINGO.... 'ejecuta Macro End If End Sub Compartir este mensaje Enlace a mensaje Compartir con otras webs
Antoni 4223 Informar mensaje Publicado el 30 de diciembre El solicitante lo que quiere es guardar el archivo tal como queda a fin de año y eso es lo que propone Ikanni, lo del día 30 o 31 es irrelevante, el solicitante dice lo del domingo porqué está claro que el domingo no trabaja y de ahí lo de hacer la copia el sábado. 1 Leopoldo Blancas reacted to this Compartir este mensaje Enlace a mensaje Compartir con otras webs
Leopoldo Blancas 381 Informar mensaje Publicado el 30 de diciembre En 28/12/2018 at 12:00 , jose lopez contreras dijo: Perdón quise decir que una macro que tengo quiero se ejecute el día 31 de diciembre siempre y cuando no sea domingo, si llegase a ser domingo se ejecute el día sábado, 30 de diciembre. En 28/12/2018 at 13:08 , jose lopez contreras dijo: como le podre hacer para que tu instrucción no se ejecute una segunda vez ya que pretendo ponerla en ThisWorkbook ya que el libro se abre varias veces al día Saludos @Antoni Compartir este mensaje Enlace a mensaje Compartir con otras webs
Leopoldo Blancas 381 Informar mensaje Publicado el 30 de diciembre Hace 14 minutos , Antoni dijo: lo del día 30 o 31 es irrelevante ??? Compartir este mensaje Enlace a mensaje Compartir con otras webs
jose lopez contreras 9 Informar mensaje Publicado el 30 de diciembre Gracias a todos por preocuparse a mi solicitud y a sus comentarios pero Antoni tiene toda la razón los domingos no trabajamos y esa era mi preocupación por si el 31 cae en domingo, mañana se activará la instrucción proporcionada por Leopoldo y para el próximo año aplicare la recomendación de Ikanni claro antes la probaré para estudiar su funcionalidad. Antes de despedirme les deseo lo mejor para este año 2019 a todos los del foro en especial a Leopoldo Blancas, Antoni, Gerson Pineda que sin sus apoyos y observaciones (regaños jajaja) no fuese posible ir aprendiendo. Feliz año. Gracias 2 2 avalencia, Leopoldo Blancas, Antoni y 1 other reacted to this Compartir este mensaje Enlace a mensaje Compartir con otras webs
Antoni 4223 Informar mensaje Publicado el 30 de diciembre Hace 12 horas, ikanni dijo: Hola, Yo creo que se puede enfocar tambien de otra manera. En vez de buscar la ultima fecha del año, para hacer copia o algo parecido, se puede trabajar con la primera vez que se abre el excel en un año. Osea Si tu abres el excel y es la primera vez del año que la abres se podria hacer entonces la copia. Ademas que te aseguras que ya esta cerrado el año anterior. que me enrollo. Lo hago es que compruebe la ultima fecha que se ha modificado el archivo y si es un año mas que haga la copia. Sub FinDeAno() Dim fecha As String fecha = filedatetime(ActiveWorkbook.Path) If VBA.Format(CDate(fecha), "yyyy") = VBA.Format(Date, "yyyy") + 1 Then 'ejecuta Macro End If End Sub Ikanni ¿No debería ser .FullName en lugar de .Path? 1 Leopoldo Blancas reacted to this Compartir este mensaje Enlace a mensaje Compartir con otras webs
Leopoldo Blancas 381 Informar mensaje Publicado el 30 de diciembre (editado) Buena observación @Antoni... Pero analizando el código de Ikanni... esto nunca se va a cumplir... If VBA.Format(CDate(fecha), "yyyy") = VBA.Format(Date, "yyyy") + 1 Then El archivo... Si lo grabo en 2018 y estamos en 2018... en termino de la derecha sera 2019 y 2018<>2019 Si lo grabo en 2018 y estamos en 2019... en termino de la derecha sera 2020 y 2018<>2020 Si lo grabo en 2019 y estamos ya en 2019... el termino de la derecha sera 2020... 2019<>2020 .... Saludos. Editado el 30 de diciembre por Leopoldo Blancas Compartir este mensaje Enlace a mensaje Compartir con otras webs
Antoni 4223 Informar mensaje Publicado el 30 de diciembre Es -1 en lugar de +1 Compartir este mensaje Enlace a mensaje Compartir con otras webs
Leopoldo Blancas 381 Informar mensaje Publicado el 30 de diciembre @Antoni, Así es... Pero como @jose lopez contreras se quiere ir tranquilo a festejar el fin de año y no dejar pendientes... No se esperará hasta el otro año a terminar su trabajo... ya que @jose lopez contreras es muy dedicado y cumplidor... Saludos. Compartir este mensaje Enlace a mensaje Compartir con otras webs
jose lopez contreras 9 Informar mensaje Publicado el 30 de diciembre Jajaja Leopoldo sigo pendiente e interesado de sus comentarios y preocupado porque hoy vivo y mañana no se por lo que no quiero dejarle pendientes a mis hijos. Gracias probaré todas y cada uno de sus observaciones Compartir este mensaje Enlace a mensaje Compartir con otras webs
ikanni 108 Informar mensaje Publicado el 31 de diciembre (editado) Hola, Ya veo que no me he explicado (Salvo Antoni). Una cosa es crear una macro para que se ejecute el ultimo dia de trabajo del año. Eso con lleva que la excel tiene que estar abierta y seguramente un usuario operando el ultimo dia de trabajo del año y hacer una copia de seguridad. y que habria que hacerla al cerrar el libro, ovbiamente. Lo que yo propongo es que la copia de seguridad se haga automaticamente el primer dia del año nuevo. El usuario el primer diia de trabajo abrira la excel y en ese momento se ejecuta la macro, comprueba que es un año mas que la ultima fecha de modificacion del archivo excel en curso y si es verdadero hacemos la copia. Antoni tenias razon es FullName y es +1 pero en la parte izquierda, (Lo hice a pelo sin probar), lo que queria era plasmar la idea. Explicando el codigo Sub FinDeAno() Dim fecha As String ' la Funcion 'filedatetime' te devuelve un dato tipo Variant(date) ' con la fecha de la ultima modificacion del archivo en curso fecha = FileDateTime(ActiveWorkbook.FullName) ' Por cuestion de lógica si el archivo al abrirse y compara que la fecha ultima de modificacion del archivo en curso ' es igual al año en curso + 1 (Se supone que es +1, sino es asi no pasa por If..) ' eso quiere decir que es la primera vez que abro el archivo este año nuevo ' momento de hacer la copia If VBA.Format(CDate(fecha), "yyyy") + 1 = VBA.Format(Date, "yyyy") Then 'ejecuta Macro End If End Sub Editado el 31 de diciembre por ikanni 1 Antoni reacted to this Compartir este mensaje Enlace a mensaje Compartir con otras webs
Leopoldo Blancas 381 Informar mensaje Publicado el 31 de diciembre Hace 8 horas, ikanni dijo: Ya veo que no me he explicado (Salvo Antoni). Compartir este mensaje Enlace a mensaje Compartir con otras webs
jose lopez contreras 9 Informar mensaje Publicado el 9 de enero (editado) @ikanni hola buenas tardes seguí tus recomendaciones tal cual, coloque la macro en un modulo , guarde el libro con fecha del día de hoy, posteriormente cambie la fecha al día 1 de enero del 2020 en el sistema de mi PC pero al abrir el libro con esta nueva fecha se debería ejecutar la macro pero no sucede nada. que crees que este sucediendo. obvio desde Private Sub Workbook_Open() llamo la macro FinDeAño. P.D. la macro proporcionada por @Leopoldo Blancas funciono. Sub FinDeAño() Dim fecha As String fecha = FileDateTime(ActiveWorkbook.FullName) If VBA.Format(CDate(fecha), "yyyy") + 1 = VBA.Format(Date, "yyyy") Then 'ejecuta Macro Workbooks.Open ThisWorkbook.path & "\Reporte anual de Salidas\Reporte anual de Salidas.xlsm" 'abrir el archivo en cualquier escritorio Workbooks("Control JOLOCO Almacenes V 9.9.4.xlsm").Worksheets("Salidas").Copy After:=Workbooks("Reporte anual de Salidas.xlsm").Sheets(1) ' copiar hoja en otro libro ActiveSheet.Name = Year(Now()) ' dar nombre del año a nueva hoja ActiveWorkbook.Save 'salva el arvhivo ActiveWindow.Close 'lo cierra Worksheets("Salidas").Select Range("A1").Select Rows("2:" & Rows.Count).ClearContents End If End Sub Editado el 9 de enero por jose lopez contreras 1 Leopoldo Blancas reacted to this Compartir este mensaje Enlace a mensaje Compartir con otras webs