我在通过 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 秒钟?
提前感谢您的时间和支持!希望你能帮助我。
您可以跳过 DCount 以及对每个列表框条目的更新/插入调用: