安排 MS Access 模块

Posted

技术标签:

【中文标题】安排 MS Access 模块【英文标题】:Schedule MS Access Module 【发布时间】:2017-04-16 02:10:41 【问题描述】:

是否可以在 MS Access 中安排模块每天在特定时间运行?如果不可能,那么安排 MS Access 中的模块每天运行的最佳和最简单的方法是什么?

脚本用于将表从 MS Access 导出到 xls 文件,如下所示

 Dim outputFileName As String
 outputFileName = CurrentProject.Path & "\Export_" & Format(Date, "yyyyMMdd") & ".xls"
 DoCmd.TransferSpreadsheet acExport, acSpreadsheetTypeExcel9, "bolnickiracun", outputFileName, True

【问题讨论】:

使用表单计时器并让数据库保持打开状态,如果您在访问范围内进行操作。 @Nathan_Sav 问题是,大约有 10 个 Access 数据库,我想导出 .xlsx 中的每个数据库,然后在 mysql 中安排自动导入,我已经完成了那部分,但我没有不知道是否可以在Access中调度模型,并且DB非常大,并且不断打开所有Access文件,RAM会一直满 看看这个:***.com/questions/20245053/… @tom preston 我尝试了那个解决方案,但对我来说它不起作用,或者我不知道这样做,我也不明白 /x 是什么意思以及需要放什么而是“这一行中的 DoSomething” C:\Users\Public\schedTest.accdb /x DoSomething 创建 1 个链接数据库,控制它并使用表单计时器打开相关的访问数据库并做它需要做的事情。具有数据库名称、执行时间、执行宏等的表... 【参考方案1】:

2 个解决方案


表单计时器

此解决方案要求您始终打开 Access 应用程序。

创建表单

在表单事件中:

将定时器间隔设置为 60000

创建一个On Timer 过程,您可以在其中调用模块的子程序

应该打开表单以触发计时器。您可以在应用程序启动时在选项/当前数据库/显示表单中打开它


Windows 计划任务

我认为此解决方案更好,因为它不需要运行 MS 访问应用程序。

在 Access 应用程序中:

    创建一个新宏并将其命名为“AutoExec”,以便在应用程序启动时触发它。

    在设计视图中打开宏并添加类型为 RunCode 的新操作,在 Function Name 下添加模块的主要子或功能。 p>

    在你的模块子的末尾,添加这个以在代码执行后关闭 MS Access 应用程序:docmd.Quit

在 Windows 中:

    在任意位置创建批处理文件(名为anything.bat 的新文件)

    编辑您的批处理文件并将此代码添加到其中(当然相应地调整路径/ accdb 名称)

    start "" "C:\pathToTheApplication\MSAccessAppName.accdb"
    Exit
    

    在 Windows 任务计划程序中创建一个任务(开始菜单并搜索 任务计划程序),该任务将在您需要时触发您的批处理文件。谷歌如何做到这一点或只是看看here 的一些想法

【讨论】:

我得到一个错误,它说我需要“验证表达式中的每个名称都引用一个唯一的对象”,有什么问题? @MPetrovic 很高兴听到,但您实施了哪种解决方案? 我使用了第二种解决方案,“Windows 计划任务”。另外,我有一个道德问题。如果我们设置为自动打开 Access ,并且在运行查询以关闭 Access 之后,就没有更多的可能性来正常使用该 Access db ,那就不好了,但是,如果我将 DB 链接到另一个 Access 并在该访问中执行这个步骤,我的问题是,如果我在链接数据库中这样做,这些步骤会影响原始数据库吗? 好吧,首先解释一下为什么“在运行查询以关闭 Access 之后,再不能正常使用该 Access db 了,那就不好了”。这个应该没什么问题,我也不是很明白是什么问题。 您说最好在脚本末尾添加 docmd.Quit 以在获得我想要关闭 Access 的内容后自动执行,您还说,我需要添加 AutoExec 作为宏的名称自动运行宏。问题是,如果您尝试正常打开该 Access DB,它将自动运行宏 AutoExec,并在成功执行后关闭 Access。如果在后台 AutoExec 宏正在等待启动该特定 Access,我希望我更清楚【参考方案2】:

使用 Windows 任务计划程序打开 Access。

http://www.sevenforums.com/tutorials/11949-elevated-program-shortcut-without-uac-prompt-create.html

dim accessApp
set accessApp = createObject("Access.Application")
accessApp.visible = true

accessApp.UserControl = true

accessApp.OpenCurrentDataBase("C:\path.accdb")
accessApp.Run "myLinker"

此外,一旦任务计划程序打开 Access,您就可以控制其他事件。

打开

打开发生在加载之前,并允许您取消,因此它不会打开。它还允许访问 OpenArgs。如果您的表单需要用户输入,这会很有帮助。如果未提供,您可以取消 Form.Open 或提示用户输入所需的值。

Private Sub Form_Open(Cancel As Integer)
     If "" & OpenArgs = "" Then
         Cancel = True
         Msgbox "Open Arguments are required"
     End If 
End Sub

加载

加载发生在 Open 之后,并且缺少 Open 提供的任何控制。

Private Sub Form_Load()
    Me.Caption = Date
End Sub

【讨论】:

以上是关于安排 MS Access 模块的主要内容,如果未能解决你的问题,请参考以下文章

我希望从 ms-access 2013 数据库中的所有表单、报告和模块中导出 vba 源代码

模块中的 MS Access 2013 事件触发器,而不是类模块

MS Access - 无法从 RunMacro 运行模块中的子程序

将作业从 MS Access 文件同步到 MySQL 数据库

将 MS Access 数据库导出到 Mysql 的命令

使用类模块将可编辑的 ADO 记录集返回到 MS Access 表单