把Excel當做數據庫,用ActiveX Data Objects打開連接並使用Select語句來查詢數據,效率要比Workbook.Open和Range().Value效率高的多。
下面來看以個例子:
Sub ExeSQL()
' 引用Microsoft ActiveX Data Objects 2.5
' 引用Microsoft Scripting Runtime
Dim conn As New ADODB.Connection
Dim rs As New ADODB.Recordset
Dim fs As New FileSystemObject
Dim extenName$, connStr$, sqlStr$
extenName = fs.GetExtensionName(ThisWorkbook.FullName) ' 文件擴展名
If extenName = "xls" Then '03
connStr = "Provider=Microsoft.Jet.OLEDB.4.0;Extended Properties=Excel 8.0;" & _
"Data Source=" & ThisWorkbook.FullName
ElseIf extenName = "xlsx" Then '07
connStr="Provider=Microsoft.ACE.OLEDB.12.0;Extended Properties=Excel 12.0;" & _
"Data Source=" & ThisWorkbook.FullName
End If
Set fs = Nothing
sqlStr = "select x.來源,x.訪問次數,x.訂單總數,y.成功交易量,y.銷售額" & _
" from [訂單表$] as x inner join [收入表$] as y" & _
" on x.來源=y.來源"
conn.Open connStr
Set rs = conn.Execute(sqlStr)
Sheets("新表").Range("A2").CopyFromRecordset rs
' Sheets("新表").Range("A2").CopyFromRecordset conn.Open(connStr)
Set rs = Nothing: conn.Close: Set conn = Nothing
End Sub
說明:
1、數據庫的ConnectionString(連接字符串)的獲取,我推薦一個網址:www.connectionstring.com/;
2、ConnectionString里的DataSource(數據源)是ThisWorkbook.FullName(本工作薄);
3、Excel作為數據源時,默認工作表的第一行為字段;
3、本工作薄里面有“訂單表”、“收入表”和“新表”三個表,第一行(字段)分別為[來源],[訪問次數],[...]等。
