数据库access(VBA应用案例:用VBA模块计算课时费(基于Access数据库))

数据库access(VBA应用案例:用VBA模块计算课时费(基于Access数据库))
VBA应用案例:用VBA模块计算课时费(基于Access数据库)

这篇技术文章我们讲一下:怎么用VBA模块计算一些稍微复杂的表。

数据库access(VBA应用案例:用VBA模块计算课时费(基于Access数据库))


(今天发的的几个短视频段子,播放量团灭,很难过。还是讲技术吧)


用AccessVBA模块来对表进行计算,相当于用Excel的函数来计算,二者在本质上没有区别。了解Excel函数的人能够理解我在讲什么。


用Access数据库计算的效果

和Excel函数相比,用VBA模块对表进行计算有利有弊:


优点是:


1.计算能力强。用Excel计算两三个字段就比较吃力了,在Excel单元格里写代码,会导致单元格比较臃肿。而Access的VBA模块在这方面能力强一些。


2.调整容易。用VBA模块计算,便于函数的维护和拓展,计算过程清楚不容易乱。接下来会用案例来解释这个问题


Access数据库VBA模块

用VBA模块计算也有缺点:


1.学习成本高。得了解什么叫变量,Function怎么用。编程就没有轻松的,会有一些坑。


2.会被鄙视。搞编程的码农会鄙视你,说你用VBA很low,搞得你很烦。(很奇怪,按这个原理,搞Excel函数不是更“low”吗?)


下面讲一下这个案例:


一、本案例的需求介绍


这个案例是一所高中的真实案例:以周为单位,计算每名老师的课时费。


这个工作用Excel完成有些麻烦(但不是不行),主要计算需求如下(为了循序渐进的教学,进行了适当的简化):


1.该学校的教课老师有100多名,有6个学科:


语文

数学

英语


物理

化学

生物


2.每周20小时内,语文数学英语100元小时,物理化学生物80元1小时


3.每周超过20小时,所有科目都是200元每小时。


在实际的案例中,每个老师教的班级还有快慢之分,给快班讲课的补助价格更高一些。但为了讲解方便,我今天先省略这个需求。


二、表设计思路


1.必须设计成一维表形式


用Excel也可以这个计算,用函数就可以。


但是表的设计必须遵循一维表的形式,无论是Excel还是Access的表都必须遵循这个原则,不然设计容易乱。


尤其是Excel设计更容易乱。


2.表的字段要严格控制


这个表的字段一共就4个:


时间


老师


科目


课时





用Access来设计表的话,字段里不需要设计价格、没有星期。价格在VBA里体现,星期用查询(SQL)自动生成。


这就是Access框架的威力,Excel就很难做的这么清爽简约。据我所知,Excel做星期查询很难。


3.表的更新


这个计算做成之后,只要定期往表里更新数据就行,老师上一天课就更新一条,更新完之后,计算结果就自动生成了,报表也能自动化生成。


三、查询设计


简单来说,这个课时费计算的Access查询需要两步:


1.生成周查询表


2.在周查询基础上,加上计算字段,计算字段运用的是VBA的模块(VBA模块是本文的核心)


先要解释一下为什么要两次查询,因为这个需求的时间范围是按周汇总,如果一次查询完成计算的话,SQL会乱。


1.生成周查询


这个技术我之前做过,代码界面如下:



第一次查询


2.计算字段


计算字段包括5个


一类课时量

二类课时量


一类课时费

二类课时费

总课时费



第二次查询


一类课时就是每周20节以内的课时,二类课时就是每周超过20节的课时。


四、VBA模块设计


下面是我们本文的核心,VBA模块设计。本需求我采用的是一个模块,下面四个函数,四个函数共用两个变量就可以。


其实VBA模块一点都不神秘,核心就是设计方程、解方程:


y=f(x1,x2)


再详细一点,y=Function(x1,x2)


这个Function英语就是方程(也叫函数)的意思,也就是VBA模块里我们要设计的一种计算方法,原理没什么难的。


比如,我们设计一个函数


x1=2

x2=2


y=f(x1,x2)=(x1+x2)^2


x1和x2相加再平方这个过程,就是一个函数(Function)计算。


Excel里要计算的话,就是直接新起个单元格,单元格里输入:


=(A1+B1)^2


用Excel来计算这个计算课时费需求也完全可以,但是如前所述,Excel很难计算复杂情况,比如我们本次需求就不这么简单,至少有两个判断:


1.判断这个老师教的是什么课,数学外语语文的课时费就高一些。


2.判断这个老师这周上没上够20节,上够是一个钱、没上够是一个钱。


用Excel来算就显得不那么简单了。


更何况这个需求,比我实际交给客户的需求还简化的多:客户要求的需求还有不同班级的不同费用,等于多了一个维度的计算。用Excel做就非常吃力了(这也是为什么客户找到我)。


我们这个需求的VBA代码有5个函数(Function),分别对应上个章节的5个计算字段


模块有两个总的变量,一个是每周的总课时(通过第一次查询计算得到的),第二个是科目。


两个变量


每个函数用方程表示就是


一类课时费=f(每周总课时,科目)


二类课时费=f(每周总课时,科目)


以此类推


VBA模块总界面


五、VBA代码设计


每个函数的代码设计,我承认对初学者有点难,但是学了一会就会觉得也不过如此,基本就是If Else语句判断。


我们以一类课时量为例


分为以下两种情况


1.当周上课没到20节


一类课时量=f(每周总课时)=当周课时


2.当周上课超过20节


一类课时量就是20节。



第一档课时数


二类课时量也分两种情况


1.当周上课没到20节,那么:


二类课时量=0


2.当周上课超过20节


二类课时量就是:周课时量-20



第二档课时数


(看懂了吗?没看懂公屏+1)


因为课时量不受科目的计算,所以方程里没有科目。如果计算课时费的话,就要加上科目,计算稍微复杂一些。


一类课时费:


1. 没到20节


数学语文外语


一类课时费=当周课时量*100


其他科目


一类课时费=当周课时量*80



第一档课时费


2.超过20节


数学语文外语


一类课时费=20*100


其他科目


一类课时费=20*80



逻辑就是这样,二类课时费、总课时费的VBA,大家照猫画虎做一下。


六、做报表


最好查询之后,就是界面的设计和美化了。这方面技术我讲的很多。不做赘述。


我建议用报表的形式,方便又快捷、简约又大方。



总体效果


有问题就在评论区交流哈~想学习、想领取这个案例给我留言哈~

文章版权声明:除非注明,否则均为边学边练网络文章,版权归原作者所有

相关阅读