【Monkey Run】Excel编程 VBA

Excel编程 VBA

天气如此舒适,装B逐渐减少,所以最近的blog输出一直停滞不前。然而最近一直忙于Excel编程,觉得也有点从0到1的学习创造过程,有必要总结记录下。具体的VBA编程知识可以借鉴,而学习背后的方法,才是应该透过虚影看到的本质。

Ok,下面进入正题,需要说明的是本文只针对宏观开发,具体的数据类型、语法等不做介绍。

Step 0:准备开发环境。

正如其他编程语言一样,开发之前,都需要搭建整个开发所需的环境。而vba编程相对简单,只需要windows操作系统下安装excle程序即可。而vba编程的特点就是针对具体的excel文件而言的,所以安装完Excel之后,新建一个excel文件并打开,如果是对已有excel文件进行编程的话直接打开已有的文件即可。至于编程所需要的IDE,Excel是自带的,使用ALT+F11或者点击工具-->宏-->Visual Basic编辑器即可打开。(打开IDE之后,点击工具-->选项-->代码设置可对IDE的编码格式等进行设置)至此开发环境准备完毕。

需要说明的是,不管你有几个excel文件,都是共享同一个IDE的,左边的工程目录会自动显示打开的excel文件。

Step 1:开发过程的宏观结构分析。

纵观整个IDE的工程结构,不难发现其大致分为如下四个模块:Microsoft Excel对象、窗体、模块以及类模块。而开发过程也是对这四个模块进行编码。下面开始出个介绍这四个模块以及其之间的联系。如果没有,则可以在工程上右键,可以新增对应模块。

1、Microsoft Excel对象

①sheet:针对的是excel文件中的每一个sheet对象,内置了一些监听事件,监听着你对该sheet页的操作,如change函数,每当你的一个单元格被改变时,会触发该函数运行,如果做某个单元格的输入校验,这个函数可以用到;Selectionchange则是当你的选择单元格发生变化时,即选择的动作发生变化时触发。此类内置函数还有很多,实际开发过程中由开发者自行测试。

如果读者做过web开发,那么可以做如下对比,一个sheet页可以类比为一个显示的页面,进入页面必然触发内置的onload事件,而离开时又会触发onbeforeunload,unload等事件。

②Thisworkbook则是值当前整个excel文件,而非其sheet页,而它也有许多内置事件,如打开excel文件时必然触发open事件,切换sheet页会触发changesheet事件。而我在事件开发过程中,许多配置数据是在不同的sheet页中,而打开文件后又要使用,因此将一些数据的初始化工作写在了这个对象中。

当然,以上除了默认的时间函数,从抽象的角度,你也可以自行添加私有或者公有的函数。MVC开发模式类比,该模块可以划分为显示层VIEW,所以此部分的代码尽量多处理excel显示效果,而具体的excel里的数据处理放到其他层。当然抽象出的公共显示的方法,可以放到模块中作为工具方法使用。

2、窗体

消息提示框,可定制,弹出框中也可以添加输入框,按钮等进行编程。同样,与web开发进行类比的话,与页面中弹出的dialog组件类似。

注意,窗体对象和Microsoft Excel对象都是事件驱动的,即由用户操作触发具体行为。

3、类模块

设计数据结构类,类中可以有属性和方法,可以设置属性和方法的访问权限,完全遵循oop的编程思路。

类比MVC中的编程职责,与DAO中的Model层类似,主要还是一些bean对象。

4、模块

该部分存放一些处理函数的集合。针对Microsoft Excel对象传递的数据,或者直接从sheet页中定位捞取数据,根据所需的业务逻辑,往上(显示层-sheet页)动态变化sheet页的显示内容,往下(输出)实例化类模块中对应的类对象,根据有数据的类最后做相关的数据生成导出等操作。

类比MVC开发模式,该部分起到service层的功能,承接sheet页数据及显示动态效果,同时输出抽象的数据结构的数据。

至此,宏观结构编程框架介绍完毕。

当然,分层的思想只是更科学,更易开发和维护而已,如果非得在sheet页对象中完成逻辑方法也是可以的。

Step 2:开发过程中的问题及注意点。

①因为vba所写的宏代码,也是存在安全性问题的,所以如果想要运行包含了宏的Excel文件,那么需要启用宏。如果不启用,则编写的vba代码则无法运行。

②对于单元格的特殊效果,可能直接使用开启录制宏,然后对单元格进行操作,录制期间的操作最终都会以代码的形式生成,而这部分代码是可以被利用的,此方式可以提高开发效率。

③如果代码一行显示过多,可使用_连接分隔换行

④子程序sub并无返回值,而Function执行具体任务并有返回值。

⑤开发过程中是不区分大小写的。

⑥开发过程中单元格别名的使用,可以避免excel中单元格数据有效性的下拉使用,分隔最大长度为256个字符的限制。CTRL+F3可以查看目前该Excel文件中的所有的单元格别名。

⑦Range对象遍历时会有效率问题。

⑧with-with End会省去对象的多次调用,加快速度。

⑨“表格驱动”与“代码驱动”(后续研究)

⑩可操作或者实现的功能

调用打印:打印工作表或者具体的Range内容

操作文件或目录:FileSystemObject->不是VBA的一部分,是以一个com组件形式提供删、移、获取信息、访问文件或文件夹、驱动器。

启动其他office组件:如outlook,word,OLED或ODBC数据源,使用ADO操作Excel数据。

使用shell调用命令:DOS命令。

⑪Excel 2007中默认当前操作的sheet页为ActiveSheet,而2013中则不会,如果sheet页里调用的模块中的代码进行页面的东线变化,那么在2007中是不会有问题的,而2013中则需要说明模块中方法具体的使用sheet,或者重新获取当前的ActiveSheet,否则会报错“方法...作用于对象...时失败”

⑫方法的参数沿袭微软的那一套,可以传值,也可以传址。

⑬关于内置对象与方法

对象:Workbook/ sheet row/ colum/ range/ cell/ mergearea

方法:insert/ tcopy/ delete/ cut/ offset/ shift (单元格)

Split/ left/ right(字符串)

数学函数

统计函数

⑭部分语法与关键字

If / select-case/ do-while/ for/ for-each/ static/ &/ with/ exit/ do-loop

Nothing 释放资源

withEvent 创建事件

Byval/ByRef 传值/传址

Collection对象

附加com组件(.ocx等)

Application->workbooks->workbook->worksheets->worksheet,application除属性方法外,还包含大量的事件。

转载于:https://my.oschina.net/u/735461/blog/521865

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值