您的位置:首页 > 编程语言 > VB

【Monkey Run】Excel编程 VBA

2015-10-25 00:00 344 查看
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除属性方法外,还包含大量的事件。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: