【问题标题】:Keep Excel sub runing after calling access sub procedure调用访问子程序后保持 Excel 子程序运行
【发布时间】:2014-07-20 07:04:15
【问题描述】:

在我的 Excel 子程序中,我正在调用在后台运行的 Access 子程序(数据库未打开)并更新数据库中的表。一切都很完美,除了我的 Excel 子程序在 Access 完成运行它是我从 Excel 调用的子程序之前不会继续执行下一行代码。所以,我的问题是……有没有办法从 Excel Sub 中调用/运行 Access Macro/Sub 过程,并让 Excel 继续执行其余代码,而不必等待 Access Macro/sub 到完成才能继续?代码:如下:

    Set acObj = CreateObject("Access.Application")
    acObj.Application.Visible = False
    acObj.OpenCurrentDatabase "C:\Intraday Data\Intraday.accdb"
    acObj.Application.Run "RunData"

    MsgBox "Done!"

所以基本上我想立即获得完成提示,而无需等待 30 秒才能完成访问过程......任何人对此有任何见解,他们可以与我分享吗? 谢谢!

【问题讨论】:

  • 这可能取决于 Access 例程的功能。如果您可以使用 ADO 复制它,则可以异步运行它。
  • Access 例程只是运行生成表查询来更新带有更新数据的表...
  • 我相信 ADO 中的异步连接只能按照针对服务器的预期运行(例如,在单独的进程中)。基本问题是进程线程,进程(应用程序)中的所有调用都排队;单个线程不能同时执行 2 个操作。另一种方法是脚本方法:stackoverflow.com/questions/4814294/…
  • 否 - 您也可以使用 Access 来完成。请参阅下面的示例代码。
  • 你说得对,Rory,我已经有一段时间没有和 ADO 合作了!感谢您的复习,并对不正确的陈述表示歉意:) 我相信关于流程的观点仍然存在,但我认为 ADO 创建了一个单独的流程以使这成为可能

标签: excel ms-access vba call


【解决方案1】:

这里有一些简单的代码来演示对 Access 过程的异步调用:

Sub ExecuteAccessActionQuery()
' Sample demonstrating how to execute an action query in an Access accdb asynchronously
' Requires a reference to a Microsoft ActiveX Data Objects library
    Dim cn                    As ADODB.Connection
    Dim strQuery              As String
    Dim strPathToDB           As String
    Dim dTimer As Double

    ' Change path and query name as necessary
    strPathToDB = "C:\some path\database name.accdb"
    strQuery = "qmtTempTable"

    Set cn = New ADODB.Connection
    With cn
        .Provider = "Microsoft.ACE.OLEDB.12.0"
        .ConnectionString = "Data Source=" & strPathToDB & ";"
        .Open
    End With
    dTimer = Timer
    cn.Execute strQuery, , adCmdStoredProc + adAsyncExecute
    MsgBox Timer - dTimer
    Set cn = Nothing
End Sub

【讨论】:

    【解决方案2】:

    您可以通过在客户端应用程序中创建触发器来模拟 VBA 中的异步调用,然后该触发器将执行所需的子例程。这种技术在这里有很好的描述(注意 1 秒的延迟需要一些帖子下来):

    http://social.msdn.microsoft.com/Forums/en-US/0546f8eb-d786-4037-906e-1ee5d42e7484/asynchronous-applicationrun-call?forum=isvvba

    目前,您在不启动应用程序的情况下操作 Access 表中的数据,因此您可以使用新的 Excel 实例在其中创建触发器,也可以打开 Access 应用程序并在那里执行 (http://msdn.microsoft.com/en-us/library/office/aa213969%28v=office.11%29.aspx )。无论哪种方式,您必须拥有另一个独立的应用程序(进程)来执行您的“异步”例程。

    【讨论】:

    • 谢谢蒂姆!第一个链接完美运行......非常感谢!
    猜你喜欢
    • 1970-01-01
    • 2015-02-06
    • 1970-01-01
    • 2023-04-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-11
    相关资源
    最近更新 更多