HI,大家好,我是星光。上期我们聊了SQL常用查询语句中的字段问题,其简化版语法如下:
SELECT 字段名 FROM 表名
▎ 1.区域成表
见下图▼
SELECT 姓名,学科 FROM [数据表$A2:D6]
SELECT 姓名,爱好 FROM [学生表$A2:F]
SELECT * FROM [学生表$D:G]
▎ 2.跨工作簿的表
SELECT * FROM
[D:\EH小学\学生表.xlsx].[成绩表$]
FROM子句指定表的字符串有两个部分构成,第一个中括号内是目标工作簿的存放路径+带后缀的工作簿名称,后一个中括号内是工作表名称,两个中括号之间使用英文点号(.)相连。
如果是通过VBA+ADO使用SQL语句…
敲书柜前方预警:VBA基础差的童鞋请自行跳过以下内容……
相比于OLE DB法,VBA+ADO的方法要灵活的多,它可以使用ADO直接创建并打开与指定工作簿的链接,因此SQL语句也就无需再指定工作簿完整名称等。
代码参考如下▼
Sub ADO_SQL()
'适用于除2003版以外的高版本Excel
Dim cnn As Object, rst As Object
Dim strPath As String, strCnn As String, strSQL As String
Dim i As Long
Set cnn = CreateObject("adodb.connection")
strPath = "D:\EH小学\学生表.xlsx" '指定工作簿
strCnn = "Provider=Microsoft.ACE.OLEDB.12.0;Extended Properties=Excel 12.0;Data Source=" & strPath
cnn.Open strCnn '创建并打开到指定工作簿的链接
strSQL = "SELECT * FROM [成绩表$]" 'strSQL语句,查询成绩表的所有数据
Set rst = cnn.Execute(strSQL) '执行strSQL
Cells.ClearContents
For i = 0 To rst.Fields.Count - 1
Cells(1, i + 1) = rst.Fields(i).Name
Next
Range("a2").CopyFromRecordset rst
cnn.Close
Set cnn = Nothing
End Sub
以上第7行代码直接指定了需要连接的工作簿完整名称,SQL语句内也就不再需要特别处理。
但更多的情况是,ADO创建的链接是一个工作簿,需要获取的数据在另一个或多个工作簿,例如两个工作簿之间的数据查询统计。此时通常使用的代码如下▼
Sub ADO_SQL2()
'适用于除2003版以外的高版本Excel
Dim cnn As Object, rst As Object
Dim strPath As String, strCnn As String, strSQL As String
Dim i As Long
Set cnn = CreateObject("adodb.connection")
strPath = ThisWorkbook.FullName '代码所在工作簿的完整名称
strCnn = "Provider=Microsoft.ACE.OLEDB.12.0;Extended Properties=Excel 12.0;Data Source=" & strPath
strCnn '创建到代码所在工作簿的链接
strSQL = "SELECT * FROM [Excel 12.0;DATABASE=D:\EH小学\学生表.xlsm].[成绩表$]"
Set rst = cnn.Execute(strSQL) '执行SQL
Cells.ClearContents
For i = 0 To rst.Fields.Count - 1
i + 1) = rst.Fields(i).Name
Next
rst
cnn.Close
Set cnn = Nothing
End Sub
第7行代码创建了当前工作簿的链接,第10行代码SQL语句中又指定了另外一个工作簿的链接。SQL语句如下▼
SELECT * FROM
[Excel 12.0;DATABASE=D:\EH小学\学生表.xlsx].[成绩表$]
FROM子句指定表的字符串有两部分组成。第一个中括号中,Excel 12.0是目标工作簿的版本号,在第2章教程里我们讲过,Excel 12.0适用于除了2003以外的所有Excel版本。DATABASE指定的是数据源工作簿的路径和名称。第2个中括号内是工作表名。两个中括号之间使用英文点号相连。
……
看起来似乎VBA+ADO方法的SQL语句比OLE DB法更复杂?确实如此,不过它的功能也更强大。比如,它可以使用VBA的判断和循环语句,VBA对象的属性和方法等,有条件的筛选工作簿和工作表……相比之下,OLE DB中的SQL语句就是纯手工常量模式了。当然,更重要的是,VBA+ADO的方式不但可以查数据,还可以增改删数据,后者却只限于查。
打个响指,今天分享的内容就这些,关注我,下期再见。
⏩需要系统学习Excel却找不到优质教程?学习Excel的过程中遇到疑难问题,却找不到人及时作出解答?
加入我的付费社群,学习+训练+答疑,与6000+在线会员一起,同微软最有价值专家MVP同行,全面精进Excel之道
🚂>>~
加入我的付费会员,全面学习Excel
透视表 函数 图表 VBA PQ想学啥学啥
👀