zoukankan      html  css  js  c++  java
  • VBA-使用ADO操作外部数据

    使用ADO连接外部excel数据源

    补充小知识:在不打开文件的情况下,抓取数据

    1)打开数据-现有连接-浏览更多,然后导入你要导的数据,就能在不打开该文件的条件下,进行透视,操作等。

     然后就是通过VBA来实现这个小功能

    Sub test1()
    MsgBox """张三""的那个人" '想要输出:叫“张三”的那个人,那么需要多加一层“”,将里面的双引号转义
    End Sub

    1)首先要打开通道

      在VBA界面中工具引用,勾选 Microsoft ActiveX Data Objects  x.x  Library ,借此就可以使用ADO通道

    2)然后用代码来实现这个通道

    Sub test()
    Dim conn As New ADODB.Connection '定义一个通道
    conn.Open "Provider = Microsoft.ACE.OLEDB.12.0;Data Source=D:dataEdata.xlsx;extended properties=""excel 12.0;HDR=YES"""
    '通过什么方法,连接什么文件,是否有表头
    
    'conn.Execute("select * from [data$]")  '*代表所有的列 表明后面需要加 $,在这里是已经抓取到数据了
    Range("a1").CopyFromRecordset conn.Execute("select * from [data$]") '前面Range("a1").CopyFromRecordset的作用是将抓取到的数据放到以“a1”为头的单元格里
                              'SQL语句都在这个双引号里面进行操作
    conn.Close
    End Sub

    3)SQL语句操作表

    Sub test()
    Dim conn As New ADODB.Connection
    Dim sql As String
    conn.Open "Provider = Microsoft.ACE.OLEDB.12.0;Data Source=D:dataEdata.xlsx;extended properties=""excel 12.0;HDR=YES"""
    Range("a2:z100").ClearContents
    'Range("a1").CopyFromRecordset conn.Execute("select * from [data$] union all select * from [data2$]") '连接两个数据 这里是上下的合并
    'Range("a1").CopyFromRecordset conn.Execute("select 姓名,年龄 from [data$] union all select 姓名,年龄 from [data2$]") '如果两个表不一样可以用共名的
    'Range("a1").CopyFromRecordset conn.Execute("select 姓名,年龄 from [data$] where 性别=''") '条件查找 在这SQL语句中可以使用单引号 
    '可以使用下面的方法简写
    sql = "insert into [data$] (姓名,性别,年龄) values ('田七','男',33)"  '往数据里插入一行数据
    conn.Execute (sql) '执行代码
    conn.Close
    End Sub

    常用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)

    left join on方法讲解

    Sub test()
    Dim conn As New ADODB.Connection
    Dim sql As String
    conn.Open "Provider = Microsoft.ACE.OLEDB.12.0;Data Source=D:dataEdata.xlsx;extended properties=""excel 12.0;HDR=YES"""
    'sql = "select * from [data$] left join [data3$] on [data$].姓名=[data3$].姓名" '在这里会出个错误,就是有两个姓名列,错在*'(select * from [data$]) (left join [data3$] on [data$].姓名=[data3$].姓名) 为方便理解上面为啥错误,上面语句应该这样断
    'left是以左边的数据为主,也可以使用right以右边的数据为主
    sql = "select [data$].姓名,性别,年龄,月薪 from [data$] left join [data3$] on [data$].姓名=[data3$].姓名"
    Range("a2:z100").ClearContents
    Range("a2").CopyFromRecordset conn.Execute(sql)
    conn.Close
    End Sub

    先合并两个表,然后再left join

    Sub test()
    Dim conn As New ADODB.Connection
    Dim sql As String
    conn.Open "Provider = Microsoft.ACE.OLEDB.12.0;Data Source=D:dataEdata.xlsx;extended properties=""excel 12.0;HDR=YES"""
    'sql = "(select * from [data$] union all select * from [data2$])a" 意思是两个表连接成的新表 名字叫做 a
    sql = "select a.姓名,性别,年龄,月薪 from (select * from [data$] union all select * from [data2$])a left join [data3$] on a.姓名=[data3$].姓名"
    Range(
    "a2:z100").ClearContents Range("a2").CopyFromRecordset conn.Execute(sql) conn.Close End Sub

    使用ADO连接ACCESS数据库

    Sub test()
    Dim conn As New ADODB.Connection
    Dim sql As String
    conn.Open "Provider = Microsoft.ACE.OLEDB.12.0;Data Source=D:dataAdata.accdb"    '在这里就不需要表头了
    
    sql = "select * from [客户信息表] where 城市='天津'"      ‘查找语句是一样的
    Range("a2:z100").ClearContents
    Range("a2").CopyFromRecordset conn.Execute(sql)
    conn.Close
    End Sub

     ADO工具打开的另一种方式

    Sub Macro2()
        Dim cnn As Object
        Set cnn = CreateObject("adodb.connection")
        cnn.Open "provider=microsoft.jet.oledb.4.0;extended properties='excel 8.0;imex=1;hdr=no';Data Source=" & ThisWorkbook.Path & "Book2.xls"
        [a1].CopyFromRecordset cnn.Execute("[Sheet1$]")
        cnn.Close
        Set cnn = Nothing
    End Sub
  • 相关阅读:
    Android开发_Animation
    spring开发_JDBC操作MySQL数据库_使用xml配置事务管理
    spring开发_AOP_代理模式
    java file 文件操作 operate file of java
    spring开发_spring构造注入Bean
    spring开发_spring中Bean的作用域_singleton_prototype
    spring开发_JDBC操作MySQL数据库
    java的jxl技术导入Excel
    spring开发_spring环境搭建
    魅族m8开发 step by step(1)(让程序跑起来)
  • 原文地址:https://www.cnblogs.com/xiao-xuan-feng/p/12683954.html
Copyright © 2011-2022 走看看