如何加快Excel和Access之间的信息传输速度?

问题描述 投票:0回答:1

我在通过 Excel 宏(用 VBA 编码)更新 MS Access 中的记录时遇到问题。

我会尽力更好地解释问题所在:

我创建了一个用户窗体,将多个列表框中插入的信息(由字符串填充)输入到 MS Access 数据库中。第一个循环检查 ListBox1 的每个元素是否已存在于数据库中,如果不存在,则将其插入数据库中。ListBox2 中的元素可以与第一个循环相同或不同。因此,我执行“Access.Application.DCount”以避免与重复条目相关的错误。始终在第二个循环中,如果元素已插入数据库中,我只需运行“更新”查询来检查复选框;如果在数据库中找不到该元素,我会运行“INSERT INTO”查询来创建新记录。

我遇到的问题是 - 由于循环一个接一个地运行 - MS Access 需要很长时间才能更新条目(大约 5 秒)。因此,当第二个循环运行时,仅执行“INSERT INTO”查询,即使元素与第一个循环中插入的元素完全相同。这解释了以下代码行的原因:

'Wait for the database to update
cnt.Update
Application.Wait Now + #12:00:05 AM#

如果我在运行第二个循环之前等待 5 秒,那么第一个循环中的元素将记录在数据库中,并且第二个循环没有问题。然而,我不能浪费所有时间等待 MS Access 刷新。我需要运行几个类似的循环,等待时间太长了。

有没有办法优化我的代码和/或加速 Excel 和 Access 之间的信息传输?

我在这里粘贴 2 个循环:

For X = 0 To ListBox1.ListCount - 1
    'Look for duplicates
    If ((Access.Application.DCount("*", "Table1", "ID ='" & IdentificationCode & "' AND DWG = '" & ListBox1.List(X) & "'") > 0) Or IsNull(ListBox1.List(X)) = True) Then
        'MsgBox "Element already in the DB"
    Else
        On Error Resume Next
        
        'Insert the data into the recordset
        insert1 = "insert into Table1(" _
        & "ID," _
        & "DWG," _
        & "CheckBox1)" _
        & "values(" _
        & "'" & IdentificationCode & "'," _
        & "'" & ListBox1.List(X) & "'," _
        & "-1)"
        
        cnt.Execute (insert1)
    End If
Next X

If (ListBox2.ListCount > 0) Then
    'Wait for the database to update
    cnt.Update
    Application.Wait Now + #12:00:05 AM#

    For X = 0 To ListBox2.ListCount - 1
        'Look for duplicates
        If ((Access.Application.DCount("*", "Table1", "ID ='" & IdentificationCode & "' AND DWG = '" & ListBox2.List(X) & "'") > 0)) Then 'Or IsNull(ListBox2.List(X)) = True)
            'MsgBox "Element already in the DB"
            On Error Resume Next
            
            update1 = "update Table1 set" _
            & "[Table2].CheckBox2 ='-1'" _
            & "where [Table2].ID ='" & IdentificationCode & "'" _
            & "and [Table2].DWG ='" & ListBox2.List(X) & "';"
            
            cnt.Execute (update1)
        Else
            On Error Resume Next
            
            'Insert the data into the recordset
            insert2 = "insert into Table1(" _
            & "ID," _
            & "DWG," _
            & "CheckBox2)" _
            & "values(" _
            & "'" & IdentificationCode & "'," _
            & "'" & ListBox2.List(X) & "'," _
            & "-1)"
            
            cnt.Execute (insert2)
        End If
    Next X
End If

显然,这不是完整的代码。在进入循环之前,我设置“ADODB.Connection”并打开它。

我想强调这样一个事实:这段代码不会返回任何错误。它正在做应该做的事情。我的问题是我该怎么做才能避免等待这 5 秒钟?

提前感谢您的时间和支持!希望你能帮助我。

excel vba performance ms-access sql-update
1个回答
0
投票

您可以跳过 DCount 以及对每个列表框条目的更新/插入调用:

  • 打开记录集(表1)
  • 循环列表框条目并:
    • 搜索ID
      • 如果找到,请更新记录
      • 如果没有找到,则插入记录
  • 关闭记录集
© www.soinside.com 2019 - 2024. All rights reserved.