SendKeys 在 Access 中单击对话框按钮

Posted

技术标签:

【中文标题】SendKeys 在 Access 中单击对话框按钮【英文标题】:SendKeys to click on a dialog box button in Access 【发布时间】:2014-05-23 20:26:23 【问题描述】:

我使用的是 Access 2013。我搜索了各种在线资源。我认为 SendKeys 就是答案。

每季度一次,我的客户将收到更新的 Access 数据库。每个季度的所有表名都应该相同。我希望他们运行一个宏,指定新文件的位置,然后宏更新链接表并执行我构建的所有其他查询(我已经完成了最后一部分)。 我无法工作的部分是选中“始终提示新位置框”,选中“全选”框并单击“确定”(然后在客户端指定新文件位置后单击“确定”并关闭) .下面是我正在使用的代码。

Function Open_LinkedTableManager()

    DoCmd.RunCommand acCmdLinkedTableManager 'this step works fine

    'the following lines, up until Application.Run don’t appear to be
    'doing anything.  The code will run, but I have to manually execute
    'each of the steps I am trying to automate before it gets to the
    'Application.Run step

    SendKeys "%a", True ' also tried SendKeys "%(a)" and "+a", "a", etc,
    'True; Alt+a checks the "Always prompt for a new location box” 
      SendKeys "%s", True ' also tried SendKeys "%(s)", True; Alt+s checks the "select all"         'box 
      SendKeys "Enter" ' then user specifies location of new file 
      SendKeys "Enter" ' click OK after receiving message "All selected linked tables        'were successfully refreshed" 
      ' click Close to close linked table manager and proceed to the next step below (not 'sure how to do this)

    Application.Run ("Update_all_queries") ' this is working;

End Sub

【问题讨论】:

【参考方案1】:

如果发送给自己,那么在每个发送键之后尝试 DoEvents。

DoEvents 函数

产生执行,以便操作系统可以处理其他事件。

语法

DoEvents( )

备注

DoEvents 函数返回一个整数,表示在 Visual Basic 的独立版本(例如 Visual Basic,专业版)中打开的表单数。 DoEvents 在所有其他应用程序中返回零。

DoEvents 将控制权交给操作系统。在操作系统完成其队列中的事件处理并且 SendKeys 队列中的所有键都已发送后,返回控制权。

DoEvents 对于简单的事情最有用,例如允许用户在进程启动后取消它,例如搜索文件。对于长时间运行的进程,让处理器更好地通过使用计时器或将任务委托给 ActiveX EXE 组件来完成。在后一种情况下,任务可以完全独立于您的应用程序继续进行,并且操作系统会处理多任务和时间切片。

警告 任何时候在事件过​​程中临时让出处理器时,请确保在第一次调用返回之前不会从代码的不同部分再次执行该过程;这可能会导致不可预知的结果。此外,如果在您让出控制权期间其他应用程序可能以不可预见的方式与您的过程交互,请不要使用 DoEvents。

【讨论】:

感谢您的回复。我尝试了(多种方式),但我无法做到这一点。我仍然必须手动执行我尝试使用 SendKeys 自动化的所有步骤。我在其他地方读到,打开对话框时 vba 代码不会执行。不确定是否有办法解决这个问题,但这似乎就是这里发生的事情。也许 DoEvents 和 SendKeys 命令正在执行,但直到我关闭对话框之后才执行,因此它们没有达到我的预期目的。 尝试使用 wshshell sendkeys,它需要一个窗口标题而不是 vba 的活动窗口。如果仍然存在问题,请使用 wshshell 的 run 方法将其作为 vbs 文件旋转出来。记住在 vbs 中你没有声明为 DataType(所以只是暗淡的 A),你必须使用 set = createobject("Object.Type")。 Set WShell = CreateObject("Wscript.Shell") 在 VBA 中,您可以添加作为参考和早期绑定。 再次感谢。我试过了,但无法让它工作。在我关闭该框之前,似乎在 DoCmd.RunCommand acCmdLinkedTableManager 之后什么都不会执行。我不确定是否有另一种方法可以调用表管理器并允许在它打开时执行其他命令。我还没有找到。【参考方案2】:

我已经解决了你的困境。我需要做的就是在调用链接表管理器之前放置 sendkey 语句。见下文 - 对我来说很棒!我还能够按您的顺序添加所有命令,并且效果很好。祝你好运,希望这有帮助。让我知道。亚当

PS:如果您有很多表要更改路径,那么对于您强迫他们必须为其设置路径的每个表,用户都会感到痛苦。

SendKeys "%s", 1

DoCmd.RunCommand acCmdLinkedTableManager

【讨论】:

以上是关于SendKeys 在 Access 中单击对话框按钮的主要内容,如果未能解决你的问题,请参考以下文章

如何使用C#以编程方式在OpenFile对话框中选择文件

弹出对话框的处理

Microsoft Access 2010 打开目录中的所有文件

如何在 Access 2007 的窗体中实现点击按钮打开另一个窗体???

在 Python 中读取对话框

如何在ms-access vba中单击命令按钮单击以更改代码以更改控件属性