Excel中使用VBA访问Access数据库
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数据库的更多相关文章
- c#程序中使用"like“查询access数据库查询为空的问题
今天,在开发的过程中发现了一个特别奇怪的问题:access中like查询时候,在Access数据库中执行,发现可以查询出结果,这是在数据库上执行,select * from KPProj where ...
- c#程序中使用"like“查询access数据库语句的问题
在写使用access数据库的c#程序过程中,遇到各种莫名奇妙的问题.例如使用"like"进行模糊查询,在access查询视图中要使用"*"做模糊匹配(sql中是 ...
- ADO访问Access数据库错误解决心得随笔
最近在用ADO访问Access数据库的时候出现了一个奇怪的错误,觉得有必要记录下来,和大家分享一下. 环境 win7 x86系统: VS2012编译器: Office2010: Access2000~ ...
- [转载]Unity3D 访问Access数据库
在开始这个小教程之前呢,其实在网上你已经可以找到相关的资料了,但是我还是要把我自己做练习的一点东西分享出来.写这个教程的主要原因呢,是一个朋友在u3d的官网论坛里,找到了这个demo,但是在他使用的过 ...
- Unity访问Access数据库
首先,准备工作: 创建一个Access 数据库,命名AccessTest.accdb,添加一些数据用于测试 准备System.Data.dll与System.EnterpriseServices.dl ...
- 如何使用.net访问Access数据库 (转)
前言:今天整理程序,看到之前写的一个Demo,也不知道是从哪里参考的了,写到这里,留作备用吧. 使用.net访问Access数据库:1.BL层:新增一个DataAccess类. Code].Defau ...
- C#.NET ORM 如何访问 Access 数据库 [FreeSql]
最近很多 .net QQ 群无故被封停,特别是 wpf 群几乎全军覆没.依乐祝的 .net6交流群,晓晨的 .net跨平台交流群,导致很多码友流离失所无家可归,借此机会使用一次召唤术,有需要的请加群: ...
- 在Eclipse中使用JDBC访问MySQL数据库的配置方法
在Eclipse中使用JDBC访问MySQL数据库的配置方法 分类: DATABASE 数据结构与算法2009-10-10 16:37 5313人阅读 评论(10) 收藏 举报 jdbcmysql数据 ...
- postman上传excel,java后台读取excel生成到指定位置进行备份,并且把excel中的数据添加到数据库
最近要做个前端网页上传excel,数据直接添加到数据库的功能..在此写个读取excel的demo. 首先新建springboot的web项目 导包,读取excel可以用poi也可以用jxl,这里本文用 ...
随机推荐
- 分布式事务之:TCC (Try-Confirm-Cancel) 模式
在当前如火如荼的互联网浪潮下,如何应对海量数据.高并发成为大家面临的普遍难题.广大IT公司从以往的集中式网站架构,纷纷转向分布式的网站架构,随之而来的就是进行数据库拆分和应用拆分,如何在跨数据库.跨应 ...
- ConditionObject分析
ConditionObject是AQS中的内部类,提供了条件锁的同步实现,实现了Condition接口,并且实现了其中的await(),signal(),signalALL()等方法. Condi ...
- 初学者手册-MyBatis踩坑记(org.apache.ibatis.binding.BindingException)
1.参数绑定失败 org.mybatis.spring.MyBatisSystemException: nested exception is org.apache.ibatis.binding.Bi ...
- nginx 作为反向代理实现负载均衡的例子
以下我们就来举例说明如何使用 nginx 实现负载均衡.因为nginx在处理并发方面的优势,现在这个应用非常常见.nginx 这个轻量级.高性能的 web server 主要可以干两件事情: 〉直接作 ...
- 列表的使用2,深COPY和浅COPY,循环列表,步长切片
name2=names.copy() 下面我看几种奇怪的现象: 首先把源列表copy以后,把源列表第2个数值修改.那么没毛病. 如果源列表里,还包含了一个子列表:这也没毛病 如果我们这个时候修改子列表 ...
- 条件随机场(CRF)-基础
条件随机场(conditional random fields,简称 CRF,或CRFs)下文简称CRF,是一种典型的判别模型,相比隐马尔可夫模型可以没有很强的假设存在,在分词.词性标注.命名实体识别 ...
- 浅谈PHP面向对象编程(二、基础知识)
和一些面向对象的语言有所不同,PHP并不是一种纯面向对象的语言,包PIP它支持面向对象的程序设计,并可以用于开发大型的商业程序.因此学好面向对象输程对PHP程序员来说也是至关重要的.本章并针对面向对象 ...
- java.lang.ArrayIndexOutOfBoundsException异常分析及解决
这是一个非常常见的异常,从名字上看是数组下标越界错误,解决方法就是查看为什么下标越界. 下面是一个错误示例: Exception in thread "main" java.lan ...
- css ! important 兼容性的一点测试
css ! important 这个东西网上一堆内容,我只说我用到的一点地方和我的理解, 这个东西ie6不支持,ie高版本是支持的.其他浏览器也是支持.先理解这一点 .abc { width:100p ...
- javascript json数据的处理
1.前端页面default.html <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" " ...