2013-11-27 154 views
13

我正在寻求关于如何安排自动更新数据库(.accdb)的意见,因为我对自己设置的过程不太了解。作为计划任务运行Microsoft Access

目前,它的工作原理如下:

  1. 任务计划程序调用的.bat
  2. 蝙蝠调用一个.vbs
  3. .VBS打开数据库,并调用宏
  4. 的宏调用功能(VBA级别)
  5. 该函数调用更新子程序

我认为有太多的步骤,而且它需要2个与数据库相关的外部文件(.Bat和.vbs),并且存储在系统中会增加过程中断的风险。

显然(但请告诉我,我错了,我怎么能改变它).vbs不能调用子程序,只能调用一个宏。同样,如果用户期望进入数据库的VB环境,则访问宏不能调用子例程,而只能调用函数。这就是为什么我调用函数(VBA Level)然后调用子例程的原因。

希望一些你知道如何缩短步骤,最终得到了蝙蝠的乘坐和.vbs

+2

**(1)**无论是'.bat'还是'.vbs'脚本都不只是一行代码?如果没有,那么你可能只是更新你的预定任务来运行具有所需参数的'MSACCESS.EXE'。 **(2)**是的,Access中的宏只能调用一个函数,但是你可以将你的Sub转换成一个不返回任何东西的函数(或者返回一些像'True'这样的任意值)。 –

+0

我尝试从任务计划程序调用MSACCESS.EXE,但我没有成功,这就是为什么我使用.bat .vbs方法的原因。将再试一次。我supopose我需要在Access中有一个计时器,然后触发更新... – ProtoVB

+1

不,您使用'-x'命令行开关调用MSACCESS.EXE并且要运行宏的名称。详细信息[这里](http://support.microsoft.com/kb/209207)。 –

回答

18

据我所知为Windows计划任务的最短路径,以“做一些有用的访问VBA“为:

在数据库中创建一个公用函数(不是子)。例如:

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 

在数据库中创建一个宏调用该函数:

Macro.png

创建一个Windows计划任务调用MSACCESS.EXE适当的参数

SchedTask.png

在上面的对话框中,值为:

程序/脚本:

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

添加参数 (可选)

C:\Users\Public\schedTest.accdb /x DoSomething 
+2

对于参数,它需要引号围绕文件路径。 **“C:\ Users \ Public \ schedTest.accdb”/ x DoSomething“** –

4

有一个鲜为人知的技巧,可以追溯到早年的访问,以允许它作为一个运行过程仍然有效。 Access始终会在启动时查找名为“Autoexec”的宏。如果它发现它会立即开始执行这个宏。如果我需要在打开表单之前初始化程序,或者如原始提问者的情况那样,将访问作为没有用户I/O的计划进程运行,那么我发现这非常有用。

3

VBS脚本可以调用任何标准的VBA子程序有以下:

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

accessApp.Run "TimeUpDate" 

accessApp.Quit 
set accessApp = nothing 

注意,子TimeUpDate是一个标准的VBA子程序。这意味着没有autoexec marocrs,并且根本没有宏 - 只有纯粹的VBA sub调用+这个vbs脚本。

2

打我的头撞在墙上约四小时后,我终于得到这个工作:

1)创建一个行成为一个DOS批处理文件。该行由三部分组成:a)Microsoft Access的完整路径(msaccess.exe); b)Microsoft Access数据库的完整路径及其中的代码; c)Access命令行参数“/ x MacroName” 。前两项应该用引号括起来。我看起来像这样:

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

2)使用您在批处理文件中使用的名称在Access中创建一个宏。它有一个命令,RunCode,带有你想调用的VBA函数名称的参数。这应该跟着打开/关闭括号“()”。我没有尝试将任何参数传递给函数;我认为这会有问题。

4)确保您调用的VBA函数最后有一个Docmd.Quit命令,或者将其作为第二行添加到您的宏。这些将确保Access在您的流程运行后不​​会保持打开状态。

5)在Windows任务计划程序中,选择“创建基本任务”(调用向导)。将程序名称设置为DOS批处理文件的名称。有一个有用的复选框标记为“完成后打开属性窗口”。检查你是否进入了属性窗口。

6)设置任务运行,无论用户是否登录。同时检查“运行最高权限”框,哪一位朋友在这里建议。

您现在可以通过右键单击计划任务并选择运行命令来测试所有内容。

我喜欢Albert Kallal的剧本并尝试过。一切工作很好,直到我试图安排它。然后,出于某种神秘的原因,调度程序不会启动它。