将msaccess打开为swarm

时间:2017-02-14 12:52:37

标签: multithreading ms-access access-vba

我们都知道ms访问不是多线程的,所以当msacces运行一个长查询时,它会挂起等待查询完成。我想要的是打开访问新的访问实例来运行查询或在后台运行vba代码。在运行之后,它需要在它返回结果之后自己套件(可能是通过sql server背景)

我之前在excel中看过一些东西,但我想知道它是否可以在访问中进行

excel变种在这里[excel swarm] [1

更新

我使用以下代码打开访问权限

Dim appAccess As Object  
Set appAccess = CreateObject("Access.Application")  
Call appAccess.OpenCurrentDatabase( _ "D:\test.accdb")
appAccess.UserControl = True 
Set appAccess = Nothing

目标访问数据库已预先格式化为循环,因为测试将在访问打开时启动。问题是在启动和运行目标访问期间,源访问会挂起。 我可以使用计时器给它一个延迟启动然后它的工作。

主要问题是如何统计未预先格式化的访问数据库,创建诸如vba代码之类的内容,查询odbc连接等并在没有源数据库挂起的情况下运行它。

2 个答案:

答案 0 :(得分:1)

你可以尝试从shell命令到另一个VBA主机,例如excel,它可以触发事件。这是一个类,其中传递了DB路径和查询名称的属性,然后执行GO,它使用DBs ADO连接的Execute Complete事件,我将其编码为创建Excel实例并填充结果

我没有像在中间的东西那样完全测试,但是我将在午餐时完全测试并按照要求进行编辑,但这是一个起点

Option Explicit

Private WithEvents c As ADODB.Connection
Private strDBPath As String
Private strQueryToRun As String

Public Property Let DBPath(strPath As String)
    strDBPath = strPath
End Property

Public Property Let QueryToRun(strQuery As String)
    strQueryToRun = strQuery
End Property

Public Function GO()

Dim a As New Access.Application
a.OpenCurrentDatabase strDBPath, False

Set c = a.CurrentProject.Connection
c.EXECUTE strQueryToRun

a.CloseCurrentDatabase

a.Quit

Set a = Nothing

End Function

Private Sub c_ExecuteComplete(ByVal RecordsAffected As Long, ByVal pError As ADODB.Error, adStatus As ADODB.EventStatusEnum, _
                        ByVal pCommand As ADODB.Command, ByVal pRecordset As ADODB.Recordset, ByVal pConnection As ADODB.Connection)

    '   what to do with the results?

    Dim xl As New Excel.Application
    Dim xlWb As Excel.Workbook

    xl.Visible = True
    Set xlWb = xl.Workbooks.Add
    xlWb.Sheets(1).Range("a1").CopyFromRecordset pRecordset

End Sub

答案 1 :(得分:0)

是的,这是可能的。

使用命令 Shell 打开另一个Access实例 - 并添加命令行参数Access以保存有关要运行哪些查询的信息。