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:\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

 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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM