Excel VBA按名称引用QueryTable对象

我正在开发一个MS Excel 2013工具与VBA涉及使用QueryTables。 我遇到的一个不便之处是访问Excel工作表中现有的 QueryTables。 目前,我可以通过整数索引find访问查询表的唯一方法。 我想出了下面的代码来快速validation概念

Sub RefreshDataQuery() Dim querySheet As Worksheet Dim interface As Worksheet Set querySheet = Worksheets("QTable") Set interface = Worksheets("Interface") Dim sh As Worksheet Dim QT As QueryTable Dim startTime As Double Dim endTime As Double Set QT = querySheet.ListObjects.item(1).QueryTable startTime = Timer QT.Refresh endTime = Timer - startTime interface.Cells(1, 1).Value = "Elapsed time to run query" interface.Cells(1, 2).Value = endTime interface.Cells(1, 3).Value = "Seconds" End Sub 

这有效,但我真的不想这样做。 最终产品工具将有多达五个不同的QueryTables。 我想要的是通过其名称引用QueryTable。

如果我可以翻译下面的代码,那将会更好

 Set QT = querySheet.ListObjects.item(1).QueryTable 

沿线的东西

 Set QT = querySheet.ListObjects.items.QueryTable("My Query Table") 

任何build议将不胜感激。

根据此List对象的MSDN链接,不存在作为ListObjects属性的任何QueryTables集合。 正确的代码是:

 Set QT = querySheet.ListObjects.items(1).QueryTable 

您可能需要的是引用适当的ListObject item (只是示例代码):

 Dim LS as ListObject Set LS = querySheet.ListObjects("My LO 1") Set QT = LS.QueryTable 

另一种select是通过这种方式通过WorkSheet property来引用QT:

 Set QT = Worksheet("QTable").QueryTables("My Query Table") 

在Excel 2003和更高版本中,外部数据连接将创build一个QueryTable对象,其父级是工作表。 您可以通过QueryTables集合对象访问QueryTable对象。 像大多数集合对象一样,您可以将索引号或名称传递给(默认)Item方法来获取它。

 Sheet1.QueryTables("MyQtName") 

当您在新版本中打开2003工作表时,它仍然有一个QueryTable对象,并可以以相同的方式访问。 即使您转换文件格式,QueryTable仍然存在。

在2007年及以后的版本中,只有三种方法来创build将成为Worksheet.QueryTables成员的QueryTable:

  1. 通过代码
  2. 数据 – 来自文本
  3. 数据 – 来自networking

这些新版本中的所有其他UI外部数据连接都不会导致QueryTables成员,而是导致ListObject。 该ListObject将有且仅有一个QueryTable对象可以通过ListObject.QueryTable属性访问。

这是坏消息。 在ListObject中的父项的QueryTable没有Name属性。 那么,它就在那里,但是如果你尝试访问它,你会得到一个运行时错误1004。 我想MS决定,因为每个ListObject只有一个QueryTable,它没有任何意义,它应该有一个名字。

如果您尝试将Worksheet.QueryTables.QueryTable转换为ListObject,则外部数据连接将消失,并且新的ListObject不具有QueryTable。

由于您的QueryTables.Count返回零,所有您的QueryTables在ListObjects中,并没有名称。 ListObjects有名字。 您可以使用

 Sheet1.ListObjects("MyListName").QueryTable 

这是一个函数,它接受一个名称和一个工作表,并返回一个QueryTable,该QueryTable具有该名称或是具有该名称的ListObject的子项。

 Public Function QueryTableByName(ByVal sName As String, ByRef sh As Worksheet) As QueryTable Dim qt As QueryTable Dim lo As ListObject On Error Resume Next Set qt = sh.QueryTables(sName) On Error GoTo 0 If qt Is Nothing Then On Error Resume Next Set lo = sh.ListObjects(sName) On Error GoTo 0 If Not lo Is Nothing Then On Error Resume Next Set qt = lo.QueryTable On Error GoTo 0 End If End If Set QueryTableByName = qt End Function