ad

《Excel VBA+SQL数据管理与应用模板开发》_3.4 指定条件下的多表集合查询

网友投稿 127 2023-11-07

【摘要】 本书摘自《Excel VBA+SQL数据管理与应用模板开发》一书中第3章,第4节,韩小良著。

3.4 指定条件下的多表集合查询

《Excel VBA+SQL数据管理与应用模板开发》_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小时内删除侵权内容。

上一篇:《Python学习笔记 从入门到实战》_更了解Python的途径之一_2.6.1 输入信息
下一篇:《Excel VBA跟卢子一起学早做完,不加班(实战进阶版)》_提升工作效率_1.1.1 提取单元格中指定颜色的字体
相关文章

 发表评论

暂时没有评论,来抢沙发吧~

×