前段時間自己在公司裡做了vba辦公技能培訓,其中就涉及到sql語句在資料查詢和彙總上的應用,因此感覺有必要將一些常見的套路和坑加以總結。本帖重點介紹的是在excel vba中使用sql語句操作excel工作簿和access資料庫的技巧。
在vba中進行資料庫連線,主要是通過ado物件進行的。ado(activex data objects)是微軟公司開發的資料庫訪問元件,其中最常用的是connection連線物件和recordset記錄集物件。connection物件用於建立資料庫連線,recordset物件用於儲存connection物件執行sql查詢語句後返回的記錄。建立connection物件方法如下所示:
dim objcnn as object
set objcnn = createobject("adodb.connection")
連線excel工作簿:
provider=microsoft.ace.oledb.12.0;extended properties=『excel 12.0;』;data source=檔名
建立的連線使用完畢後,需要呼叫close方法進行關閉。以下**演示的是如何以資料庫方式連線excel工作簿:
public sub connect()
'connection物件,recordset物件,
dim objcnn as object, objrs as object
'連線字串,資料庫檔名,記錄資料陣列
dim strcon$, strsource$, arrdata
strcon = "provider=microsoft.ace.oledb.12.0;extended properties='excel 12.0;';data source="
strsource = thisworkbook.path & "\data.xlsx"
'建立連線
on error goto e:
set objcnn = createobject("adodb.connection")
objcnn.open strcon & strsource
msgbox "連線成功!"
objcnn.close
exit sub
e: debug.print err.number, err.description
end sub
使用open方法建立連線後,就可以使用execute方法執行sql語句,該方法返回乙個包含了查詢結果的recordset物件:
set objrs = objcnn.execute("select * from [sheet1$]")
要獲取recordset物件中的記錄資料,常用的辦法有兩種。第一種是使用recordset物件的getrows方法,該方法會返回乙個包含記錄的動態陣列:
arrdata = objrs.getrows()
第二種是呼叫range物件的copyfromrecordset方法,直接將資料貼上到單元格:
[a2].copyfromrecordset objrs
上面獲取的都是記錄資料,而不包括欄位名。如果要獲取欄位名,可以遍歷recordset物件的fields物件集:
for i = 0 to objrs.fields.count - 1
cells(1, i + 1).value = objrs.fields.item(i).name
next i
完整的示例**如下:
public sub connect()
'connection物件,recordset物件,
dim objcnn as object, objrs as object
'連線字串,資料庫檔名,記錄資料陣列
dim strcon$, strsource$, arrdata, i%
strcon = "provider=microsoft.ace.oledb.12.0;extended properties='excel 12.0;';data source="
strsource = thisworkbook.path & "\data.xlsx"
'建立連線
on error goto e:
set objcnn = createobject("adodb.connection")
objcnn.open strcon & strsource
'執行sql
set objrs = objcnn.execute("select * from [sheet1$]")
'列印字段表頭
for i = 0 to objrs.fields.count - 1
cells(1, i + 1).value = objrs.fields.item(i).name
next i
'獲取查詢結果
'arrdata = objrs.getrows()
[a2].copyfromrecordset objrs
objrs.close
objcnn.close
exit sub
e: debug.print err.number, err.description
end sub
海量資料處理 一
想法 1.hash對映 順序讀取10個檔案,按照hash ip 10的結果將資料寫入到另外10個檔案中。2.hash統計 依次對小檔案用hash map ip,ip count 來統計每個ip出現的次數。3.堆 快速 歸併排序 利用快速 堆 歸併排序按照出現次數進行排序,將排序好的ip和對應的ip ...
海量資料處理 一
題目一 搜尋引擎會通過日誌檔案把使用者每次檢索使用的所有檢索串都記錄下來,每個查詢串的長度為1 255位元組。假設目前有一千萬個記錄 這些查詢串的重複度比較高,雖然總數是1千萬,但如果除去重複後,不超過3百萬個。乙個查詢串的重複度越高,說明查詢它的使用者越多,也就是越熱門。請你統計最熱門的10個查詢...
Pandas資料處理(一)
pandas資料處理 一 import pandas as pd import numpy as np 利用numpy生成一組datafrome資料 df pd.dataframe np.arange 16 reshape 4,4 print df out 0 1 2 3 0 0 1 2 3 1 4...