¿Alguna vez ha querido ejecutar algún código de acceso en un horario automático?
Le mostraré cómo usar una aplicación de Access existente para ejecutarla y cerrarla correctamente cuando se inicia a través del Programador de tareas y, al mismo tiempo, presenta una interfaz de usuario amigable cuando la inicia un usuario final.
La clave para que funcione es /cmd
bandera.
Pasar argumentos de la línea de comandos para acceder
Para pasar un argumento de línea de comando para acceder, usa el /cmd
argumento de línea de comando al iniciar su aplicación:
Especifica que lo que sigue en la línea de comando es el valor que devolverá el Comando función. Esta opción debe ser el último interruptor en la línea de comando. Puede usar un punto y coma (;) como alternativa a /cmd .
Use este modificador para especificar un argumento de línea de comandos que se puede usar en el código de Visual Basic para Aplicaciones (VBA)
Para recuperar el texto que pasa en la línea de comando siguiendo el /cmd
argumento, usa el VBA.Command
función.
Puede usar esta función al inicio para redirigir su código para realizar cualquier tarea recurrente.
Ejemplo Práctico
- Crear una nueva base de datos
- Agregue el siguiente código a un nuevo módulo estándar:
Public Function Startup()
If Trim(VBA.Command) = "Nightly" Then
Shell "winver", vbNormalFocus
Application.Quit
End If
MsgBox "Start up"
End Function
- Crear una nueva macro
- Elija "Ejecutar código " del menú desplegable "Agregar nueva acción"
- Establecer "Nombre de la función" en
Startup()
- Cierre y guarde la macro como "AutoExec "
Ejecutar como usuario normal
Para probar la aplicación como un usuario normal, simplemente compacte y repare la base de datos.
Verá un cuadro de mensaje que dice "Iniciar".
Ejecutar como una tarea programada
Para imitar la ejecución como una tarea programada, cierre su base de datos y ejecútela con el siguiente comando:
"C:\Path\To\msaccess.exe" "C:\Path\To\MyDb.accdb" /cmd Nightly
Access parpadeará brevemente en la pantalla, luego verá el cuadro de diálogo "Acerca de Windows" y Access se cerrará solo.
Algunas Notas
AutoExec
es una macro especial que se ejecuta automáticamente al inicio- Aunque
Startup()
la rutina no devuelve ningún valor, la declaramos como unaFunction
porque no podemos llamar directamente a unSub
desde una macro en Access - Bajo uso normal, el código de la ventana cmd se omite
- Llamo explícitamente a
Application.Quit
dentro de mi bloque "Nightly" para evitar que Access cuelgue del código que requiere la interacción del usuario (como el código MsgBox en mi ejemplo) - Siempre llamo a
Trim()
alrededor delVBA.Command
función para evitar errores introducidos por espacios en blanco iniciales o finales en la línea de comando - Como alternativa a
/cmd
, también puedes usar el/x
cambie y pásele el nombre de una macro personalizada (No hago eso porque odio las macros con la pasión de miles de soles candentes; las únicas dos macros que uso sonAutoexec
yAutokeys
porque proporcionan una funcionalidad especial )
Una nota final sobre el Programador de tareas y la automatización de otras aplicaciones de oficina
Si su tarea no parece funcionar cuando la configuró para ejecutarse durante la noche, intente cambiar la opción de tarea programada a "Ejecutar solo cuando el usuario haya iniciado sesión".
Las aplicaciones de Office no están diseñadas para ejecutarse en lo que Windows llama modo "no interactivo". Si configura una tarea programada para "Ejecutar tanto si el usuario ha iniciado sesión como si no", esa tarea se ejecutará en modo no interactivo. Esto puede causar una variedad de problemas, especialmente si está automatizando Excel como parte del proceso recurrente.
La solución más sencilla es bloquear la estación de trabajo en lugar de cerrar la sesión y dejar la opción configurada en "Ejecutar solo cuando el usuario haya iniciado sesión".
Eso puede no ser práctico en su situación, pero es una consideración importante a tener en cuenta. Considérese advertido:
Microsoft actualmente no recomienda ni admite la automatización de las aplicaciones de Microsoft Office desde cualquier aplicación o componente cliente no interactivo y desatendido