分享

Excel VBA | 配置数据库以及Select初体验

 L罗乐 2018-01-21


2017圣诞快乐

愿每一个心愿都能成真

Wish you a merry Christmas!


大家圣诞节快乐!虽然我也不太懂中国人为什么过圣诞节,不过还是要送出这个礼貌又不失尴尬的祝福。上一期我们给SQL语句中的Select语句做了个很简单的介绍,很多朋友产生了疑问,“你说的道理我都懂,但是,我这Select语句你准备让我写在哪??”别着急,这一篇,我们就来说一下如何搭建起一个简易的数据访问系统以及让它活灵活现的展示在你的面前。

学习之前,我们来自测一个小问题,还记得Excel里,我们的作弊器(写VBA的界面)如何开启么?对,就是一个组合键,ALT F11,这样,我们就可以开启编码界面,那么开启了编码框以后如何操作呢?还记得如何插入一个模块(Module)以及在模块中书写内容么?如果有些淡忘了,请把你的屁股准备好,戒尺已经饥渴难耐了。

别紧张,我们还是从头来,一步一步的深入讲解。今天我们首先介绍ADO(ActiveX Data Objects),不要被他的名字所欺骗,看起来是似乎是一个很复杂,很难理解的东西,好像每个词拆开了都认识,合在一起就变成了一桶浆糊。其实,这简单的三个字母,远比你想象的复杂更加难懂,不过很幸运,我们不需要去对他深层的内容进行了解,我们只需要使用它所提供的便利,也就是通过ADO,来访问以及编辑数据库(也就是我们Excel的Sheet)


简单的来说,访问数据库的过程大体分为如下几个步骤:


1. 声明ADO对象或者引用ADO的组件

2. 书写相关的SQL语句

3. 通过ADO执行SQL并接受返回的内容,比如Select语句会返回查询结果

4. 将返回的结果赋值到我们需要显示的位置


光说不练假把式,咱们开始动手,首先,我们来看看如何引用ADO,为什么需要引用呢?我们可以把VBA的编写环境当作是一个毛坯房,在这里,只有一些很简单的门,上下水管等等,可以让人居住,不过所包含的设施还太少,我们就需要进行装修,一件件的购买家具,最终达到让我们满意的状态。而引用组件,其实是一样的性质,我们从Excel提供的上百个扩展包中,挑选出我们用的上的,引用进来,就直接可以使用,省去了我们自行开发的困扰。那么对于ADO,我们需要引用些什么呢?请看下方截图。


首先,ALT F11开启作弊模式,然后选择工具选项下的引用。

在弹出的对话框中选择,Microsoft ADO 2.8,以及Microsoft ADO Ext. for 2.8  DDL,并点击确定。

好了,有了如上的两步,我们已经把上面叨叨了半天的内容,用我们的实际操作实现了,现在,我们来试着书写第一个SQL语句并将其运行出来。

第一步,我们先定义好,我们的数据源在哪里。比如今天的示例,我们把数据源与小程序放在同一个Excel文件中,当然数据源可以在不同的文件,只要我们配置对就可以了,代码先参考如下,我们一点点的讲解。


Dim conn As ADODB.Connection

Dim rs As Recordset

Dim path As String

path = ActiveWorkbook.FullName


Set conn = New Connection

Set rs = New Recordset


Dim connString As String

connString = 'provider=Microsoft.jet.OLEDB.4.0;data source=' & path & ';Extended Properties=Excel 8.0;Persist Security Info=False'


conn.Open connString

Dim sql As String


sql = 'select * from [source$] where [姓名]='张三''

rs.Open sql, conn


Sheets('result').Range('a2').CopyFromRecordset rs

rs.Close

conn.Close


前几行的内容都比较简单,我们不做详解,只对其中的两句稍作解释,

Set conn = New Connection

Set rs = New Recordset

由于在代码的前两句,我们定义了两个变量,分别是ADODB.Connection类型以及RecordSet类型,此两个数据需要先进行初始化,否则无法使用。

继续往下看

connString = 'provider=Microsoft.jet.OLEDB.4.0;data source=' & path & ';Extended Properties=Excel 8.0;Persist Security Info=False'

我相信这一句代码,让很多人抓耳挠腮,这是啥?我在哪?发生了什么?不用迷茫!相信我,这句话是一个套路,你可以直接的进行复制粘贴,而真正需要改动的,只是源文件路径,也就是我标红的那个path,需要改成你数据所在文件地址,其他,不用深入研究,发现了么?套路不只是出现在平时的生活里,代码中也是一样,套路满满。

我们定义的conn,其实就是一个连接,让我们通过VBA来操作数据库,在正式使用之前,请记得书写

conn.open connString

这就是在告诉所有人,“大家好,这个文件我要开始使用了,接下来文件将处于占有状态,不能随意操作哦。”接下来,直到我们代码末端的conn.close,这个文件都处于被我们的代码占有的状态,是无法由其他进程进行操作的。

继续往下

Dim sql As String

sql = 'select * from [source$] where [姓名]='张三''


不知道各位通过我们赋予sql这个变量的内容,是否可以猜出这个语句将要做的事情?对,我们要从Excel文件中,表单名称叫做source的页面里,挑选出所有姓名叫做张三的数据,source内容如下

如果我没猜做,经过系统的筛选,应该可以定位到第一行数据了,我们继续。


rs.Open sql, conn

Sheets('result').Range('a2').CopyFromRecordset rs


rs就是我们之前声明过的一个recordset,他的用处就是帮助ADO来暂时保存返回的数据,我们在rs.open后给出了两个参数,第一个是我们的查询语句,第二个是设定好的连接。再之后的一句,我们将数据从rs中,复制到了result的界面中,看一下结果。

由于这只是一个范例,我们做的相对有些许的粗糙,没有将列名同时生成出来,通过代码,一样可以随心所欲的设置,不信?我们来加深一些难度。


接下来,希望大家可以一起动手,来搜索出所有语文大于80或者数学大于70的同学的姓名以及班级,对,我们就拿其中的两列,其他的内容不用动,我们只需要更新一下sql语句以及将列名生成出来。


首先增加列名,太简单了,我相信之前学过的朋友们都可以写的出

Sheets('result').Cells(1, 1) = '姓名'

Sheets('result').Cells(1, 2) = '班级'


那么sql语句如何改写呢?是不是感觉这句话就在嘴边,但是真的让你写的时候,又有些无从下手,对,这就是因为,写!得!少!

sql = 'select [姓名],[班级] from [source$] where [语文]>80 or [数学]>70'


经过了改写,我们来看看结果

这么看起来,是不是要比使用Excel内置的“小漏斗”好用多了?逻辑可以根据我们的需求任意改变,当然,现在所提及的还是一些比较简单的示例,我们可能会遇到更加复杂,条件更加扑朔迷离的情况,别怕,慢慢的梳理以及大胆的书写,一定可以找得到更高效的解决方法。


各位不乏尝试一下自己创造一个数据表格,根据一些条件进行筛选,这样的体会能更加深刻哟。


2017年度最佳彩蛋

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多