我有一个函数,我用它来多线程一些Access VBA例程。它通过编写一个vb脚本来完成此操作,该脚本保存主Access数据库的副本,然后在另一个访问实例中打开它。打开时,它运行vb脚本中指定的已定义例程。这很好但我有一些例程,我需要从main函数传递变量。我本打算用Tempvars来做这件事。
main函数设置tempvar(带有初始值),但是当新的访问实例读取它时,tempvar已设置为null。我不知道为什么会这样。它引用tempvar时没有错误,所以我假设它可以看到它。但我无论如何都无法看到当地人窗口中的tempvars对象。有没有办法监控tempvar对象?
我过去曾以类似的身份成功使用过tempvars。主要的区别是新的实例写入tempvar并且main函数读取它们。我所拥有的问题是写给他们的主函数和新实例读取它们(相反)。
答案 0 :(得分:0)
TempVars是Application
对象的属性,而不是数据库。新的Access.Application
将无法访问旧版本中设置的TempVars。
在我看来,更好的方法是使用表单,计时器和COM来实现这一目标。这样你就可以将变量从一个Access.Application
对象传递给另一个{包括但不限于TempVars)
快速示例(我正在研究Access中多线程的更完整方法)
使用具有单一表单的空白数据库MTForm,它具有表单模块: 在MTForms表单模块中:
Private strTask As String
Private Sub Form_Timer()
Application.Run strTask
Application.Quit
End Sub
Public Property Let Task(Value As String)
strTask = Value
End Property
在一个单独的模块中:
Public Sub RunAsync(strFunction As String)
Dim A As New Access.Application
A.OpenCurrentDatabase Application.CurrentProject.FullName
A.DoCmd.OpenForm "mtForm"
A.Forms("mtForm").Task = strFunction
A.Forms("mtForm").TimerInterval = 1
End Sub
使用:RunAsync "MyFunction"
将在同一数据库的单独MyFunction
实例上异步运行函数Access.Application
,一旦执行完毕就退出(请注意,您不能拥有独占锁在数据库上,否则这将失败)。
这可以很容易地适应添加参数,将值从一个线程传递到另一个线程等等。