系统:Windows 7
软件:Excel 2010
使用场景or困惑
- 本公众号的一些文章中是使用Access做数据库的,很多操作都是通过SQL实现的,对比传统方式,还是高效了很多
- 那么如果只有Excel,能否实现Access那样的高效呢?也就是说将Excel作为数据库来操作
示例:Excel作为数据库,从Excel中获取来自于交通院,语文和数学成绩都是>80分的信息
实现结果
思考
- 传统方法:对数据表进行循环判断,找到满足条件的行
- 新方法:查询通过一句SQL实现
SQL = "Select " & filds & " From " & tbl_name & " Where (" & searchC & ")"
,逻辑过程如下:- 连接数据库
- 确定SQL语句
- 执行SQL语句
- 获取结果
- 断开数据库
SQL
代码
过程main
Sub main()
Dim dbAddr
dbAddr = ThisWorkbook.Path & "\数据源.xlsx"
Dim adConn As ADODB.Connection '连接
Set adConn = New ADODB.Connection
Dim rs As ADODB.Recordset
Set rs = New ADODB.Recordset
Dim SQL As String
Dim filds
Dim tbl_name
Dim searchC
adConn.Open "provider=Microsoft.ACE.OLEDB.12.0;" _
& "extended properties=excel 12.0;" _
& "data source=" & dbAddr
filds = "姓名,学院,语文,数学"
tbl_name = "[data$]"
Dim searchC1
Dim searchC2
Dim searchC3
Dim sht_name
Dim sht
Dim i
searchC1 = "学院='交通院'"
searchC2 = "语文>80"
searchC3 = "数学>80"
searchC = searchC1 & " and " & searchC2 & " and " & searchC3
SQL = "Select " & filds & " From " & tbl_name & " Where (" & searchC & ")"
Set rs = adConn.Execute(SQL)
sht_name = "示例"
Set sht = ThisWorkbook.Worksheets(sht_name)
For i = 1 To rs.Fields.Count Step 1
sht.Range("A1").Offset(0, i - 1) = rs.Fields(i - 1).Name '字段序号从0开始
Next i
sht.Range("A2").CopyFromRecordset rs
sht.Cells.EntireColumn.AutoFit
'关闭数据库
adConn.Close
Set adConn = Nothing
End Sub
代码截图
部分代码解读
- 数据库连接
Excel连接
adConn.Open "provider=Microsoft.ACE.OLEDB.12.0;" _
& "extended properties=excel 12.0;" _
& "data source=" & dbAddr
Access连接
With adConn
.Provider = "Microsoft.ACE.OLEDB.12.0;"
.Open "Data Source=" & dbAddr
End With
- 工作表的表示方法
tbl_name = "[data$]"
,使用[$]
- 复制rs信息到工作表:
sht.Range("A2").CopyFromRecordset rs
Ps:
1)采用ADO的方式连接的数据库,需要人为先在VBE中打开这个引用,菜单工具-引用
2)当数据量越大,本文中采用的方式,效率越明显,所以是不错的方法幺
以上为本次的学习内容,下回见
更多精彩,请关注微信公众号
扫描二维码,关注本公众号