【问题标题】:Running Microsoft Access as a Scheduled Task将 Microsoft Access 作为计划任务运行
【发布时间】:2013-12-13 05:56:18
【问题描述】:

我正在寻找有关如何安排数据库 (.accdb) 自动更新的 cmets,因为我对自己设置的流程不太满意。

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

  1. 任务计划程序调用 .bat
  2. .bat 调用 .vbs
  3. .vbs 打开数据库并调用宏
  4. 宏调用函数(VBA 级别)
  5. 函数调用更新子程序

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

显然(但请告诉我我错了以及如何更改它).vbs 不能调用子例程,只能调用宏。同样,如果用户希望进入数据库的 VB 环境,访问宏不能调用子程序而只能调用函数。这就是我调用函数(VBA 级别)然后调用子例程的原因。

希望你们中的一些人知道如何缩短步骤并最终掌握 .bat 和 .vbs

【问题讨论】:

  • (1) 您的.bat.vbs 脚本是否不仅仅是一行代码?如果没有,那么您可能只需更新您的计划任务以使用所需参数运行MSACCESS.EXE(2) 是的,Access 中的宏只能调用函数,但您可以将 Sub 转换为不返回任何内容(或返回诸如 True 之类的任意值)的函数。
  • 我尝试从任务计划程序调用 MSACCESS.EXE 但我没有成功,这就是我使用 .bat .vbs 方法的原因。会再试一次。我想我需要在 Access 中有一个计时器,然后触发更新...
  • 不,您使用 -x 命令行开关和要运行的宏的名称调用 MSACCESS.EXE。详情here.
  • 感谢 Gord - 看起来我的 .bat 和 .vbs scipts 即将消失 :)
  • vbs 可以肯定地调用一个标准的 VBA 子程序,事实上我很难找出任何其他方式。因此,您应该只需要一个 vbs 脚本。我发布了一个答案。

标签: ms-access batch-file vbscript auto-update


【解决方案1】:

据我所知,Windows 计划任务“在 Access 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

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

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

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

程序/脚本:

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

添加参数(可选)

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

【讨论】:

  • 对于参数,它需要在文件路径周围加上引号。 "C:\Users\Public\schedTest.accdb" /x DoSomething"
【解决方案2】:

vbs 脚本可以调用任何标准的 vba SUBROUTINE,如下所示:

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

accessApp.Run "TimeUpDate"

accessApp.Quit
set accessApp = nothing

请注意,子 TimeUpDate 是标准 VBA 子例程。这意味着没有 autoexec 宏,也没有宏 - 只有纯 VBA 子调用 + 这个 vbs 脚本。

【讨论】:

    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

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

      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 的剧本并尝试过。一切都很好,直到我尝试安排它。然后,出于某种神秘的原因,调度程序不会启动它。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-08-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多