Automatizar macros en fechas determinadas

Tengo una base de datos en la cual tengo creadas una serie de macros.

Esta macros me pasan datos de unas tablas a otras que llamo históricas.

Para ejecutar las macros creadas lo hago mediante un botón.

Quisiera que me ejecutara la macro automáticamente, por ejemplo

En una determinada fecha, y también que no me aparecieran los mensajes

De ejecución de la macro.

1 respuesta

Respuesta
1

Para lo que quieres, aunque se pueden utilizar macros, es mucho más flexible utilizar código en VBA.

Si por ejemplo, quieres que se haga la copia cada día 1 de mes, un ejemplo sería el siguiente:

Function HazCopia()
Dim DiaMes as integer
DiaMes = Day(Date)
If DiaMes = 1 Then
  Currentdb.Execute  "INSERT INTO TablaHistorico SELECT * FROM TablaOriginal"
End If
End Function

Con esto haces la copia de seguridad, si quieres que lo haga otro día, basta que cambies el número de DiaMes en la línea del If.

Para llamar a la función tienes que hacerlo en el Evento "Al Cargar" del formulario.

Gracias por contestarme.

Pero el caso es que no me funciona.

Mira tengo una tabla que se llama Dias y otra que se llama Historico_dias,

creé una macro que me actualiza la tabla Historico_dias que llamo

Actualizar_dias, al ejecutarla me pasa los datos de la primera tabla a la segunda tabla.

Lo que quiero es que me automatice la ejecución de la macro en un día del mes

concreto, no que me haga una copia de seguridad.

También la forma de que no me aparezcan los mensajes de actualización.

Muchísimas gracias por todo el trabajo que haceis.

Un saludo.

El código que te puse, no es para hacer una copia de seguridad, el nombre puede ser cualquiera, podría haberla llamado "TraspasaDatos" por ejemplo. Y en esencia, estás haciendo una copia de datos, puedes llamarla copia de seguridad, traspaso de datos, transferencia de información... como quieras. Técnicamente es una Copia de Seguridad de Históricos.

Las macros no se pueden automatizar desde Visual Basic, lo que sí se puede es convertir la macro a código de VBA y hacer un código que ejecute esa macro convertida.

Por lo que he entendido, tu macro pasa los datos de una tabla a otra, pero... ¿borras esos datos de la primera?

Te voy a poner el código que te copiará los datos de una tabla en la otra, y luego borra los datos de origen todos los días 1 de cada mes.

Function TraspasaDatos()
Dim DiaMes as integer
DiaMes = Day(Date)
If DiaMes = 1 Then
 Currentdb.Execute "INSERT INTO Historico_dias SELECT * FROM Dias"
Currentdb.Execute "DELETE * FROM Dias"
End If
End Function

Para hacerlo de forma más correcta, habría que tener un fichero, tabla o algo donde almacenar si se ha efectuado la copia de datos o no, ya que si el día 1 abres 2 veces la base de datos, hará el proceso 2 veces.

Para que funciones, tienes que abrir el formulario donde se vaya a ejecutar en modo diseño, ir a las propiedades del formulario y buscar el evento "Al Cargar", en ese evento (On_Load en VBA es donde has de escribir el código.

De esta forma, cuando se abre el formulario se ejecuta de forma automática la función, comprueba que el día sea 1 o no y hace la copia de datos o no en base al día.

Muchas gracias funciona perfectamente, pero hay algo que te quería comentar

abusando un poco de ti, es lo siguiente. A esta función le puedo poner una condición para que solo me pase los registros de una tabla a otra y los borre de la primera tabla pero si

se da la condición por ejemplo que el campo año este activado o que en ese campo tenga el año por ejemplo 2014 si está en blanco que no lo pase ni lo borre.

Muchísimas gracias.

Para hacer lo que quieres, debes utilizar una condición en las consultas.

Te podrían quedar así:

Currentdb.Execute "INSERT INTO Historico_dias SELECT * FROM Dias WHERE Trim(Año & '') <> ''"
Currentdb. Execute "DELETE * FROM Dias WHERE Trim(Año & '') <> ''"

Lo de que el campo año esté seleccionado no se puede hacer directamente, puedes hacer 2 cosas:

- Cargar los registros en un listbox, modificar la propiedad "MultiSelect" y ponerla a "Extendido" y por cófigo VBA recorrer el contenido y entonces mover el registro que no esté seleccionado en el ListBox.

- Agregar un campo booleano en la tabla "Días", marcar los registros que no quieres que se muevan y modificar la consulta para que no copie/borre el registro marcado. En este caso te pongo las consultas: (El campo booleano lo he llamado "boGuardar")

Currentdb.Execute "INSERT INTO Historico_dias SELECT * FROM Dias WHERE Trim(Año & '') <> '' And boGuardar = False"
Currentdb.Execute "DELETE * FROM Dias WHERE Trim(Año & '') <> '' And boGuardar = False"

(También puedes hacerlo al revés, copiar y borrar los marcados).

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas