Various Tables in Excel after 2007: ListObjects, QueryTables
主要有2大类table(以我目前所了解到的)
1. ListObject
------------------
通过toolbar / UI 添加的表格,可以是已有数据的转化,也可以是带有SQL等后端支持的数据表。
基本测试:
Debug.Print ActiveSheet.ListObjects.Count
输出 Query:
Debug.Print ActiveSheet.ListObjects(1).QueryTable.CommandText
2. QueryTable
---------------------
通过VBA里,直接生成的数据表格。在Excel的Data Tab下的connection里可以看到相应的connection属性。
基本测试:
Debug.Print ActiveSheet.QueryTables.Count
输出 Query:
Debug.Print ActiveSheet.QueryTables(1).CommandText
---------------------------------------
**. 除了以上两种object可以获取table的属性以外,还有一种:WorkbookConnection (是Connections的子类)
Connections是基于workbook的,一次性可以把整个excel中的所有设置过Query的connection都找到。
以上针对两种table输出Query的语句 (这里需要指定table name)
1) Debug.Print ThisWorkbook.Connections("Table_Overall_HomeAway").ODBCConnection.CommandText
2) Debug.Print ThisWorkbook.Connections("Connection").ODBCConnection.CommandText
***. 最后ADO也可以解决绝大多数Table和Query之间的问题,但是和QueryTable一样,这个方法只能在VBA中实现,只适合后台分析和模型使用,界面操作性不如ObjectList这种界面生成的易于维护和使用。
总结:
以上2种table,3种方法,从属关系相对复杂:
*. 类的关系:QueryTable是ObjectList的子类,所以为获取普通的表格(属于ObjectList类)的Query时,也需要调用QueryTable这个属性,以获取commandtext。
*. 识别方式:ListObect和QueryTable 虽然有类的相关性,但是两者不能通过一个父类一次性都找到,正如上面提到的两种count方式,得出的2个数字,是互不相干的。相应的标识方式也是分别在listobjects() 和QueryTables() 中的参数进行设置。
Note: 做demo时,要在VBA中生成一个QueryTable(此表格无法在UI中操作获得),以下是一个demo:
==================
Sub qtadd()
Dim qt As QueryTable
sqlstring = "select * from main.ts_wnba"
connstring = _
"ODBC;Driver={SQLite3 ODBC Driver};DATABASE=K:\TeamSheet\NBA\DataBase\ts.sqlite;"
With ActiveSheet.QueryTables.Add(Connection:=connstring, _
Destination:=Range("A50"), Sql:=sqlstring)
.Refresh
End With
End Sub
==================
1. ListObject
------------------
通过toolbar / UI 添加的表格,可以是已有数据的转化,也可以是带有SQL等后端支持的数据表。
基本测试:
Debug.Print ActiveSheet.ListObjects.Count
输出 Query:
Debug.Print ActiveSheet.ListObjects(1).QueryTable.CommandText
2. QueryTable
---------------------
通过VBA里,直接生成的数据表格。在Excel的Data Tab下的connection里可以看到相应的connection属性。
基本测试:
Debug.Print ActiveSheet.QueryTables.Count
输出 Query:
Debug.Print ActiveSheet.QueryTables(1).CommandText
---------------------------------------
**. 除了以上两种object可以获取table的属性以外,还有一种:WorkbookConnection (是Connections的子类)
Connections是基于workbook的,一次性可以把整个excel中的所有设置过Query的connection都找到。
以上针对两种table输出Query的语句 (这里需要指定table name)
1) Debug.Print ThisWorkbook.Connections("Table_Overall_HomeAway").ODBCConnection.CommandText
2) Debug.Print ThisWorkbook.Connections("Connection").ODBCConnection.CommandText
***. 最后ADO也可以解决绝大多数Table和Query之间的问题,但是和QueryTable一样,这个方法只能在VBA中实现,只适合后台分析和模型使用,界面操作性不如ObjectList这种界面生成的易于维护和使用。
总结:
以上2种table,3种方法,从属关系相对复杂:
*. 类的关系:QueryTable是ObjectList的子类,所以为获取普通的表格(属于ObjectList类)的Query时,也需要调用QueryTable这个属性,以获取commandtext。
*. 识别方式:ListObect和QueryTable 虽然有类的相关性,但是两者不能通过一个父类一次性都找到,正如上面提到的两种count方式,得出的2个数字,是互不相干的。相应的标识方式也是分别在listobjects() 和QueryTables() 中的参数进行设置。
Note: 做demo时,要在VBA中生成一个QueryTable(此表格无法在UI中操作获得),以下是一个demo:
==================
Sub qtadd()
Dim qt As QueryTable
sqlstring = "select * from main.ts_wnba"
connstring = _
"ODBC;Driver={SQLite3 ODBC Driver};DATABASE=K:\TeamSheet\NBA\DataBase\ts.sqlite;"
With ActiveSheet.QueryTables.Add(Connection:=connstring, _
Destination:=Range("A50"), Sql:=sqlstring)
.Refresh
End With
End Sub
==================
还没人赞这篇日记