首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Excel2010中的查询表(QueryTables)

Excel2010中的查询表(QueryTables)
EN

Stack Overflow用户
提问于 2011-02-08 04:53:52
回答 8查看 85K关注 0票数 6

我正在关注我在另一个网站上找到的代码。以下是我的代码的基本内容:

代码语言:javascript
运行
复制
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错误。无法执行此操作,因为数据正在后台刷新。

有什么办法关闭或删除连接吗?

EN

回答 8

Stack Overflow用户

回答已采纳

发布于 2011-02-08 22:48:20

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

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

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

代码语言:javascript
运行
复制
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对象。

票数 11
EN

Stack Overflow用户

发布于 2011-08-04 10:39:18

我也有同样的问题。前面的答案虽然在正确的方向上迈出了明确的一步,但它是一个皮塔。

然而,它确实让我改进了我的搜索,获胜者是...

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

也就是说,对于您现有的QueryTable对象,只需执行以下操作:

代码语言:javascript
运行
复制
.MaintainConnection = False

效果非常好。刷新数据后,不再访问数据库锁文件。

票数 7
EN

Stack Overflow用户

发布于 2011-02-08 05:09:20

您应该将连接声明为单独的对象,然后可以在数据库查询完成后将其关闭。

我面前没有VBA IDE,所以如果有任何不准确的地方,请原谅,但它应该会为您指明正确的方向。

例如。

代码语言:javascript
运行
复制
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
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4926441

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档