微信公众号原文
系统:Windows 7
软件:Excel
使用场景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 dbAddrdbAddr = ThisWorkbook.Path & "\数据源.xlsx"Dim adConn As ADODB.Connection '连接Set adConn = New ADODB.ConnectionDim rs As ADODB.RecordsetSet rs = New ADODB.RecordsetDim SQL As StringDim fildsDim tbl_nameDim searchCadConn.Open "provider=Microsoft.ACE.OLEDB.12.0;" _& "extended properties=excel 12.0;" _& "data source=" & dbAddrfilds = "姓名,学院,语文,数学"tbl_name = "[data$]"Dim searchC1Dim searchC2Dim searchC3Dim sht_nameDim shtDim isearchC1 = "学院='交通院'"searchC2 = "语文>80"searchC3 = "数学>80"searchC = searchC1 & " and " & searchC2 & " and " & searchC3SQL = "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 1sht.Range("A1").Offset(0, i - 1) = rs.Fields(i - 1).Name '字段序号从0开始Next isht.Range("A2").CopyFromRecordset rssht.Cells.EntireColumn.AutoFit'关闭数据库adConn.CloseSet adConn = NothingEnd 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=" & dbAddrEnd With
工作表的表示方法tbl_name = "[data$]"
,使用[$]
复制rs信息到工作表:sht.Range("A2").CopyFromRecordset rs
Ps:
1)采用ADO的方式连接的数据库,需要人为先在VBE中打开这个引用,菜单工具-引用
2)当数据量越大,本文中采用的方式,效率越明显,所以是不错的方法幺
以上为本次的学习内容,下回见
更多精彩,请关注微信公众号
扫描二维码,关注本公众号