Executar o acesso Microsoft como uma tarefa agendada

Estou à procura de comentários sobre como agendar actualizações automáticas de uma base de dados (.accdb) uma vez que não estou muito confortável com o processo que criei.

actualmente, funciona como segue:

  1. o escalonador de Tarefas Chama a.bat
  2. .bat Chama a.vbs
  3. .o vbs abre a base de dados e chama uma macro
  4. a macro chama uma função (nível VBA)
  5. a função chama a sub-rotina de actualização
Acho que há demasiados passos e o facto de requer dois ficheiros externos.Bat and .vbs) relacionados com a base de dados e armazenados no sistema aumentam o risco de que o procedimento iria quebrar.

Aparentemente (mas, por favor, diga-me que estou errado e como posso mudá-lo) .vbs não pode chamar uma subrotina, mas apenas uma macro. Identicamente, uma macro de acesso não pode chamar uma subrotina, mas apenas uma função se o usuário estiver esperando entrar no ambiente VB do banco de dados. Esta é a razão pela qual eu chamei uma função (nível VBA) que, em seguida, chama o rotina.

Espero que alguns de vocês saibam encurtar os passos e, eventualmente, obter boleia do .bat and .vbs

Author: Gord Thompson, 2013-11-27

4 answers

Tanto quanto sei, o caminho mais curto para uma tarefa do Windows agendada para "fazer algo útil no acesso VBA" é:

Criar Uma Função Pública (não Sub) na base de dados. Por exemplo:

Option Compare Database
Option Explicit

Public Function WriteToTable1()
    Dim cdb As DAO.Database
    Set cdb = CurrentDb
    cdb.Execute "INSERT INTO Table1 (textCol) VALUES ('sched test')", dbFailOnError
    Set cdb = Nothing
    Application.Quit
End Function

Crie uma Macro na base de dados para invocar a função:

Macro.png

Crie uma tarefa agendada para o Windows para invocar o MSACCESS.EXE com os parâmetros apropriados

SchedTask.png

Na janela acima os valores são:

Programa/Programa:

"C:\Program Files\Microsoft Office\Office14\MSACCESS.EXE"

Adicionar argumentos (opcional):

C:\Users\Public\schedTest.accdb /x DoSomething
 20
Author: Gord Thompson, 2013-11-27 19:55:48
Há um pequeno truque conhecido que remonta aos primeiros anos de Acesso para permitir que funcione como um processo que ainda funciona. O Access irá sempre na inicialização procurar por uma macro chamada "Autoexec". Se o encontrar, começará imediatamente a executar esta macro. Acho que isso é extremamente útil se eu precisar inicializar o programa antes de abrir formulários ou, como no caso do questionador original, executar o acesso como um processo agendado sem o usuário I / O.
 4
Author: Andrew Thackray, 2015-03-07 22:33:35

Um script vbs pode chamar qualquer sub-rotina padrão de vba com o seguinte:

dim accessApp
set accessApp = createObject("Access.Application")
accessApp.OpenCurrentDataBase("C:\MyApp\MultiSelect.mdb")

accessApp.Run "TimeUpDate"

accessApp.Quit
set accessApp = nothing

Note que a sub-data é uma sub-rotina VBA padrão. Isto significa que não há marocrs autoexec, e não há macros em todas as chamadas sub VBA puras + este script vbs.

 4
Author: Albert D. Kallal, 2015-03-07 23:17:23
Depois de bater com a cabeça contra a parede durante quatro horas, finalmente consegui que isto funcionasse.

1) Crie um ficheiro em lote DOS com uma linha. A linha é composta por três partes a) o caminho completo para o Microsoft Access (msaccess.exe), b) the full path of the Microsoft Access database with the code in it, and c) the Access command line argument "/x MacroName". Os dois primeiros itens DEVEM SER rodeados de citações. O meu parece-se com isto.

"C:\Program Files (x86)\Microsoft Office\Office14\MSACCESS.EXE" "C:\MyPrograms\ProdDB Reports\ProdDB Reports.accdb" /X DailyTestReportsRun

2) Criar uma macro dentro de Acesse com o nome que usou no seu ficheiro em lote. Ele tem um comando, RunCode, com um argumento do nome de uma função VBA que você deseja chamar. Isto deve ser seguido por parêntesis aberto/fechado "()". Eu não tentei passar quaisquer parâmetros para a função; eu acho que isso seria problemático.

4) Certifique-se que a função VBA a que chama tem um comando Docmd.Quit no final, ou que adiciona isto como uma segunda linha à sua macro. Estes irão certificar-se de que o acesso não fica aberto após o seu processo passa.

5) no escalonamento de Tarefas do Windows, seleccione "Criar uma tarefa básica" (que invoca um assistente). Defina o nome do programa como o nome do seu ficheiro em lote do DOS. Há uma opção útil chamada algo como "Abra a janela de propriedades quando eu terminar."Verifique isso para que você vá para a janela de propriedades.

6) Defina a tarefa a executar independentemente de o utilizador estar ligado ou não. Também assinale a opção" Executar com os privilégios mais elevados", qual dos amigos aqui afirmar.

Poderá agora testar tudo se carregar com o botão direito na tarefa agendada e seleccionar o comando Executar.

Gostei do guião do Albert Kallal e tentei. Correu tudo bem até eu tentar marcar. Então, por alguma razão misteriosa, o programador não o iniciaria.
 2
Author: Karl Hoaglund, 2015-05-17 21:48:45