Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/firebase/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
调用access子过程后保持Excel子过程运行_Excel_Ms Access_Vba_Call - Fatal编程技术网

调用access子过程后保持Excel子过程运行

调用access子过程后保持Excel子过程运行,excel,ms-access,vba,call,Excel,Ms Access,Vba,Call,在我的Excel sub中,我调用了在后台运行的Access sub过程(DB未打开)并更新我的DB中的表。一切工作都很完美,除了我的Excel Sub在Access运行完我从Excel调用的Sub之前不会进入下一行代码。所以,我的问题是……有没有办法从Excel Sub中调用/运行Access宏/Sub过程,让Excel继续执行其余代码,而不必等待Access宏/Sub完成才能继续?代码:如下: Set acObj = CreateObject("Access.Application"

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

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

    MsgBox "Done!"
因此,基本上我想立即完成提示,而不需要等待30秒,访问过程才能完成…任何人对此有任何见解,可以与我分享吗?
谢谢

通过在客户端应用程序中创建触发器,然后执行所需的子例程,可以在VBA中模拟异步调用。这项技术在这里有很好的描述(请注意,1秒的延时需要几个帖子):


当前,您在不启动应用程序的情况下操作Access表中的数据,因此您可以使用Excel的新实例来创建触发器,也可以打开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

这可能取决于访问例程的功能。如果你可以用ADO复制它,你就可以异步运行它。访问例程只是运行一个make table查询来更新一个带有更新数据的表……我相信ADO中的异步连接只能对服务器起作用(例如在一个单独的进程中)。基本问题是进程线程,进程(应用程序)中的所有调用都排队;一个线程不能同时执行两个操作。另一种方法是脚本方法:不,您也可以使用Access来实现。下面是我的示例代码。你说得对,Rory,我已经有一段时间没有使用ADO了!感谢您的复习,并对错误的陈述表示歉意:)我相信关于进程的观点仍然成立,但我认为ADO创建了一个单独的进程,以便使之成为可能!第一个链接工作完美…非常感谢!