除了從檔案匯入資料, powerpivot還提供了一個方法,
直接從表格"抄上" 然後 "貼上"Powerpivot.這個可以方便從網頁上取資料 ( 如匯率表,交通期表)
I. 貼上新數據表
1. 首先把表格複製
sub subXlsSqlQuery() '定義部份 Dim cn As ADODB.Connection 'Excel連接 Dim rs As ADODB.Recordset '得來的結果,會放到立這個rs的地方. Dim strDataSrcXlsPath As String '數據庫EXCEL位置 Dim strQuery As String '用作拿數據的SQL Dim strStartlocation as String '定義得來數據,放到那一個位置. 'I) 以下建立數據庫連接 strDataSrcXlsPath = "D:\Connection_data_many2.xlsm" '定立數據庫EXCEL位置 Set cn = New ADODB.Connection With cn '確定連接所用的Library .Provider = "Microsoft.ACE.OLEDB.12.0" '把連接指向指定Excel 'xtended properties為excel的版本, 通常為12 或 8, '12為2007Excel檔(如XLSX,XLSM). 8可相容1997-2003等excel(XLS) .ConnectionString = "Data Source=" & strDataSrcXlsPath & _ ";Extended Properties=Excel 12.0;" '開始連接,這個時候ACE會打開excel .Open End With 'II) 以下運行SQL和回傳數據 '拿出一行資料,所用SQL架構大約為 'SELECT ... FROM ... WHERE ' 'SELECT 上的 * 用作指明拿出所有表上的欄位 'TOP 50 是指抽出頭50列數據 ' 'FROM 從DATASHEET工作表抽出 strQuery = "SELECT top 50 * FROM [DataSheet$]" Set rs = cn.Execute(strQuery) '執行SQL 'III) 把數據抄至所需的位置 strStartlocation ="A1" 'III-1 把欄位名稱一個一地拿出 'rs.Fields.Count : 欄位數數 'rs.Fields(n).Name : 欄名 Dim lngColCounter as long For lngColCounter = 0 To rs.Fields.Count - 1 range(strStartlocation).offset(0,lngColCounter) = rs.Fields(lngColCounter).Name Next lngColCounter 'III-2 把數據庫資料列表拿出 ActiveSheet.Range(strStartlocation).offset(1,0).CopyFromRecordset rs 'IV) 關掉/清理連接 cn.Close Set cn = Nothing Set rs = Nothing end sub
Sub subRetrieveByField() Dim cn As ADODB.Connection Dim rs As ADODB.Recordset strDataSrcXlsPath = "D:\Connection_data_many2.xlsm" Dim strDataSrcXlsPath As String 'I) 以下建立數據庫連接 Set cn = New ADODB.Connection With cn .Provider = "Microsoft.ACE.OLEDB.12.0" .ConnectionString = "Data Source=" & strDataSrcXlsPath & _ ";Extended Properties=Excel 12.0;" .Open cn.CursorLocation = adUseClient End With 'II) 以下運行SQL 'II-1) 準備SQL Dim strQuery As String Dim strQueryWorksheet As String strQueryWorksheet = "Query" '數據查詢頁面位置 '拿出一行資料,所用SQL架構大約為 'SELECT ... FROM ... WHERE ' 'SELECT 用作指明拿出的欄位 '留意 (Order_Qty * Product_Price) as TotalAmt 是直接用SQL算出的欄位. 'TOP 1 為指定只拿一行數據 '也留意一下欄位大小寫,要跟EXCEL數據庫上的相同. ' 'FROM 從DATASHEET工作表抽出 ' 'WHERE 抽出的行數條件,這裡用了 交易代號 Transaction_ID strQuery = "SELECT top 1 " & _ " Transaction_Date, " & _ " Order_Qty, " & _ " Product_Name, " & _ " Product_Number, " & _ " Product_Color, " & _ " Product_Size, " & _ " (Order_Qty * Product_Price) as TotalAmt, " & _ " Product_Price " & _ " FROM [DataSheet$] " & _ " WHERE Transaction_ID = " & _ ThisWorkbook.Worksheets(strQueryWorksheet).Range("D3") 'II-2)執行SQL Set rs = cn.Execute(strQuery) 'III) 把數據抄至所需的位置 Dim strStartlocation As String Dim lngRowCounter As Long If rs.RecordCount <= 0 Then 'rs.RecordCount 為有多少列數據,沒的話就顯示MSGBOX提示 MsgBox ("Transaction not found") Else With ThisWorkbook.Worksheets(strQueryWorksheet) '把資料依名放入左方指明的格上 .Range("D6") = rs.Fields("Transaction_Date").Value .Range("D7") = rs.Fields("Order_Qty").Value .Range("D8") = rs.Fields("TotalAmt").Value .Range("D11") = rs.Fields("Product_Number").Value .Range("D12") = rs.Fields("Product_Name").Value .Range("D13") = rs.Fields("Product_Color").Value .Range("D14") = rs.Fields("Product_Size").Value .Range("D15") = rs.Fields("Product_Price").Value End With End If 'IV) 關掉/清理連接 cn.Close 'rs.Close Set cn = Nothing Set rs = Nothing End Sub
Sub test() MsgBox ("Hello World!!") End Sub