Excel OLE DB 连接刷新问题
Excel OLE DB connection refresh issues
我有一个包含两个动态 OLE DB 查询的 Excel 工作簿。我遇到刷新问题。
为了进行设置,我有一个 SQL table 值函数作为源。数据的性质是...
SGrp SG_Desc SKU SKU_Desc Server Billed
1 Item 1 111 whatever 15 12
1 Item 2 222 some more 10 9
2 Item 3 333 zzz 10 8
3 Item 4 555 abc 20 18
在第一个sheet ("Overall") 我有一个数据连接,用一个按钮动态修改的命令文本总结了组。
SELECT SGrp, SG_Desc, SUM(Served) AS Served, SUM(Billed) AS Billed FROM mySQLdb ('8/19/2018','8/25/2018') WHERE SGrp <> '' GROUP BY SGrp, SG_Desc ORDER BY SG_Desc
然后我有一个单元格,其中包含一个选择组的数据验证列表和一个用于执行 VBA 以动态修改其他连接的按钮。还有两个单元格,其中包含用于过滤的报告开始和结束日期。当我按下 "Detail" 按钮时,它 运行 是下面的代码。
Private Sub RunDetail_Click()
Dim StartDate As Date
Dim EndDate As Date
Dim SGrp As String
Range("A1").Value = Range("G8").Value2
StartDate = Sheets("Overall").Range("H1").Value
EndDate = Sheets("Overall").Range("H2").Value
SGrp = Sheets("Overall").Range("A1").Value
SGrp = LTrim(RTrim(SGrp))
With ActiveWorkbook.Connections("CJP_DeliveryRecap_Detail").OLEDBConnection
.CommandText = "SELECT SKU, SKU_Desc, Served, Billed FROM mySQLdb ('" & StartDate & "','" & EndDate & "') WHERE SG_Desc='" & SGrp & "'"
' .Refresh
' ActiveWorkbook.Connections("CJP_DeliveryRecap_Detail").Refresh
End With
'RefreshOLEDB
'ThisWorkbook.RefreshAll
ActiveWorkbook.Connections("CJP_DeliveryRecap_Detail").Refresh
'Application.CalculateUntilAsyncQueriesDone
Application.Wait (Now + TimeValue("0:00:03"))
Dim rc As Integer
Dim i As Integer
Worksheets("Detail").Activate
With Worksheets("Detail").Range("CJP_DeliveryRecap_Detail")
rc = .Rows.Count
End With
With Worksheets("Detail").Range("E1048576")
.Select
.End(xlUp).Select
End With
i = Selection.Row
Worksheets("Detail").Range("E5").Select
Worksheets("Detail").Range("E5:G" & i).ClearContents
Worksheets("Detail").Range("E5").Value = 1
Worksheets("Detail").Range("F5").Value = "=+CJP_DeliveryRecap_Detail[@Served]*E5"
Worksheets("Detail").Range("G5").Value = "=+CJP_DeliveryRecap_Detail[@Billed]*E5"
Sheets("Detail").Range("E5:G5").Copy Sheets("Detail").Range("E6:E" & rc + 4)
Sheets("Detail").Range("F1").Value = ("=SUM(F5:F" & rc + 4 & ")")
Sheets("Detail").Range("G1").Value = ("=SUM(G5:G" & rc + 4 & ")")
End Sub
那么,它在做什么?首先 "strange" 是我偶尔会在必须继续的代码中遇到错误。很多时候,但不是全部,它到达 Application.Wait 行,然后是 Worksheets("Detail").Activate 行,有时是我设置值或复制数据的行.
有一些评论我一直在测试各种刷新等。问题是因为当代码完成时它会正确显示数据连接详细信息但结果大小的计算来自先前的设置.如果我再次单击该按钮,它就会正确计算它们。我当然不希望有任意的 3 秒延迟,而只是 运行 检索结果记录后的其余代码。
我一直在用头撞墙,我哪里出错了。我所做的大部分工作都是在 Access 中进行的,但在这种情况下 Excel 是合适的工具。
我只是想到,但并不兴奋,有一个单独的 sub 来处理记录大小计算和单元格值 clear\set 并通过单击按钮调用它是否可行,或者仍然不行直到原始子结束后才生成。
提前致谢,
您需要等到查询完成后再进行计算。
您需要在 .refresh
之前添加 .BackgroundQuery = False
到您的连接
With ActiveWorkbook.Connections("CJP_DeliveryRecap_Detail").OLEDBConnection
.BackgroundQuery = False
.CommandText = "SELECT SKU, SKU_Desc, Served, Billed FROM mySQLdb ......"
.Refresh
End With
这应该有帮助
如果从 Excel 调用的存储过程不包含 "SET NOCOUNT ON",则它不会从 Excel 正确地 运行。我有同样的问题,我的存储过程中没有包含 SET NOCOUNT ON;我添加的第二个,成功了!
我有一个包含两个动态 OLE DB 查询的 Excel 工作簿。我遇到刷新问题。
为了进行设置,我有一个 SQL table 值函数作为源。数据的性质是...
SGrp SG_Desc SKU SKU_Desc Server Billed
1 Item 1 111 whatever 15 12
1 Item 2 222 some more 10 9
2 Item 3 333 zzz 10 8
3 Item 4 555 abc 20 18
在第一个sheet ("Overall") 我有一个数据连接,用一个按钮动态修改的命令文本总结了组。
SELECT SGrp, SG_Desc, SUM(Served) AS Served, SUM(Billed) AS Billed FROM mySQLdb ('8/19/2018','8/25/2018') WHERE SGrp <> '' GROUP BY SGrp, SG_Desc ORDER BY SG_Desc
然后我有一个单元格,其中包含一个选择组的数据验证列表和一个用于执行 VBA 以动态修改其他连接的按钮。还有两个单元格,其中包含用于过滤的报告开始和结束日期。当我按下 "Detail" 按钮时,它 运行 是下面的代码。
Private Sub RunDetail_Click()
Dim StartDate As Date
Dim EndDate As Date
Dim SGrp As String
Range("A1").Value = Range("G8").Value2
StartDate = Sheets("Overall").Range("H1").Value
EndDate = Sheets("Overall").Range("H2").Value
SGrp = Sheets("Overall").Range("A1").Value
SGrp = LTrim(RTrim(SGrp))
With ActiveWorkbook.Connections("CJP_DeliveryRecap_Detail").OLEDBConnection
.CommandText = "SELECT SKU, SKU_Desc, Served, Billed FROM mySQLdb ('" & StartDate & "','" & EndDate & "') WHERE SG_Desc='" & SGrp & "'"
' .Refresh
' ActiveWorkbook.Connections("CJP_DeliveryRecap_Detail").Refresh
End With
'RefreshOLEDB
'ThisWorkbook.RefreshAll
ActiveWorkbook.Connections("CJP_DeliveryRecap_Detail").Refresh
'Application.CalculateUntilAsyncQueriesDone
Application.Wait (Now + TimeValue("0:00:03"))
Dim rc As Integer
Dim i As Integer
Worksheets("Detail").Activate
With Worksheets("Detail").Range("CJP_DeliveryRecap_Detail")
rc = .Rows.Count
End With
With Worksheets("Detail").Range("E1048576")
.Select
.End(xlUp).Select
End With
i = Selection.Row
Worksheets("Detail").Range("E5").Select
Worksheets("Detail").Range("E5:G" & i).ClearContents
Worksheets("Detail").Range("E5").Value = 1
Worksheets("Detail").Range("F5").Value = "=+CJP_DeliveryRecap_Detail[@Served]*E5"
Worksheets("Detail").Range("G5").Value = "=+CJP_DeliveryRecap_Detail[@Billed]*E5"
Sheets("Detail").Range("E5:G5").Copy Sheets("Detail").Range("E6:E" & rc + 4)
Sheets("Detail").Range("F1").Value = ("=SUM(F5:F" & rc + 4 & ")")
Sheets("Detail").Range("G1").Value = ("=SUM(G5:G" & rc + 4 & ")")
End Sub
那么,它在做什么?首先 "strange" 是我偶尔会在必须继续的代码中遇到错误。很多时候,但不是全部,它到达 Application.Wait 行,然后是 Worksheets("Detail").Activate 行,有时是我设置值或复制数据的行.
有一些评论我一直在测试各种刷新等。问题是因为当代码完成时它会正确显示数据连接详细信息但结果大小的计算来自先前的设置.如果我再次单击该按钮,它就会正确计算它们。我当然不希望有任意的 3 秒延迟,而只是 运行 检索结果记录后的其余代码。
我一直在用头撞墙,我哪里出错了。我所做的大部分工作都是在 Access 中进行的,但在这种情况下 Excel 是合适的工具。
我只是想到,但并不兴奋,有一个单独的 sub 来处理记录大小计算和单元格值 clear\set 并通过单击按钮调用它是否可行,或者仍然不行直到原始子结束后才生成。
提前致谢,
您需要等到查询完成后再进行计算。
您需要在 .refresh
.BackgroundQuery = False
到您的连接
With ActiveWorkbook.Connections("CJP_DeliveryRecap_Detail").OLEDBConnection
.BackgroundQuery = False
.CommandText = "SELECT SKU, SKU_Desc, Served, Billed FROM mySQLdb ......"
.Refresh
End With
这应该有帮助
如果从 Excel 调用的存储过程不包含 "SET NOCOUNT ON",则它不会从 Excel 正确地 运行。我有同样的问题,我的存储过程中没有包含 SET NOCOUNT ON;我添加的第二个,成功了!