VBA訪問Access數據庫
1. 通用自動化語言VBA
VBA(Visual Basic For Application)是一種通用自動化語言,它可以使Excel中的常用操作自動化,還可以創建自定義的解決方案。
Excel中使用VBA的優點:
- 使固定、重復的任務程序自動化,提高工作效率。
- 可進行復雜的數據處理和分析。
- 可自定義Excel函數、工具欄、菜單和界面。
- 可連接多種數據庫,並進行相應的操作。
宏是VBA的一種簡單應用。宏可以通過編寫VBA、錄制宏兩種方式獲得。通常是先錄制宏,再在獲得的宏的基礎上進行語句優化調整,最后得到想要的宏。
2. Excel中使用VBA操作Access數據庫
在《誰說菜鳥不會數據分析(工具篇)》第四章 讓報告自動化中,涉及到根據輸入日期,從Access數據庫中提取相關數據到Excel中相關操作。
打開VBA編輯器的兩種方式:
- Excel → 開發工具 → Visual Basic:打開VBE后,點擊插入,選擇模塊,就可以在該項目下新建一個空白模塊。
- Excel → 開發工具 → 插入 → 控件 → 右鍵控件 → 指定宏:可以直接將宏綁定到控件上,然后進行編輯。
進行編寫代碼前的准備工作:
- Visual Basic → 工具 → 引用:引用 Microsoft ActiveX Data Objects 2.x Library,否則運行代碼會報“用戶定義類型未定義”提示。
Excel中用VBA根據輸入的日期從Access數據庫中提取相應的數據並插入到Excel表中:
Sub 數據提取() '定義數據庫鏈接對象AdoConn Dim AdoConn As ADODB.Connection '定義數據庫存放路徑 Dim MyData As String '定義日期變量 Dim D1 As Date '定義日期變量 Dim D2 As Date '定義表示Ecxel行數的變量 Dim N As Integer '定義SQL字符串 Dim strSQL1 As String '定義SQL字符串 Dim strSQL2 As String '定義SQL字符串 Dim strSQL3 As String '定義SQL字符串 Dim strSQL4 As String '初始化數據庫連接對象 Set AdoConn = New ADODB.Connection '指定數據庫,該數據庫放在當前Excel文件目錄中,且名為“業務數據庫.accdb” MyData = ThisWorkbook.Path & "\業務數據庫.accdb" '日期輸入對話框中的日期賦值給D1 D1 = InputBox("請輸入需要提數的日期,例如:2011-9-4", "提數日期") '將D2賦值為D1+1 D2 = D1 + 1 '將數據源表中第三列第一個空格單元格的行數賦值給N N = ActiveSheet.Range("C1").End(xlDown).Row + 1 Debug.Print N '建立數據庫鏈接,打開指定的數據庫MyData With AdoConn .Provider = "Microsoft.ACE.OLEDB.12.0" .Open MyData End With '在用戶明細表中根據輸入的日期查詢當天有多少用戶注冊 strSQL1 = "SELECT count(用戶ID) FROM 用戶明細 WHERE 注冊日期<#" & D2 & "# AND 注冊日期>=#" & D1 & "#" '在訂購明細表中根據輸入的日期查詢當天有多少用戶購買,注意去重 strSQL2 = "SELECT count(用戶ID) FROM (SELECT DISTINCT 用戶ID FROM 訂購明細 WHERE 訂購日期<#" & D2 & "# AND 訂購日期>=#" & D1 & "#)" '在訂購明細表中根據輸入的日期查詢當天訂單數和業務收入 strSQL3 = "SELECT count(訂單編號), sum(訂購金額) FROM 訂購明細 WHERE 訂購日期<#" & D2 & "# AND 訂購日期>=#" & D1 & "#" '在訂購明細表中根據輸入的日期查詢截止到當前累計訂購用戶,注意去重 strSQL4 = "SELECT count(用戶ID) FROM (SELECT DISTINCT 用戶ID FROM 訂購明細 WHERE 訂購日期<=#" & D1 & "#)" '將新增用戶數插入到數據源表的當前時間行的新增用戶列 ActiveSheet.Cells(N, 3).CopyFromRecordset AdoConn.Execute(strSQL1) '將訂購用戶數插入到數據源表的當前時間行的訂購用戶數列 ActiveSheet.Cells(N, 4).CopyFromRecordset AdoConn.Execute(strSQL2) '將訂單數和訂購金額插入到數據源表當前時間行的訂單數和業務收入列 ActiveSheet.Cells(N, 5).CopyFromRecordset AdoConn.Execute(strSQL3) '經累計訂購用戶數插入到數據源表當前時間行的累計用戶數列 ActiveSheet.Cells(N, 7).CopyFromRecordset AdoConn.Execute(strSQL4) '測試數據庫是否連接成功 'If AdoConn.State = adStateOpen Then ' MsgBox "連接成功" ' AdoConn.Close 'End If MsgBox "數據提取完畢" '釋放變量 Set AdoConn = Nothing End Sub
該宏是綁定在一個按鈕控件上的,點擊該按鈕,會彈出輸入日期提示框,根據提示輸入日期,就可以從數據庫中提取數據到Excel表中。
代碼中訪問的數據庫是和Excel表放在同一目錄下的,所以用ThisWorkbook.Path來構造的數據庫路徑。也可以使用數據庫的絕對路徑。
