【问题标题】:Open DBs in parallel using VBA使用 VBA 并行打开 DB
【发布时间】:2017-12-05 16:58:45
【问题描述】:

我有一个 Access 数据库,用于计算大量人员一周中每一天的绩效分数。

由于数据集的大小,该过程运行非常缓慢。作为加快这一速度的一种潜在方法,我正在考虑一个过程,该过程将有 5 个独立的数据库,每个数据库计算一天的分数。

我编写了下面的 VBA 代码,它只打开了所有这些 DB(一旦每个 DB 打开,它就有自己的 autoExec 宏来启动它自己的过程)。

Sub DBloop()
 Dim dbArr As Variant
 Dim i As Integer

 dbArr = Array("Monday", "Tuesday", "Wednesday", "Thursday", "Friday")

 For i = 0 To UBound(dbArr)
     openDBs CStr(dbArr(i))
 Next
End Sub

Sub openDBs(dbname As String)
 Dim acc As Access.Application
 Dim DBpath As String
 Dim strDbName As String

 DBpath = "H:\Performance Test\"
 strDbName = DBpath & dbname & ".accdb"

 Set acc = New Access.Application
 acc.Visible = True
 acc.OpenCurrentDatabase strDbName, False
End Sub

不幸的是,当每个 DB 打开时,初始过程正在等待该 DB 的 autoExec 宏完成,然后再打开下一个。有谁知道这是否有解决方法?

【问题讨论】:

  • 您是否打算实际拆分数据?这可能会带来比帮助更多的麻烦。
  • 我也计划好了。目前,每个人每天都有一个单独的分数。这些分数实际上是相互独立的,因此我没有预见到将其拆分为单独的程序有任何问题。是否存在我忽略的潜在问题?
  • 任何组合所有数据的查询都会变得更加困难。 -- 可能值得在计算上寻求性能帮助,也许可以大大加快速度。
  • 可能是有史以来最糟糕的数据库设计!?
  • 你为什么这么说?

标签: database ms-access vba


【解决方案1】:

有很多方法可以确保您不会同步打开数据库。

其中一个最简单的是:

Application.FollowHyperlink strDbName

(无需创建新的 Access 应用程序对象)。

另一种方法是让 AutoExec 宏中的代码异步执行。我使用的技术如下:

  1. 创建隐藏表单
  2. 将计时器设置为 1
  3. 执行代码,关闭计时器上的表单

其他方法包括使用 ShellWScript.Shell 对象。

【讨论】:

  • 谢谢埃里克,太好了。我想我会选择 FollowHyperlink 一个,因为这似乎是最简单的 :)
【解决方案2】:

来自http://www.cpearson.com/excel/ShellAndWait.aspx

VBA Shell 函数可用于启动外部程序或执行通常使用 Windows 开始菜单上的“运行”项执行的任何操作。
Shell 函数启动命令文本,然后立即将控制权返回给调用 VBA 代码——它不会等待 Shell 中使用的命令终止。

如果这是您想要的,请使用Shell

' example Access 2010 32bit
Const ACCESS_PATH = """C:\Program Files (x86)\Microsoft Office\Office14\MSACCESS.EXE"""  

Shell ACCESS_PATH & " """ & strDbName & """"

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-28
    • 2015-06-12
    • 1970-01-01
    相关资源
    最近更新 更多