【问题标题】:Running VBA macro within Access 2010 from external VBScript从外部 VBScript 在 Access 2010 中运行 VBA 宏
【发布时间】:2013-07-12 08:07:28
【问题描述】:

不确定这是否可行,但似乎应该可行....毕竟是 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

【问题讨论】:

  • 在我定义了变量ProcStepProcExec 之后,代码对我来说运行良好。使应用程序可见 (accessApp.Visible = True),以便您可以使用宏编辑器进行调试。
  • 我现在无法对此进行测试,但请尝试添加括号:accessApp.Run ("Download_And_Import")
  • 嗨 Ansgar Wiechers,很抱歉,我是 VBS 新手(虽然我有一点 VBA 经验)。根据您的建议,当我添加行 (accessApp.Visible = True) 时,当我运行 VBS 时访问会打开,但我仍然收到非法函数调用消息。我不确定你在定义 ProcStep 和 ProcExec 时指的是什么,你能详细说明一下吗?感谢您的帮助。
  • 您好 UberNubIsTrue,我尝试了您的建议,并在第 4 行(宏运行调用)收到“非法函数调用”消息。谢谢!
  • @user2469528 - 我可以提出的唯一其他建议是确保您的 Sub 的名称与其所在的模块不同。这在过去尝试使用application.run

标签: ms-access vbscript vba scheduler


【解决方案1】:

我认为 VBScript 本身没有任何问题。我复制了你的代码,更改了 db 文件名和过程名,它运行没有错误。所以我的猜测是,当 Access 尝试运行该过程时,VBScript 错误“冒泡”。

在 Access 中打开 Pricing Model.accdb,转到即时窗口 (Ctrl+g),输入以下行并按 Enter

Application.Run "Download_And_Import"

如果这引发错误,那么您肯定在该过程中遇到了问题。如果它没有引发错误,如果该过程需要 Windows 权限并且您没有将任务设置为在您的用户帐户下运行,您仍然可能无法从计划任务运行它。

如果您需要对该过程进行故障排除,请首先将Option Explicit 添加到模块的声明部分。然后从 VB 编辑器的主菜单运行 Debug->Compile。修复编译器抱怨的任何问题。重复直到代码编译没有错误。

在故障排除期间禁用DoCmd.SetWarnings False,因为它会隐藏信息。考虑用 DAO Database.Execute 方法替换 DoCmd.RunSQL 是否可以让您完全避免关闭 SetWarnings

【讨论】:

  • 嗨,汉斯,谢谢您的建议。我尝试了您的建议(Ctr+G)并且工作得很好。当我手动(或通过 Ctrl+G)执行 Access VBA 时,它没有错误。顺便说一句,我试图通过双击来运行 VBScript。一旦它手动工作,我将安排它,所以我还没有通过那个手动步骤。因此,它以我的访问权限运行(或尝试!)。再次感谢。
  • 尝试使用cscript YourScriptName.vbs从命令窗口运行脚本
【解决方案2】:

您可以尝试包含项目名称:

accessApp.Run "[Pricing Model].Download_And_Import"

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

这应该不是必需的,因为您的 Sub 是公开的,但值得一试。

【讨论】:

  • 嗨,Andy G,感谢您的建议,但没有成功。它抛出了错误“MS Access找不到程序[定价模型]”。顺便说一句,我通过双击运行 VBS。一旦它手动工作,我会安排它。
  • Update_EXECUTION_PROGRESS 是做什么的,它存储在哪里?
  • 嗨 Andy G,Update_EXECUTION_PROGRESS 本质上是一个更新我存储进度消息的同一个数据库中的表的过程。谢谢。
  • 是否至少运行删除查询?我会尝试注释掉其他一些过程调用。调试:将其分解以隔离问题;)。当从脚本外部运行时,非法函数调用可以引用这些行之一。
  • 嗨,Andy G,感谢您的建议,但 VBA 作品端到端完美。我现在已经手动运行了很多次并完成了。我得到的“非法函数调用”消息指向 VBScript 第 4 行,我尝试在 Access DB 中运行 VBA(accessApp.Run“Download_And_Import”)。我什至尝试在我的主 Access VBA (Download_And_Import) 中注释所有条目,并仅放置一条 MSGBOX 语句以查看 VBScript 是否触发它,同样的非法函数调用 msg 又回来了,指向 VBS 中的第 4 行。
【解决方案3】:

我遇到了同样的(msg)问题,脚本没问题!问题是我在开发模式下打开数据库测试脚本,一旦我关闭数据库,脚本运行良好。在测试脚本之前关闭数据库。

【讨论】:

    猜你喜欢
    • 2020-05-09
    • 1970-01-01
    • 2012-05-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-08
    • 2015-11-22
    • 2017-04-06
    相关资源
    最近更新 更多