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. 参考资料

Excel中使用VBA访问Access数据库的更多相关文章

  1. c#程序中使用"like“查询access数据库查询为空的问题

    今天,在开发的过程中发现了一个特别奇怪的问题:access中like查询时候,在Access数据库中执行,发现可以查询出结果,这是在数据库上执行,select * from KPProj where ...

  2. c#程序中使用"like“查询access数据库语句的问题

    在写使用access数据库的c#程序过程中,遇到各种莫名奇妙的问题.例如使用"like"进行模糊查询,在access查询视图中要使用"*"做模糊匹配(sql中是 ...

  3. ADO访问Access数据库错误解决心得随笔

    最近在用ADO访问Access数据库的时候出现了一个奇怪的错误,觉得有必要记录下来,和大家分享一下. 环境 win7 x86系统: VS2012编译器: Office2010: Access2000~ ...

  4. [转载]Unity3D 访问Access数据库

    在开始这个小教程之前呢,其实在网上你已经可以找到相关的资料了,但是我还是要把我自己做练习的一点东西分享出来.写这个教程的主要原因呢,是一个朋友在u3d的官网论坛里,找到了这个demo,但是在他使用的过 ...

  5. Unity访问Access数据库

    首先,准备工作: 创建一个Access 数据库,命名AccessTest.accdb,添加一些数据用于测试 准备System.Data.dll与System.EnterpriseServices.dl ...

  6. 如何使用.net访问Access数据库 (转)

    前言:今天整理程序,看到之前写的一个Demo,也不知道是从哪里参考的了,写到这里,留作备用吧. 使用.net访问Access数据库:1.BL层:新增一个DataAccess类. Code].Defau ...

  7. C#.NET ORM 如何访问 Access 数据库 [FreeSql]

    最近很多 .net QQ 群无故被封停,特别是 wpf 群几乎全军覆没.依乐祝的 .net6交流群,晓晨的 .net跨平台交流群,导致很多码友流离失所无家可归,借此机会使用一次召唤术,有需要的请加群: ...

  8. 在Eclipse中使用JDBC访问MySQL数据库的配置方法

    在Eclipse中使用JDBC访问MySQL数据库的配置方法 分类: DATABASE 数据结构与算法2009-10-10 16:37 5313人阅读 评论(10) 收藏 举报 jdbcmysql数据 ...

  9. postman上传excel,java后台读取excel生成到指定位置进行备份,并且把excel中的数据添加到数据库

    最近要做个前端网页上传excel,数据直接添加到数据库的功能..在此写个读取excel的demo. 首先新建springboot的web项目 导包,读取excel可以用poi也可以用jxl,这里本文用 ...

随机推荐

  1. hash一致性算法

    一致性hash算法是,1097麻省理工提出的分布式hashDHT实现算法,极倔internet的热点问题 平衡性 hash结果尽可能的分布到所有的缓存中去,缓冲空间利用率最高 单调性 保持已有的缓存能 ...

  2. 许多人问:FPGA是什么?

    菇凉提问: 做FPGA开发多年,每次菇凉问我,什么是FPGA,我,我,我,不知道如何说起,难以回答. FPGA是一种器件.其英文名 feild programable gate array . 通俗来 ...

  3. 小峰Hibernate简介与HelloWorld

    一.Hibernate简介: 二.Hibernate4 版Hello World 实现 工程结构: com.cy.model.Student: package com.cy.model; public ...

  4. HDU 2669 Romantic(裸的拓展欧几里得)

    Romantic Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Su ...

  5. mysql 使用 informatin_schema tables 创建 shell commands

    SELECT CONCAT("mysqldump -uroot -p ", TABLE_SCHEMA, " ", TABLE_NAME, " > ...

  6. 第七周作业——简单FTP

    开发简单的FTP: 1. 用户登陆 2. 上传/下载文件 3. 不同用户家目录不同 4. 查看当前目录下文件 5. 充分使用面向对象知识 1.目录结构zuoye-ftp├── chenliang #用 ...

  7. ROS6.16开始支持802.11ac了,扫盲下

    Wi-Fi的5G频段与802.11AC背后那些事儿本文章来自某路由论坛,作者为张导,本人转载,原地址http://bbs.hiwifi.com/thread-9086-1-1.html 曾几何时,大家 ...

  8. 【转】给TD添加滚动条的方法

    TD本身不允许出现滚动条,而会总动撑大,所以要想加滚动条需要另外在TD内添加一个容器如:DIV. 例子: <table style="width: 450px; height: 360 ...

  9. Firefox显示 您的链接不安全 的解决办法

    Firefox浏览器,今天突然打开网页的时候提醒,“您的链接不安全”,于是网页怎么刷新都打不开.后来几经查询终于解决,下面告诉大家该如何解决这种情况. 百度经验:jingyan.baidu.com 工 ...

  10. IO模型之IO多路复用 异步IO select poll epoll 的用法

    IO 模型之 多路复用 IO 多路复用IO IO multiplexing 这个词可能有点陌生,但是如果我说 select/epoll ,大概就都能明白了.有些地方也称这种IO方式为 事件驱动IO ( ...