2011-03-08 98 views
1

我有過一個宏執行一個SQL查詢問題SQL語句時,「刷新」在2010年的ExcelExcel 2010中凍結VS只需點擊執行通過宏觀

的設置:

  1. 我打開了一個新的Excel 2010工作表。
  2. 進入「數據」選項卡
  3. 「獲取外部數據」部分我點擊「自其他來源」,並從下拉下下來,我點擊「從Microsoft查詢」
  4. 我再選擇合適的ODBC連接,通過「查詢嚮導」窗口取消並關閉「添加表」窗口
  5. 然後在「Microsoft Query」窗口中,我只需點擊「SQL」按鈕,輸入我的查詢並點擊確定
  6. 它執行查詢在「Microsoft Query」窗口中,然後關閉該窗口,選擇我希望在提示時填充的單元格,然後點擊確定。
  7. 查詢然後填充到我的電子表格中。

這裏就是問題出現:

如果我在桌子上點擊右鍵並選擇「刷新」右鍵單擊彈出菜單中的數據將刷新和小旋轉的地球底部屏幕上會顯示「正在運行的後臺查詢...」並旋轉,直到查詢運行完畢並且excel不會凍結,並且我可以在其他選項卡或其他工作表中工作。

不過,如果我執行,通過宏確切聲明:

Range("A6").Select 
Selection.ListObject.QueryTable.Refresh BackgroundQuery:=False 

旋轉的地球沒有出現,Excel停止響應,有時變白,並且鼠標變成了紡「沒有響應」圈子當盤旋在excel。在這一點上,我無法在excel中工作,直到查詢完成並且excel再次開始響應。

這是一個問題,因爲在我的大多數報告中,我使用Excel中的單元格來允許用戶將參數插入到我執行的SQL語句中。

例子:

Dim oQuery As QueryTable 
Dim oDate As String 

Set oQuery = ActiveWorkbook.Sheets("Sheet1").ListObjects(1).QueryTable 

oDate = Range("B1") 

oQuery.CommandText = "exec database.dbo.ExampleProcedure @SuppliedDate = '" + oDate + "'" 

oQuery.Refresh False 

這不是在Excel 2003中的一個問題,但只來了,當我切換到2010年不得不改變查詢表VB代碼顯示在下面的例子中

2003年:

2010年
Set oQuery = Sheet1.QueryTables(1) 

Set oQuery = ActiveWorkbook.Sheets("Sheet1").ListObjects(1).QueryTable 

另外它只發生在我編寫的大約75%的報告中,並且在SQL語句花費超過幾秒鐘刷新時,這只是一個值得注意的問題。這成了一個相當大的問題,所以我會非常感謝任何可以幫助的人。非常感謝。

回答

4

這就是:

BackgroundQuery:=False 

這意味着「不要讓任何人做任何事情,直到查詢已完成」。

Excel正在做你所問的。如果您希望人們能夠繼續,則需要將False更改爲True

如果您需要在查詢後執行進一步處理,您有兩個選擇(除了加速查詢,我假設您已經完成)。

要麼使用DoEvents循環,而你等待查詢完成(檢查QueryTables.Item(1).Refreshing,看它是否仍在運行),

Sub RefreshQueryAndWait(ByVal oQuery As QueryTable) 
    '' Assume oQuery is the current query 
    oQuery.Refresh BackgroundQuery:=False 
    Do While oQuery.Refreshing 
    DoEvents 
    Loop 
End Sub 

或者:把VB代碼的後半部分(後刷新)到查詢完成時調用的另一個Sub中。

有關如何操作,請參閱http://support.microsoft.com/kb/213187

+0

非常感謝您的回覆。這個解決方案對於一些等待查詢完成的報告肯定有效,在執行其他計算之前不需要。但是,在Excel 2003中,False命令並未完全凍結excel。它會告訴它要等到查詢完成後纔會繼續到vb的下一行。在此期間,用戶仍然可以在Excel中工作。我真的想知道在Excel 2010中是否有可能在執行宏中的其餘代碼之前執行查詢的宏完成,而不會完全凍結excel – BillSchwartzky 2011-03-09 18:04:45

+0

編輯答案以說明如何執行此操作。歡呼聲,本 – Ben 2011-03-09 20:57:22

+0

感謝您的問題和迴應。我有同樣的問題,但添加BackgroundQuery:= True不會改變Excel的行爲。仍凍結實例。 – 2012-09-17 15:43:26