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. 遍历并批量删除容器中元素出现ConcurrentModificationException原因及处置

    在以下四种遍历过程中,前两种会抛出ConcurrentModificationException,而后两种方法是正确的. Department类: package com.sitinspring; i ...

  2. ES6中的新特性

    本人最近学习es6一些方法,难免有些手痒,想着能不能将这些方法总结下,如下 1.数组的扩展 1)首先什么是伪数组 无法直接调用数组方法或期望length属性有什么特殊的行为,但仍可以对真正数组遍历方法 ...

  3. 015:索引、B+树

    一. 索引 1. 索引的定义 索引是一种单独的.物理的对数据库表中一列或多列的值进行排序的一种存储结构,它是某个表中一列或若干列值的集合和相应的指向表中物理标识这些值的数据页的逻辑指针清单.索引的作用 ...

  4. 【UVa】1600 Patrol Robot(dfs)

    题目 题目     分析 bfs可以搞,但是我还是喜欢dfs,要记忆化不然会T     代码 #include <cstdio> #include <cstring> #inc ...

  5. CentOS7 安装Chrome

    1. 下载Chrome浏览器的rpm包 https://www.chrome64bit.com/index.php/google-chrome-64-bit-for-linux 2. 安装Chrome ...

  6. 修改win7远程桌面端口号

    Windows 7/Vista/XP/2003等系统中的远程终端服务是一项功能非常强大的服务,同时也成了入侵者长驻主机的通道,入侵者可以利用一些手段得到管理员账号和密码并入侵主机.下面,我们来看看如何 ...

  7. sql sever数据库常用的执行语句

    --使用master数据库use master --创建数据库文件create database 数据库名字 on( name=, --逻辑名称 filename= .ndf, --数据文件物理路径名 ...

  8. javscript踩过的坑 - 记录

    1. js中, ‘==’ 运算符是对大小写敏感的

  9. Julia - 循环

    while 循环 当 while 后的条件成立的话,执行循环体内的语句,直到条件不成立,跳出循环 如果条件一直成立,或者循环体中的语句没有能让条件不成立的,则是死循环 julia> i = 1; ...

  10. URL传参时中文参数乱码的解决方法

    URL传参时,中文参数乱码的解决: 今天在工作中遇到了这样的一个问题,在页面之间跳转时,我将中文的参数放入到url中,使用location进行跳转传参,但是发现接收到的参数值是乱码.我的代码是这样写的 ...