我正在关注我在另一个网站上找到的代码。以下是我的代码的基本内容:
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
这样做的问题是,每次他们点击分配给它的按钮时,它都会创建一个新的连接,并且似乎从来没有丢弃它。我在测试后打开电子表格,在Connections下面列出了该连接的许多版本。Connection Connection1 Connection2
我似乎也找不到关闭或删除连接的方法。如果我在".Refresh“后面加上".delete”,我会得到一个1004错误。无法执行此操作,因为数据正在后台刷新。
有什么办法关闭或删除连接吗?
发布于 2011-02-08 22:48:20
您可能会问自己,为什么每次都要在代码中创建QueryTable。有理由这样做,但通常不是必要的。
QueryTables是更典型的设计时对象。也就是说,您只需创建一次QueryTable (通过代码或UI),然后刷新QueryTable以获得更新的数据。
如果需要更改底层SQL语句,您有一些选择。您可以设置提示输入值或从单元格获取值的参数。更改SQL的另一个选项是在现有QueryTable的代码中更改它。
Sheet1.QueryTables(1).CommandText = "Select * FROM ...."
Sheet1.QueryTables(1).Refresh
您可以通过更改CommandText来选择不同的列甚至不同的表。如果它是一个不同的数据库,您将需要一个新的连接,但这是非常罕见的。
我知道这不能直接回答你的问题,但我认为确定你是否真的需要每次都添加QueryTable是第一步。
有关参数的更多信息,请参阅http://dailydoseofexcel.com/archives/2004/12/13/parameters-in-excel-external-data-queries/ It's For 2003,因此与更高版本几乎没有不一致之处。基本原理是一样的,如果你使用的是2007或更高版本,你可能只需要学习一下ListObject对象。
发布于 2011-08-04 10:39:18
我也有同样的问题。前面的答案虽然在正确的方向上迈出了明确的一步,但它是一个皮塔。
然而,它确实让我改进了我的搜索,获胜者是...
http://msdn.microsoft.com/en-us/library/bb213491(v=office.12).aspx
也就是说,对于您现有的QueryTable对象,只需执行以下操作:
.MaintainConnection = False
效果非常好。刷新数据后,不再访问数据库锁文件。
发布于 2011-02-08 05:09:20
您应该将连接声明为单独的对象,然后可以在数据库查询完成后将其关闭。
我面前没有VBA IDE,所以如果有任何不准确的地方,请原谅,但它应该会为您指明正确的方向。
例如。
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
https://stackoverflow.com/questions/4926441
复制相似问题