Excel 2010中的查询表(QueryTables)与VBA和VBA创建许多连接

Dav*_*ein 5 excel vba excel-vba excel-2010

我正在关注我在其他网站上找到的代码.这是我的代码的基础知识:

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
Run Code Online (Sandbox Code Playgroud)

这样做的问题是,每当他们点击分配给它的按钮时,它就会创建一个新连接并且似乎永远不会丢弃它.我在测试后打开电子表格,并且在Connections下列出了许多版本的连接.连接Connection1 Connection2

我似乎无法找到关闭或删除连接的方法.如果我在".Refresh"之后添加".delete",我会收到1004错误.无法执行此操作,因为数据在后台刷新.

有任何想法如何关闭或删除连接?

Dic*_*ika 9

您可能会问自己为什么每次在代码中创建QueryTable.有理由这样做,但通常没有必要.

QueryTables更典型地是设计时对象.也就是说,您创建一次QueryTable(通过代码或UI),然后刷新QueryTable以获取更新的数据.

如果需要更改基础SQL语句,则可以选择一些选项.您可以设置提示输入值的参数或从单元格中获取值.更改SQL的另一个选项是在现有QueryTable的代码中更改它.

Sheet1.QueryTables(1).CommandText = "Select * FROM ...."
Sheet1.QueryTables(1).Refresh
Run Code Online (Sandbox Code Playgroud)

您可以通过更改CommandText来选择不同的列甚至不同的表.如果它是一个不同的数据库,你将需要一个新的连接,但这是非常罕见的.

我知道这并不直接回答你的问题,但我想确定你是否真的需要添加的QueryTable每次都是第一步.

有关参数的更多信息,请参阅http://dailydoseofexcel.com/archives/2004/12/13/parameters-in-excel-external-data-queries/ 它适用于2003,因此与更高版本的不一致性很少.基础是相同的,如果您使用的是2007或更高版本,您可能需要了解ListObject对象.


小智 7

我遇到过同样的问题.前面的答案是朝着正确方向迈出的明确一步是PITA.

但它允许我优化我的搜索,获胜者是......

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

即对于您现有的QueryTable对象,只需执行以下操作:

.MaintainConnection = False
Run Code Online (Sandbox Code Playgroud)

工作如此膨胀.刷新数据后不再有Access DB锁定文件.