一次解析文件2行-英雄云拓展知识分享
127
2023-11-07
【摘要】 本书摘自《Excel VBA+SQL数据管理与应用模板开发》一书中第3章,第4节,韩小良著。
3.4 指定条件下的多表集合查询
上面的两个例子是查找指定字段的所有记录。我们也可以增加限定条件,例如查找汇总 全部合同工、查找汇总全部劳务工、查找工龄在20年以上的所有员工工资(还有一个员工 基本信息表)等,此时可以使用WHERE 来设置具体的查询条件。
案 例 3 - 2 3
下面的例子是将当前工作簿中1-6月的工资表汇总到一张工作表中,仅仅查询汇总合同
工。请打开案例文件,查看原文件数据和运行结果。
Sub 案例3-230
Dim cnn As New ADODB.Connection
Dim rs As ADODB.Recordset
Dim ws As Worksheet
Set ws =ThisWorkbook.Worksheets("汇总表")
ws.Range("A2:G1000").ClearContents
'建立与工作簿的连接
With cnn
.Provider ="microsoft.ace.oledb.12.0"
.ConnectionString ="Extended Properties=Excel 12.0;"_
&"Data Source="&ThisWorkbook.FullName
.Open
End With
进行统计汇总
SQL="select'1 月'as 月份,*from[1 月$]where 合同类型='合同工'union" &"select'2 月'as 月份,*from[2 月$]where 合同类型='合同工'union"_ &"select'3 月'as 月份,*from[3 月$]where 合同类型='合同工'union"_ &"select'4 月'as 月份,*from[4 月S]where 合同类型='合同工'union"_ &"select'5 月'as 月份,*from[5 月$]where 合同类型='合同工'union"_ &"select'6 月 'as 月份,*from[6 月$]where 合同类型='合同工!"
Set rs =New ADODB.Recordset
rs.Open SQL,cnn,adOpenKeyset,adLockOptimistic
'复制汇总结果
ws.Range("A2").CopyFromRecordset rs
'关闭查询和连接
rs.Close
cnn.Close
Set rs =Nothing
Set cnn =Nothing
End Sub
案例3-24
下面的例子是将当前工作簿中1-6月的工资表汇总到一张工作表中,仅仅查询汇总工龄 在10年以上的员工(注意,工资表中并没有员工的年龄信息,而员工信息表中才有,因此 这个查询不仅仅是集合查询,还是多表关联查询),如图3-26所示。请打开案例文件,查看 原文件数据和运行结果。
Sub 案例3-240
Dim cnn As New ADODB.Connection
Dim rs As ADODB.Recordset
Dim ws As Worksheet
Set ws =This Workbook.Worksheets("汇总表")
ws.Range("A2:F1000").ClearContents
'建立与工作簿的连接
With cnn
.Provider ="microsoft.ace.oledb.12.0"
.ConnectionString="Extended Properties=Excel 12.0;"_
&"Data Source="&ThisWorkbook.FullName
.Open
End With
'进行统计汇总
SQL="select'1 月'as 月份,*from[1 月$]where[1 月$].姓名 in(select [基本信息$].姓名
from[基本信息S]where [基本信息S].工龄>10)union"_
&"select'2 月'as 月份,*from[2 月$]where[2 月$].姓名 in(select [基本信息$].姓名 from
[基本信息S]where [基本信息$].工龄>10)union”_
&"select'3 月'as 月份,*from[3 月$]where[3 月$].姓名 in(select [基本信息$].姓名 from
[基本信息S]where [基本信息S].工龄>10)union"_
&"select'4 月'as 月份,*from[4 月$]where[4 月$].姓名 in(select [基本信息$].姓名 from
[基本信息$]where[基本信息$].工龄>10)union"_
&"select'5 月'as 月份,*from[5 月$]where[5 月$].姓名 in(select [基本信息$].姓名 from
[基本信息$]where[基本信息$].工龄>10)union"_
&"select'6 月'as 月份,*from[6 月$]where[6 月$].姓名 in(select [基本信息$].姓名 from [基本信息$]where[基本信息$].工龄>10)"
Set rs =New ADODB.Recordset
rs.Open SQL,cnn,adOpenKeyset,adLockOptimistic
'复制汇总结果
ws.Range("A2").CopyFromRecordset rs
'关闭查询和连接
rs.Close
cnn.Close
Set rs =Nothing
Set cnn =Nothing
End Sub
3.5 Excel 工作表查询的特殊问题
Excel 工作表的结构干变万化,每个人操作工作表的习惯也不同,导致很多 表格并不是标准规范的数据表单。那么,如何在各种繁杂结构的表格中也能使用 ADO+SQL 实现高效数据查询与汇总呢?
标准规范表单的查询
一个标准规范的表单,工作表第一行就是名称规范的标题(字段名称),没有那些打印 格式的大表头、合并单元格等,此时的数据查询就很简单了, SQL 语句直接写成以下的标准 格式即可,这个语句是对整个工作表的数据区域进行查询的。
Select 字段列表 from[工作表名$]where 条 件
前面介绍的例子都是在标准规范的表单上进行的。
以一个定义名称的数据区域进行查询
如果要查询的不是整个工作表,而是事先已经定义好名称的一个数据区域,此时,SQL 语句需要写成以下的格式,也就是直接写上定义的名称即可。
Select 字段列表 from 定义的数据区域名称 where 条 件
版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们 18664393530@aliyun.com 处理,核实后本网站将在24小时内删除侵权内容。
发表评论
暂时没有评论,来抢沙发吧~