sql查询上个⽉的数据_VBA+SQL篇(SQL查询数据及其实际
应⽤)
3.1查询⽅法与⽰例
实例⼀:
从⼯作簿“数据源”⼯作表中提取所有的数据信息,保存到“查询表“。
⼯号姓名部门学历⼯龄
A001张1财务部本科20
A002张2⾏政部硕⼠21
A003张3销售部⼤专22
A004张4财务部本科23
A005张5⾏政部硕⼠24
A006张6销售部⼤专25
A007张7财务部本科26
A008张8⾏政部硕⼠27
A009张9销售部⼤专28
A010张10财务部本科29
A011张11⾏政部硕⼠30
A012张12销售部⼤专31
A013张13财务部本科32
A014张14⾏政部硕⼠33
A015张15销售部⼤专34
A016张16财务部本科35
A017张17⾏政部硕⼠36
A018张18销售部⼤专37
A019张19财务部本科38
A020张20⾏政部硕⼠39
A021张21销售部⼤专40
查询代码如下:
Sub 从⼯作簿查询数据()
Dim cnn As New ADODB.Connection
Dim rs As New ADODB.Recordset
Dim SQL As String
Dim ws As Worksheet
Dim i As Integer
Set ws = ThisWorkbook.Worksheets("查询表")
ws.Cells.Clear
'建⽴与Excel⼯作表的连接
With cnn
.provider = "microsoft.ace.oledb.12.0"
.connectionstring = "extended properties =excel 12.0;datasource=" & ThisWorkbook.Path & "\实例⼀.xlsm"  .Open
End With
'设置查语句
SQL = "select * from [数据源$] "
rs.Open SQL, cnn, adopenkeyset,adlockoptimistic
'复制字段列表,制作报表标题
For i = 1 To rs.Fields.Count
ws.Cells(1, i) = rs.Fields(i - 1).Name
Next i
'⽤CopyFromRecordset⽅法复制记录到查询表中
ws.Range("a2").CopyFromRecordsetrs
With ws.UsedRange
.Borders(xlEdgeLeft).LineStyle = xlContinuous
.Borders(xlEdgeTop).LineStyle = xlContinuous
.Borders(xlEdgeBottom).LineStyle = xlContinuous
.Borders(xlEdgeRight).LineStyle = xlContinuous
.
Borders(xlInsideVertical).LineStyle = xlContinuous
.Borders(xlInsideHorizontal).LineStyle = xlContinuous
End With
'关闭连接,释放变量
rs.Close
cnn.Close
Set rs = Nothing
Set cnn = Nothing
End Sub
重要语句说明:
1、建⽴与⼯作簿的ADO连接:
With cnn
.provider = "microsoft.ace.oledb.12.0"
.connectionstring = "extended properties =excel 12.0;datasource=" & ThisWorkbook.Path & "\实例⼀.xlsm"
这⾥的“带完整路径的⼯作簿名称“需要指定具体的⼯作簿。
(1)如果是当前运⾏宏的⼯作簿,可以写为thisworkbook.fullname.
(2)如果是其他⼯作簿,就必须写完全路径的⽂件。
2、获取字段个数和名称
获取字段个数是使⽤fields集合的count属性。
unt
获取字段名称是使⽤field对象的name属性,注意第1个字段是序号是0,第2个字段序号是1,最后⼀个字段的序号是unt-1
rs.fields(i).name
3、复制查询结果到⼯作表
对查询到的数据结果(注意,数据结果并不包括标题,⽽仅仅是满⾜条件的数据⾏,也就是数据记录),可以使⽤range对象的copyfromrecordset⽅法,即:
ws.range(“a2”).copyfromrecordset rs
两张表格查重复数据如果要循环每个记录来输出数据就⽐较⿇烦,⽽且速度也很慢,但在某些情况下,必须使⽤循环⽅法来输出数据,例如,输出到窗体上的复合框和列表框。此时,就要使⽤下⾯的循环语句:
for i= 1 dcount
forj = 1 to unt
cells(i+1,j)=rs.fields(j-1).value
nextj
next i
不论输出中个字段,都必须使⽤movenext⽅法来将指针往下逐⾏移动来获取每个记录;否则,仅仅是获取第1个记录。
实例⼆:
从数据源⼯作表中提取不重复的部门记录到listbox1,效果如下:
代码如下:
Dim cnn As New ADODB.Connection
Private Sub CommandButton1_Click()
cnn.Close
Set cnn = Nothing
End
End Sub
Private Sub ListBox1_Click()
Dim rs As New ADODB.Recordset
Dim sql As String
Dim i As Integer
sql = "select ⼯号,姓名,学历,⼯龄 from [数据源$] where 部门='" & ListBox1.Value & "'"
rs.Open sql, cnn, adOpenKeyset,adLockOptimistic
With ListBox2
.Clear
.AddItem "⼯号" & Chr(9) & "姓名"& Chr(9) & "学历" & Chr(9) &"⼯龄"
For i = 1 To rs.RecordCount
.AddItem rs!⼯号& Chr(9) & rs!姓名 & Chr(9) & rs!学历 & Chr(9) & rs!⼯龄
rs.MoveNext
Next i
End With
rs.Close
Set rs = Nothing
End Sub
Private Sub UserForm_Initialize()
Dim rs As New ADODB.Recordset
Dim sql As String
Dim i As Integer
With cnn
.provider = "microsoft.ace.oledb.12.0"
.ConnectionString = "extended properties =excel 12.0;datasource=" & ThisWorkbook.FullName    .Open
End With
sql = "select distinct 部门 from [数据源$]"
rs.Open sql, cnn, adOpenKeyset,adLockOptimistic
For i = 1 To rs.RecordCount
ListBox1.AddItem rs!部门
rs.MoveNext
Next i
rs.Close
Set rs = Nothing
End Sub
实例三、上述实例中,若要查询⼯龄在25以上,学历为本科或硕⼠的。
则修改SQL语句为:
sql = "select ⼯号,姓名,学历,⼯龄 from [数据源$] where 部门='" & ListBox1.Value & "' and ⼯龄>25 and (学历='本科'or 学历='硕
⼠')"
上述实例中,若要查询⼯龄在25以上,学历为本科或硕⼠的。
则修改SQL语句为:
sql = "select ⼯号,姓名,学历,⼯龄 from [数据源$] where 部门='" & ListBox1.Value & "' and ⼯龄>25 and (学历='本科'or 学历='硕
⼠')"
上述实例中,若要查询⼯龄在25到40之间的的。
则修改SQL语句为:
sql = "select ⼯号,姓名,学历,⼯龄 from [数据源$] where 部门='" & ListBox1.Value & "' and ⼯龄 between 25 and 40"
再⽤order by ⼯龄,top n 提取前n条信息。
实例四:计算条件下的查询
若要计算销售台数*单价⼤于等于15000的信息,则sql语句为:
sql = "select ⼯号,姓名,学历,⼯龄 from [数据源$] where 部门='" & ListBox1.Value & "' and 销售台
数*单价>=15000"
若要查询⼯资⼤于平均⼯资的,则sql语句为:
sql ="select ⼯号,姓名,学历,⼯龄 from [数据源$]where 部门='" & ListBox1.Value & "' and⼯资>(select avg(⼯资) from [数据源$])"
3.2多表条件查询
在前⾯介绍的多种查询⽅法中,都是从⼀个数据表中进⾏数据查询的,在实际⼯作中,常常要从两个数据表或更多的数据表中进⾏查询检索,这时,有两种⽅法来实现,⼀种是利⽤where⼦句;另⼀种是利⽤join⼦句。
3.2.1利⽤where进⾏多表查询
利⽤where进⾏多表查询实质上嵌套查询,也就是先从⼀个表中查询出满⾜条件的数据,再把这个查询结果作为另⼀个表格的查询条件。
有两个⼯作表,⼀个保存省份及所属地区名称的表格;另⼀个是销售记录表(只有省份字段,没有地区字段)。现要求将华北地区的所有数据查出来。
“销售记录”⼯作表的“省份”字段与“地区列表”⼯作表的“省份”字段是相同的,这样就要以通过这个字段来匹配每个省份所属的地区,进⽽统计出指定地区的数据。
因此,先从表格“地区列表“中把华北的省份名称查出来,然后将其作为条件,再从表格”销售记录“中查询省份是刚才查出的那些省份的记录。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。