VBA连接Excel数据库

微信公众号原文

系统:Windows 7
软件:Excel 2010

使用场景or困惑

  • 本公众号的一些文章中是使用Access做数据库的,很多操作都是通过SQL实现的,对比传统方式,还是高效了很多
  • 那么如果只有Excel,能否实现Access那样的高效呢?也就是说将Excel作为数据库来操作

示例:Excel作为数据库,从Excel中获取来自于交通院,语文和数学成绩都是>80分的信息
2.png

实现结果
3.png

思考

  1. 传统方法:对数据表进行循环判断,找到满足条件的行
  2. 新方法:查询通过一句SQL实现SQL = "Select " & filds & " From " & tbl_name & " Where (" & searchC & ")",逻辑过程如下:
    • 连接数据库
    • 确定SQL语句
    • 执行SQL语句
    • 获取结果
    • 断开数据库

SQL
4.png

代码

过程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

代码截图
5.png

部分代码解读

  1. 数据库连接
    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
  1. 工作表的表示方法tbl_name = "[data$]",使用[$]
  2. 复制rs信息到工作表:sht.Range("A2").CopyFromRecordset rs

Ps
1)采用ADO的方式连接的数据库,需要人为先在VBE中打开这个引用,菜单工具-引用
1.png
2)当数据量越大,本文中采用的方式,效率越明显,所以是不错的方法幺


以上为本次的学习内容,下回见

更多精彩,请关注微信公众号
扫描二维码,关注本公众号

公众号底部二维码.jpg

猜你喜欢

转载自blog.csdn.net/fourSeasonBeans/article/details/80631657