使用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