zoukankan      html  css  js  c++  java
  • 利用ADO操作外部数据——Excel之VBA(15)

    引例:

    在VBA里录制导入现有外部数据的宏查看宏代码 

     1 Sub 宏1()
     2 '
     3 ' 宏1 宏
     4 '
     5 
     6 '
     7     Application.CutCopyMode = False
     8     With ActiveSheet.ListObjects.Add(SourceType:=0, Source:=Array( _
     9         "OLEDB;Provider=Microsoft.ACE.OLEDB.12.0;Password="""";User ID=Admin;Data Source=E:dataEdata.xlsx;Mode=Share Deny Write;Extended Proper" _
    10         , _
    11         "ties=""HDR=YES;"";Jet OLEDB:System database="""";Jet OLEDB:Registry Path="""";Jet OLEDB:Database Password="""";Jet OLEDB:Engine Type=37;" _
    12         , _
    13         "Jet OLEDB:Database Locking Mode=0;Jet OLEDB:Global Partial Bulk Ops=2;Jet OLEDB:Global Bulk Transactions=1;Jet OLEDB:New Databas" _
    14         , _
    15         "e Password="""";Jet OLEDB:Create System Database=False;Jet OLEDB:Encrypt Database=False;Jet OLEDB:Don't Copy Locale on Compact=Fal" _
    16         , _
    17         "se;Jet OLEDB:Compact Without Replica Repair=False;Jet OLEDB:SFP=False;Jet OLEDB:Support Complex Data=False;Jet OLEDB:Bypass User" _
    18         , _
    19         "Info Validation=False;Jet OLEDB:Limited DB Caching=False;Jet OLEDB:Bypass ChoiceField Validation=False" _
    20         ), Destination:=Range("$C$5")).QueryTable
    21         .CommandType = xlCmdTable
    22         .CommandText = Array("data$")
    23         .RowNumbers = False
    24         .FillAdjacentFormulas = False
    25         .PreserveFormatting = True
    26         .RefreshOnFileOpen = False
    27         .BackgroundQuery = True
    28         .RefreshStyle = xlInsertDeleteCells
    29         .SavePassword = False
    30         .SaveData = True
    31         .AdjustColumnWidth = True
    32         .RefreshPeriod = 0
    33         .PreserveColumnInfo = True
    34         .SourceConnectionFile = "C:UserseonDocuments我的数据源Edata data$.od.odc"
    35         .SourceDataFile = "E:dataEdata.xlsx"
    36         .ListObject.DisplayName = "表_Edata_data_.od"
    37         .Refresh BackgroundQuery:=False
    38     End With
    39 End Sub
    View Code

     会发现宏代码非常的缀长,实际上并不需要这么多

    核心代码:OLEDB;Provider=Microsoft.ACE.OLEDB.12.0;Data Source=E:dataEdata.xlsx;
    说明:连接别的数据库,这两句就够了

    对于Excel还有一个扩展属性:
    是否表头:
    Extended Properties="HDR=YES;";

    标准句式:"Provider = Microsoft.ACE.OLEDB.12.0;Data Source=E:dataEdata.xlsx;extended properties=""excel 12.0;HDR=YES"""

    一、使用ADO连接外部Excel数据源

    连接步骤:

    1 在VBE界面中 工具—引用
    勾选Microsoft ActiveX Data Object x.x Library

    2 连接代码

    Sub test()
    Dim conn As New ADODB.Connection
    conn.Open "Provider = Microsoft.ACE.OLEDB.12.0;Data Source=D:datadata.xlsx;extended properties=""excel 12.0;HDR=YES"""
    ‘这里使用SQL对数据进行操作
    conn.Close
    End Sub

    抓取数据:

    Range(“a1”).CopyFromRecordset conn.Execute(“select * from [data$]”)

    二、常用SQL语句

    查询数据 select * from [data$]
    查询某几个字段 select 姓名,年龄 from [data$]
    带条件的查询 select * from [data$] where 性别 = "男“
    合并两个表的数据 select * from [data$] union all select * from [data2$]
    插入新纪录 insert into [data$] (姓名,性别,年龄) values ('AA','男',33)
    修改一条数据 update [data$] set 性别=‘男’,年龄=16 where 姓名=‘张三‘
    删除一条数据 delete from [data$] where 姓名='张三'
    使用LEFT JOIN …ON… (类似于VLOOKUP) select [data3$].姓名,性别,年龄,月薪 from [data$] left join [data3$] on [data$].姓名=[data3$].姓名
    先UNION ALL 再LEFT JOIN select * from (select * from [data$] union all select * from [data2$])a left join [data3$] on a.姓名=[data3$].姓名
    将查询结果赋值到数组 arr = Application.WorksheetFunction.Transpose(conn.Execute("select * from [data$]").GetRows)

    示例代码:

    Sub test()
    
    Dim conn As New ADODB.Connection
    
    Dim sql As String
    
    conn.Open "Provider = Microsoft.ACE.OLEDB.12.0;Data Source=E:dataEdata.xlsx;extended properties=""excel 12.0;HDR=YES"""
    '- - - - - - - - - - - - - - - - - - - - - - - - - - - - -分割线 - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    
    '抓取前先清除数据
    Range("a2:z100").ClearContents
    
    
    '正式步骤
    
    
    'sql = "insert into [data$] (姓名,性别,年龄) values ('田七','男',33)"
    
    'conn.Execute (sql)
    
    
    
    sql = "select a.姓名,性别,年龄,月薪 from (select * from [data$] union all select * from [data2$])a left join [data3$] on a.姓名 = [data3$].姓名"
    
    Range("a2").CopyFromRecordset conn.Execute(sql)       'CopyFromRecordset 从记录集拷贝
    
    
    
    '- - - - - - - - - - - - - - - - - - - - - - - - - - - - -分割线- - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    conn.Close
    
    End Sub

    三、使用ADO连接ACCESS数据库

    连接步骤:

    1 在VBE界面中 工具—引用
    勾选Microsoft ActiveX Data Objects x.x Library


    2 连接代码

    Sub test()
    Dim conn As New ADODB.Connection
    conn.Open "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=D:dataAdata.accdb" 
    '这里使用SQL对数据进行操作
    conn.Close
    End Sub

    示例代码:

    Sub test()
    
    Dim conn As New ADODB.Connection
    
    Dim sql As String
    
    conn.Open "Provider = Microsoft.ACE.OLEDB.12.0;Data Source=E:dataAdata.accdb"
    '- - - - - - - - - - - - - - - - - - - - - - - - - - - - -分割线 - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    
    '抓取前先清除数据
    Range("a2:z100").ClearContents
    
    
    '正式步骤
    
    
    sql = "delete from [客户信息表] where 公司名称='森通'"   '在其他数据库,表名不用加$
    
    conn.Execute (sql)
    
    ' Range("a2").CopyFromRecordset conn.Execute(sql)       'CopyFromRecordset 从记录集拷贝
    
    
    
    '- - - - - - - - - - - - - - - - - - - - - - - - - - - - -分割线- - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    conn.Close
    
    End Sub

    四、课程小结及课后练习

    课程小结

    需要理解并记住写法的概念
    select * from [data$]
    CONN.OPEN .EXECUTE .CLOSE


    需要理解的概念
    ADO与打开文件做操作的差别 和不同的应用场景
    理解Ado连接代码的意义
    了解SQL语句


    课后练习

    Excel库存管理系统:
    问题:
    作业表中完成数据查询
    要求:
    共2440行数据。

  • 相关阅读:
    Silverlight 4中把DataGrid数据导出Excel
    C#正则的委托和lambda表达式用法
    C#简单的写日志方法
    GAE上传失败
    asp.net后台进程做定时任务
    ASP.NET页面生命周期描述
    巴士电台新版发布
    jQuery 1.51.7一些值得注意的更新
    wxPython应用心得
    Ajax保留浏览器历史的两种解决方案(Hash&Pjax)[转]
  • 原文地址:https://www.cnblogs.com/zeon/p/14023932.html
Copyright © 2011-2022 走看看