在Access 2010中从外部VBScript运行VBA宏

3
我不确定这是否可能,但似乎应该是可行的......毕竟现在是2013年!我发现一些论坛帖子表明可以做到,但我并没有成功使其运行...

我有一个Access 2010数据库,其中包含一个宏,从3个不同的网站下载文件,然后进行数据导入和处理。它需要运行1小时17分钟。

我想要安排这个宏在早上4点运行,以便在咖啡时间和8点工作开始之前全部完成...因此我创建了一个VBScript来运行它,然后将其放入任务计划程序中以达到预期时间。

这是一个单用户数据库,仅由我在我的电脑上使用。

我已经做了一些研究,但似乎不能让它正常工作。以下是我目前为止所拥有的内容:

Access 2010中“Pricing Model.accdb”中“Main”模块内的宏:

Public Sub Download_And_Import()
    ProcStep = ""
    ExecStep = 1
    DoCmd.SetWarnings False
    'Empty the Execution Progress table
    DoCmd.RunSQL "DELETE * FROM EXECUTION_PROGRESS"
    Call Update_EXECUTION_PROGRESS(Format(Now(), "YYYY/MM/DD HH:MM:SS"), ExecStep, "Starting Download_Files Main Procedure...")
    Call Download_Files.Download_Files
    Call Update_EXECUTION_PROGRESS(Format(Now(), "YYYY/MM/DD HH:MM:SS"), ExecStep, "Finished Download_Files Main Procedure...")
    Call Update_EXECUTION_PROGRESS(Format(Now(), "YYYY/MM/DD HH:MM:SS"), ExecStep, "Starting Import_Files Main Procedure...")
    Call Import_Files.Import_Files
    Call Update_EXECUTION_PROGRESS(Format(Now(), "YYYY/MM/DD HH:MM:SS"), ExecStep, "Finished Import_Files Main Procedure, closing application now...")
    DoCmd.SetWarnings True
End Sub

我随后创建了以下VBScript来外部运行Access VBA宏:
dim accessApp
set accessApp = createObject("Access.Application")
accessApp.OpenCurrentDataBase("G:\Pricing DB\Pricing Model.accdb")
accessApp.Run "Download_And_Import"
accessApp.Quit
set accessApp = nothing

我收到了一条信息:“非法函数调用,第4行”,这是一个步骤。
accessApp.Run "Download_And_Import"

任何想法/帮助都非常感激!提前感谢!

M


1
在我定义了变量ProcStepProcExec之后,代码对我来说很好用。将应用程序可见化 (accessApp.Visible = True),这样您就可以使用宏编辑器进行调试。 - Ansgar Wiechers
我现在无法测试,但尝试添加括号:accessApp.Run ("Download_And_Import") - UberNubIsTrue
你好,Ansgar Wiechers。很抱歉我对VBS还不熟悉(虽然我有一点VBA经验)。根据您的建议,当我添加了这行代码(accessApp.Visible = True)后,运行VBS时Access会打开,但我仍然收到“非法函数调用”消息。我不确定您所指的定义ProcStep和ProcExec是什么,请详细说明一下。感谢您的帮助。 - TheRealPapa
嗨,UberNubIsTrue,我尝试了你的建议,但是在第4行(宏运行调用)上出现了“非法函数调用”消息。谢谢! - TheRealPapa
@user2469528 - 我能提出的唯一建议是确保您的子程序名称与其所在的模块不同。在过去,当尝试使用application.run时,这曾经给我带来了错误。 - UberNubIsTrue
我不知道为什么,但我遇到了同样的问题,并通过使用.DoCmd.RunMacro("宏名称")来解决它。 - user2792171
3个回答

3
我认为VBScript本身没有任何问题。我复制了你的代码,更改了数据库文件名和过程名称,它运行时没有出现错误。所以我的猜测是,当Access尝试运行该过程时,VBScript错误会“冒泡”上来。
在Access中打开“Pricing Model.accdb”,进入即时窗口(Ctrl+g),输入以下行并按Enter键。
Application.Run "Download_And_Import"

如果出现错误,则该过程中肯定存在问题。如果没有抛出错误,当该过程需要 Windows 权限并且您尚未设置任务以在用户帐户下运行时,则仍可能无法从计划的任务中运行它。
如果需要解决该过程的问题,请先将 Option Explicit 添加到模块的声明部分。然后从 VB 编辑器的主菜单中运行调试->编译。修复编译器抱怨的任何内容。重复操作,直到代码无误地编译。
在故障排除期间禁用 DoCmd.SetWarnings False,因为它会压制信息。请考虑是否可以使用 DAO 的 Database.Execute 方法替换 DoCmd.RunSQL,从而避免关闭SetWarnings

嗨Hans Up,谢谢你的建议。我尝试了你的建议(Ctr+G),它完美地运行了。当我手动执行它时(或通过Ctrl+G),Access VBA中没有错误。顺便说一下,我正在尝试通过双击来运行VBScript。一旦它手动工作正常,我就会安排它,所以我还没有超过那个手动步骤。因此,它正在使用我的访问权限运行(或尝试运行!)。再次感谢。 - TheRealPapa
尝试在命令窗口中使用 cscript YourScriptName.vbs 运行脚本。我不确定这样做是否会给我们提供更好的信息,但我没有其他建议了。 - HansUp

0

你可以尝试在代码中包含项目名称:

accessApp.Run "[Pricing Model].Download_And_Import"

项目名称默认为数据库名称,由于空格需要使用方括号。

这应该是不必要的,因为您的子程序是公共的,但值得一试。


嗨,Andy G,感谢你的建议,但它没有起作用。它抛出了错误“MS Access无法找到过程[Pricing Model]”。顺便说一句,我通过双击运行VBS。一旦手动工作,我就会安排它。 - TheRealPapa
Update_EXECUTION_PROGRESS是做什么的,它存储在哪里? - Andy G
嗨,Andy G,Update_EXECUTION_PROGRESS本质上是一个过程,用于更新同一数据库中存储进度消息的表。谢谢。 - TheRealPapa
它至少运行了删除查询吗?我会尝试注释掉一些其他的过程调用。调试:将其分解以隔离问题;)。非法函数调用可能指其中一个行,在从脚本外部运行时。 - Andy G
嗨Andy G,感谢您的建议,但VBA部分完美地运行到了最后。我已经手动运行了很多次,都完成得很好。我收到的“非法函数调用”消息指向VBScript第4行,那里我尝试在Access DB内运行VBA(accessApp.Run“Download_And_Import”)。我甚至尝试注释掉我的主要Access VBA(Download_And_Import)中的所有条目,并只放置了一个MSGBOX语句,以查看VBScript是否会触发它,但是仍然返回相同的非法函数调用消息,指向VBS中的第4行。 - TheRealPapa

0

我遇到了同样的问题,脚本是正常的!问题是我在开发模式下测试脚本时,数据库是打开状态,当我关闭数据库时,脚本就正常运行了。在测试脚本之前,请关闭数据库。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接