publicado el 28 de diciembre6 años 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.
publicado el 28 de diciembre6 años 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...???
publicado el 28 de diciembre6 años Autor 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
publicado el 28 de diciembre6 años 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 el 28 de diciembre6 años por Leopoldo Blancas
publicado el 28 de diciembre6 años Autor @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
publicado el 28 de diciembre6 años 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 el 28 de diciembre6 años por Leopoldo Blancas
publicado el 28 de diciembre6 años Autor 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.
publicado el 30 de diciembre6 años 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
publicado el 30 de diciembre6 años 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!
publicado el 30 de diciembre6 años 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.
publicado el 30 de diciembre6 años 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.
publicado el 30 de diciembre6 años 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.
publicado el 30 de diciembre6 años 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
publicado el 30 de diciembre6 años 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.
publicado el 30 de diciembre6 años 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
publicado el 30 de diciembre6 años Hace 14 minutos , Antoni dijo: lo del día 30 o 31 es irrelevante ???
publicado el 30 de diciembre6 años Autor 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
publicado el 30 de diciembre6 años 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?
publicado el 30 de diciembre6 años 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 el 30 de diciembre6 años por Leopoldo Blancas
publicado el 30 de diciembre6 años @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.
publicado el 30 de diciembre6 años Autor 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
publicado el 31 de diciembre6 años 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 el 31 de diciembre6 años por ikanni
publicado el 31 de diciembre6 años Hace 8 horas, ikanni dijo: Ya veo que no me he explicado (Salvo Antoni).
publicado el 9 de enero6 años Autor @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 el 9 de enero6 años por jose lopez contreras
publicado el 10 de enero6 años Hola, Pues no se que puede pasar, es tan sencillo el codigo que tu mismo lo podrias reparar. Yo pondria un punto de interrupción en el If ...... y ver que datos esta pasando y actuar en consecuencia, es que el codigo no tiene mas complicación. No se me ocurre otra cosa.
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.