Excel中使用VBA访问Access数据库

时间:2024-01-30 10:39:10

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来构造的数据库路径。也可以使用数据库的绝对路径。

3. 参考资料