考虑这么一个excel文件,路径为:"E:dataEdata.xlsx",样式如封面图片所示
想要在其他excel文件中,通过代码直接抓取Edata.xlsx中想要的数据,做法如下:
- 先在Visual Basic中勾选“工具-引用-Microsoft ActiveX Data Objects”
- 然后在下面的壳子中写入代码
Sub 抓取外部表格数据()
Dim conn As New ADODB.Connection
conn.Open "Provider = Microsoft.ACE.OLEDB.12.0;Data Source=E:dataEdata.xlsx;extended properties=""excel 12.0;HDR=YES"""conn.Close
End Sub
注意!!!以下代码都要放在这个壳子中才能生效
单个表全部抓取
Range("a2").CopyFromRecordset conn.Execute("select * from [data1$]")
这段代码的前半段是指 【将数据抓取到当前的单元格】中
核心是后半段,conn.Execute() 是必要的函数,先不管它
select * from [data$]:* 表示将sheet:data中的所有数据(除表头)抓取出来;$跟在sheet名后面,作为excel表的标记
为了看起来简洁,可以这样定义:
Dim sql As String
sql = "select * from [data1$]"
Range("a2").CopyFromRecordset conn.Execute(sql)
只抓取某几行
如果只想获得部分数据,比如 姓名/性别 两列,代码写为:
sql = "select 姓名,性别 from [data1$]"
Range("a2").CopyFromRecordset conn.Execute(sql)
很朴素的语言逻辑
有条件的抓取
sql = "select * from [data1$] where 性别 = '男' "
Range("a2").CopyFromRecordset conn.Execute(sql)
合并抓取多个表
我们注意到表data1和data2是同一种格式的表格,如果同时想要两个表的内容呢?如何把他们同时抓取并放到一起呢?
sql = "select * from [data1$] union all select * from [data2$]"
Range("a2").CopyFromRecordset conn.Execute(sql)
union all 可以把两个表上下连接起来
类VLOOKUP查找
可以注意到data3中有前两表没有的【月薪】一列,他们之间可以靠【姓名】对应起来。那么可不可以像Excel中的VLOOKUP函数一样,通过姓名把他们的月薪查找出来呢?
sql = "select * from [data1$] left join [data3$] on [data1$].姓名 = [data3$].姓名"
Range("a2").CopyFromRecordset conn.Execute(sql)
left join on 函数
结果会变成这个样子,多出现了一列姓名:
这就反应出了left join on 的特点,它是先把后面的两个表合并,然后对合并后的表做select。下图中黄色部分的格式就是上图中的样子。
如果想更好的显示,就要对代码进行修改:
sql = "select [data1$].姓名,性别,年龄,月薪 from [data1$] left join [data3$] on [data1$].姓名 = [data3$].姓名"
Range("a2").CopyFromRecordset conn.Execute(sql)
把三个表结合到一起
先UNION ALL 再 LEFT JOIN ON
sql = "select a.姓名,性别,年龄,月薪 from (select * from [data1$] union all select * from [data2$])a left join [data3$] on a.姓名=[data3$].姓名"
Range("a2").CopyFromRecordset conn.Execute(sql)
这段代码很长,让我们来捋一捋:
首先是将data1和data2(通过union all 方法) 合并成一个表,用a表示
然后将表a和data3(通过left join on方法)合并成一个表,根据姓名加入对应的月薪
对最终合并成的表提取 姓名,性别,年龄,月薪 这4列数据
代码的逻辑如上图所示,黄色表示【data1】和【data2】union all之后的【表a】,黄色加蓝色就是【表a】和【data3】left join on后的表,select函数直接作用在这个表上。
得到结果为: