Excel OLE DB连接刷新问题

时间:2018-09-26 00:37:31

标签: excel vba excel-vba oledb

我有一个带有两个动态OLE DB查询的Excel工作簿。我在刷新时遇到问题。

要进行设置,我有一个SQL表值函数作为源。数据具有...的性质。

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

在第一张纸上(“总体”),我有一个数据连接,该数据连接通过一个按钮对动态修改的命令文本进行了汇总。

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以动态修改其他连接。还有两个单元格用于报告开始和结束日期以进行过滤。当我按下“详细信息”按钮时,它将运行以下代码。

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

那么,它在做什么?第一个“奇怪”的事情是我偶尔会在必须继续的代码中遇到错误。很多时候,但不是全部,它命中Application.Wait行,然后命中Worksheets(“ Detail”)。Activate行,有时还命中我设置值或复制数据的行。

我一直在测试各种刷新等内容,这是有一些评论的。这是因为,当代码完成时,它可以正确显示数据conn详细信息,但是结果大小的计算是基于先前的设置。如果我再次单击该按钮,那么它将正确计算它们。我当然希望不要有任意的3秒延迟,而只是在检索到结果记录之后运行其余代码。

这是我哪里出了问题,因为我一直用这种方法把头撞在墙上。我所做的大部分工作都在Access中,但在这种情况下,Excel是合适的工具。

我只是想,但不为所动,如果有一个单独的子项来处理记录大小计算和单元格值clear \ set并通过单击按钮调用它,是否会起作用,或者直到原始子结尾。

预先感谢

2 个答案:

答案 0 :(得分:0)

您需要等到查询完成后才能进行计算。
您需要在.BackgroundQuery = False

之前将.refresh添加到连接中
With ActiveWorkbook.Connections("CJP_DeliveryRecap_Detail").OLEDBConnection
    .BackgroundQuery = False
    .CommandText = "SELECT SKU, SKU_Desc, Served, Billed FROM mySQLdb ......"
    .Refresh
End With

这应该有帮助

答案 1 :(得分:-1)

如果从Excel调用的存储过程不包含“ SET NOCOUNT ON”,它将无法从Excel正常运行。我有同样的问题,SET NOCOUNT ON未包含在我的存储过程中;我第二次添加了它,就行了!