在刷新其他连接之前,ADODB等待查询完成

时间:2014-05-05 17:39:07

标签: excel vba adodb

我在excel中有一个表,它通过与Access数据库的连接填充。我正在尝试编写一个允许您从此表中删除单个行的宏。我使用ADODB连接将删除命令传递给Access,这很好。但是,在宏的末尾,我想刷新excel中的表,以便在宏完成时,已删除的记录将不再出现在该表中。

我已经在填充表的连接上设置了backgroundquery = False,但在这种情况下似乎没有区别。我已经使用application.wait命令作为解决方法,但我正在寻找更好的解决方案。还有另一种方法可以阻止表刷新,直到我的删除查询运行?

我的代码如下:

Sub Delete_recipe()

'Set up query
Dim Recipe_ID As Integer
    Worksheets("Recipe Adder").Calculate
    Recipe_ID = Range("New_recipe_ID").Value

'Open data connection
Dim Cn As ADODB.Connection
Set Cn = New ADODB.Connection
Cn.Open "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\Users\Tucker\Desktop\Recipe project\MURPH.xls;Extended Properties=Excel 8.0;" _
& "Persist Security Info=False"

'Execute delete query
Cn.Execute "Delete from Recipe_master IN 'C:\Users\Tucker\Desktop\Recipe project\MURPH.accdb' where Recipe_ID =" & Recipe_ID
Cn.Execute "Delete from Recipe_ingredients IN 'C:\Users\Tucker\Desktop\Recipe project\MURPH.accdb' where Recipe_ID =" & Recipe_ID
Cn.Execute "Delete from Recipe_instructions IN 'C:\Users\Tucker\Desktop\Recipe project\MURPH.accdb' where Recipe_ID =" & Recipe_ID

'Close connection
Cn.Close
Set Cn = Nothing

'Application.Wait (Now + TimeValue("0:00:06"))
ActiveWorkbook.Connections("Murph Ingredient").Refresh

'Clear data from cells
Range("New_recipe_name_merged").ClearContents
Range("Recipe_description").ClearContents
Range("New_recipe_ingredients").ClearContents
Range("New_recipe_instructions").ClearContents

End Sub

感谢您的帮助

1 个答案:

答案 0 :(得分:4)

您需要异步执行并等待它完成。 请注意,如果等待每个命令执行直到触发下一个命令,它会降低你的速度。

cn.Execute sqlString, , adAsyncExecute
Do While cn.state = adStateOpen + adStateExecuting
    ' wait for command to finish
    ' perhaps show a status here
Loop

ActiveWorkbook.Connections("Murph Ingredient").Refresh

我们必须检查每个State Property documentation

的状态组合
  

您可以使用State属性来确定当前状态   任何时候给定物体的对象的State属性可以有一个   价值观的结合。例如,如果语句正在执行,则为此   属性将具有adStateOpen和的组合值   adStateExecuting。

进一步阅读: