2011-02-07 95 views
4

我正在關注在另一個站點上找到的代碼。這裏是我的代碼的基礎:在Excel 2010中使用VBA與VBA創建多個連接的查詢表(QueryTables)

Dim SQL As String 
Dim connString As String 

connString = "ODBC;DSN=DB01;UID=;PWD=;Database=MyDatabase" 
SQL = "Select * from SomeTable" 

With Worksheets("Received").QueryTables.Add(Connection:=connString, Destination:=Worksheets("Received").Range("A5"), SQL:=SQL) 
.Refresh 

End With 

End Sub 

有這樣做的問題是,每一次他們擊中分配給該按鈕創建一個新的連接,不會永遠似乎放棄它。我在測試後打開電子表格,並在連接下列出了許多連接版本。 連接 連接1 連接2

我似乎無法找到關閉或刪除連接的方法。如果我在「.Refresh」之後添加「.delete」,則會出現1004錯誤。此操作無法完成,因爲數據在後臺刷新。

任何想法如何關閉或刪除連接?

回答

8

您可能會問自己爲什麼每次在代碼中創建QueryTable。有理由這樣做,但通常沒有必要。

QueryTables更典型的是設計時對象。也就是說,您創建一次QueryTable(通過代碼或UI),並刷新QueryTable以獲取更新的數據。

如果您需要更改基礎SQL語句,您有一些選項。您可以設置提示輸入值的參數或從單元格獲取值。另一個更改SQL的選項是將其更改爲現有QueryTable的代碼。

Sheet1.QueryTables(1).CommandText = "Select * FROM ...." 
Sheet1.QueryTables(1).Refresh 

您可以通過更改CommandText來選擇不同的列或甚至不同的表。如果它是一個不同的數據庫,你需要一個新的連接,但這是非常罕見的。

我知道這並不直接回答你的問題,但我想確定你是否真的需要每次添加QueryTable都是第一步。

有關參數的更多信息,請參閱http://www.dicks-clicks.com/excel/ExternalData6.htm這是2003年的版本,因此與更高版本的不一致性很少。基礎是一樣的,如果你使用2007或更高版本,你可能需要了解ListObject對象。

1

您應該將連接聲明爲單獨的對象,然後在數據庫查詢完成後關閉它。

我沒有VBA IDE在我面前,所以如果有任何不準確的地方,請原諒我,但它應該指向正確的方向。

E.g.

Dim SQL As String 
Dim con As connection 

Set con = New connection 
con.ConnectionString = "ODBC;DSN=DB01;UID=;PWD=;Database=MyDatabase" 

Worksheets("Received").QueryTables.Add(Connection:=con, Destination:=Worksheets("Received").Range("A5"), SQL:=SQL).Refresh 

con.close 
set con = nothing 
+0

當我嘗試時,Worksheets(「Received」)...行給出了一個無效的過程調用運行時錯誤5.我也嘗試將它從新連接更改爲新的ADODB連接並相應地使用它。沒有骰子。 – DavidStein 2011-02-08 14:46:58

1

我發現默認情況下,以這種方式創建的新連接稱爲「連接」。我使用的是這段代碼刪除連接,但保留listobject。

Application.DisplayAlerts = False 
ActiveWorkbook.Connections("Connection").Delete 
Application.DisplayAlerts = True 

它可以很容易地被修改,以刪除最新添加的連接(或者如果你跟蹤他們的索引連接)。

Application.DisplayAlerts = False 
ActiveWorkbook.Connections(ActiveWorkbook.Connections.Count).Delete 
Application.DisplayAlerts = True 
0

如果你想刪除,如果刷新之後,你應該做的刷新不是在後臺(使用第一個參數 - >刷新假),這樣你的動作正確順序

0

嘗試設置的QueryTable .MaintainConnection屬性爲False ...

「如果在刷新後直到工作簿關閉時纔將指定數據源的連接保持爲True,則將MaintainConnection設置爲True。默認值爲True!似乎是一個UI複選框(讀/寫布爾)「

0

仍然相關的幾年後...與同一問題作鬥爭,這是最有幫助的線程。我的情況是上述的一個變體,我會在找到它時添加我的解決方案。

我爲我的數據源使用Access數據庫,並在新工作表上建立查詢表。然後再添加兩張新的工作表,並試圖建立一個查詢表,每個表上使用相同的連接,但是不同的Access表。第一個查詢表工作得很好,我使用.QueryTables(1)。刪除並將查詢表對象設置爲Nothing以斷開連接。

但是,下一張表使用相同的連接建立新的查詢表失敗,該連接未關閉。我懷疑(並將在下面添加解決方案),我需要刪除查詢表之前刪除連接。上面的Rasmus代碼看起來像是可能的解決方案。

1

而不是使用add方法添加另一個查詢表,您可以簡單地更新連接的CommandText屬性。但是,您必須注意,在更新ODBC連接的CommandText屬性時存在錯誤。如果您臨時切換到OLEDB連接,請更新您的CommandText屬性,然後切換回ODBC,它不會創建新連接。不要問我爲什麼......這隻適用於我。

創建一個新的模塊並插入下面的代碼:

Option Explicit 

Sub UpdateWorkbookConnection(WorkbookConnectionObject As WorkbookConnection, Optional ByVal CommandText As String = "", Optional ByVal ConnectionString As String = "") 

With WorkbookConnectionObject 
    If .Type = xlConnectionTypeODBC Then 
     If CommandText = "" Then CommandText = .ODBCConnection.CommandText 
     If ConnectionString = "" Then ConnectionString = .ODBCConnection.Connection 
     .ODBCConnection.Connection = Replace(.ODBCConnection.Connection, "ODBC;", "OLEDB;", 1, 1, vbTextCompare) 
    ElseIf .Type = xlConnectionTypeOLEDB Then 
     If CommandText = "" Then CommandText = .OLEDBConnection.CommandText 
     If ConnectionString = "" Then ConnectionString = .OLEDBConnection.Connection 
    Else 
     MsgBox "Invalid connection object sent to UpdateWorkbookConnection function!", vbCritical, "Update Error" 
     Exit Sub 
    End If 
    If StrComp(.OLEDBConnection.CommandText, CommandText, vbTextCompare) <> 0 Then 
     .OLEDBConnection.CommandText = CommandText 
    End If 
    If StrComp(.OLEDBConnection.Connection, ConnectionString, vbTextCompare) <> 0 Then 
     .OLEDBConnection.Connection = ConnectionString 
    End If 
    .Refresh 
End With 

End Sub 

UpdateWorkbookConnection子程序只能在更新OLEDB或ODBC連接。連接不一定必須鏈接到數據透視表。它還修復了另一個問題,即使存在多個基於同一連接的數據透視表,也可以更新連接。

啓動更新只是使用連接對象和命令文本參數,像這樣的功能:

UpdateWorkbookConnection ActiveWorkbook.Connections("Connection"), "exec sp_MyAwesomeProcedure" 

您可以選擇更新連接字符串爲好。