首页 > 编程语言 > 详细

VBA-使用ADO操作外部数据

时间:2020-04-12 11:36:37      阅读:58      评论:0      收藏:0      [点我收藏+]

使用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:\data\Edata.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:\data\Edata.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:\data\Edata.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:\data\Edata.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:\data\Adata.accdb"    ‘在这里就不需要表头了

sql = "select * from [客户信息表] where 城市=‘天津‘"      ‘查找语句是一样的
Range("a2:z100").ClearContents
Range("a2").CopyFromRecordset conn.Execute(sql)
conn.Close
End Sub

 

VBA-使用ADO操作外部数据

原文:https://www.cnblogs.com/xiao-xuan-feng/p/12683954.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!