zoukankan      html  css  js  c++  java
  • Sql in VBA 之 初识ADO

      少年不知……,废话不多说,直接贴代码,

    学生表:

    
    
    ID	姓名	性别	年龄	爱好	得分
    1	张三	男	14	发呆	55
    2	李四	女	15	熬夜	64
    3	王五	男	10	竞走	55
    4	赵六	女	16	化妆	79
    5	麻七	男	10	画画	65
    6	大红	女	13	养花	3
    7	大红花	女	10	送化	1

    在Excel VBA中用ADO要注意Excel版本号,用 Application.Version 来判断:

    1 If Application.Version < 12 Then 
    2   Str_cnn = "Provider=Microsoft.jet.OLEDB.4.0;Extended Properties=Excel 8.0;Data Source=" & MyPath
    3 Else
    4   Str_cnn = "Provider=Microsoft.ACE.OLEDB.12.0;Extended Properties=Excel 12.0;Data Source=" & MyPath
    5 End If

    下面上整体代码(用Execute来执行ADO):

    注意:HDR=yes表示第一行是标题
     1 Sub DoSql_Execute()
     2     Dim cnn As Object, rest As Object
     3     Dim MyPath$, Str_cnn$, Sql$
     4     Dim i&
     5     Set cnn = CreateObject("adodb.connection")              '后期绑定ADO
     6     
     7     MyPath = ThisWorkbook.FullName                          '数据源工作簿的完整路径
     8     
     9     If Application.Version < 12 Then                        '判断Excel版本号,以使用不同的连接字符串
    10         Str_cnn = "Provider=Microsoft.jet.OLEDB.4.0;Extended Properties='Excel 8.0;HDR=yes';Data Source=" & MyPath
    11     Else
    12         Str_cnn = "Provider=Microsoft.ACE.OLEDB.12.0;Extended Properties='Excel 12.0;HDR=yes';Data Source=" & MyPath
    13     End If
    14     cnn.Open Str_cnn                                        '建立链接
    15     
    16     Sql = "select * from [学生表$] "                         'sql语句
    17     Set rest = cnn.Execute(Sql)                             '执行sql,始终得到一个新的记录集
    18     
    19     [a:f].ClearContents                                     '清除[d:e]区域的值
    20     
    21     For i = 0 To rest.Fields.Count - 1                      '利用fields属性获取字段名
    22         Cells(1, i + 1) = rest.Fields(i).Name
    23     Next
    24     Range("a2").CopyFromRecordset rest                      '使用单元格对象的CopyFromRecordset方法将rest的内容复制过来
    25 
    26     cnn.Close
    27     
    28     Set cnn = Nothing
    29     
    30 End Sub

    下面用 rst 执行SQL语句:

     1 Sub DoSql_Recordset()
     2     Dim cnn As Object, rst As Object
     3     Dim Mypath As String, Str_cnn As String, Sql As String
     4     Dim i As Long
     5     Set cnn = CreateObject("adodb.connection")
     6     Set rst = CreateObject("adodb.Recordset")
     7     Mypath = ThisWorkbook.FullName
     8 
     9     If Application.Version < 12 Then
    10         Str_cnn = "Provider=Microsoft.jet.OLEDB.4.0;Extended Properties=Excel 8.0;Data Source=" & Mypath
    11     Else
    12         Str_cnn = "Provider=Microsoft.ACE.OLEDB.12.0;Extended Properties=Excel 12.0;Data Source=" & Mypath
    13     End If
    14     cnn.Open Str_cnn
    15 
    16     Sql = "SELECT 姓名,成绩 FROM [Sheet1$] WHERE 成绩>=80"
    17  
    18     rst.Open Sql, cnn, 1, 3
    19     'rst执行SQL语句,并将查询结果放入记录集
    20     
    21     [d:e].ClearContents
    22     '清空[d:e]区域的值
    23     For i = 0 To rst.Fields.Count - 1
    24     '利用fields属性获取所有字段名,fields包含了当前记录有关的所有字段,fields.count得到字段的数量
    25     '由于Fields.Count下标为0,又从0开始遍历,因此总数-1
    26         Cells(1, i + 4) = rst.Fields(i).Name
    27     Next
    28     Range("d2").CopyFromRecordset rst
    29     '使用单元格对象的CopyFromRecordset方法将rst内容复制到D2单元格为左上角的单元格区域
    30        
    31     rst.Close
    32     cnn.Close
    33     
    34     Set rst = Nothing
    35     Set cnn = Nothing
    36     '释放内存
    37 End Sub
  • 相关阅读:
    git撤销操作总结
    pull request的一些思考
    设计模式之门面模式
    设计模式之策略模式
    java中的堆栈
    git冲突的处理
    Eclipse 未正常退出,导致进不去的问题
    think in java读后总结---Map集合的几种遍历方式
    maven打包后项目名称不对
    python之正则表达式
  • 原文地址:https://www.cnblogs.com/Stefan-Gao/p/13520359.html
Copyright © 2011-2022 走看看