Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Query Tables (QueryTables) in Excel 2010 with VBA with VBA creating many connections

I'm following code I found on another site. Here's the basics of my code:

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

The problem with doing this is every single time they hit the button assigned to this it creates a new connection and doesn't ever seem to drop it. I open the spreadsheet after testing and there are many versions of the connection listed under Connections. Connection Connection1 Connection2

I can't seem to find a way to close or delete the connections either. If I add ".delete" after ".Refresh" I get a 1004 error. This operation cannot be done because the data is refreshing in the background.

Any ideas how to close or delete the connection?

like image 858
DavidStein Avatar asked Feb 07 '11 20:02

DavidStein


3 Answers

You might ask yourself why you're creating a QueryTable every time in your code. There are reasons to do it, but it usually isn't necessary.

QueryTables are more typically design-time objects. That is, you create your QueryTable once (through code or the UI) and the you Refresh the QueryTable to get updated data.

If you need to change the underlying SQL statement, you have some options. You could set up Parameters that prompt for a value or get it from a cell. Another option for changing the SQL is changing it in code for the existing QueryTable.

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

You can select different columns or even different tables by changing CommandText. If it's a different database, you'll need a new connection, but that's pretty rare.

I know that doesn't answer your question directly, but I think determining whether you really need to add the QueryTable each time is the first step.

For more on Parameters, see http://dailydoseofexcel.com/archives/2004/12/13/parameters-in-excel-external-data-queries/ It's for 2003, so there are few inconsistencies with later versions. The basics are the same, you just may need to learn about the ListObject object if you're using 2007 or later.

like image 179
Dick Kusleika Avatar answered Sep 25 '22 08:09

Dick Kusleika


I had the same issue. The previous answer while a definite step in the right direction is a PITA.

It did however allow me to refine my search and the winner is...

http://msdn.microsoft.com/en-us/library/bb213491(v=office.12).aspx

i.e. for your existing QueryTable Object just do this:

.MaintainConnection = False

Works ever so swell. No more Access DB lock file after the data is refreshed.

like image 22
Yotool Avatar answered Sep 23 '22 08:09

Yotool


You should declare the connection as a separate object then you can close it once the database query is complete.

I don't have the VBA IDE in front of me, so excuse me if there are any inaccuracies, but it should point you in the right direction.

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
like image 24
st0000 Avatar answered Sep 25 '22 08:09

st0000