VBA语言能帮助我们方便地将投资想法转化为便捷的模型,并且大大降低数据处理的工作量,因此掌握VBA的基本运用方法,对提高金融建模效率大有益处。
学习VBA的理由
- 解决重复工作或运算的问题
- 做成分析产品给别人用
- 提高建模效率,包括设置自定义函数及设置宏,宏是子过程的 意思(Macros or subroutines)。自定义函数要自己输入变量值,宏的input已内嵌在表格中。
- 操作简单,可以录制宏,自动将重复性的操作变成代码,门槛低。录制完后打开VBA编辑界面,快捷键是Alt+F11,即可看到转换后的代码。
写好宏后可以插入快捷按钮,快捷键是Alt+L+I+B
面向对象的语言
面向对象的意思是VBA通过对每一个对象进行处理,从而实现我们想要的功能。对象是集合的概念,例如workbooks就包括了已打开的工作簿,而worksheets包括了打开的工作表。通常将“.”翻译为"的",将“=”翻译为“是”,例如application.workbooks("xxx.xls").sheets("raw_data").range("cash").value=1000可翻译为应用的xxx.xls工作簿的raw_data表中cash栏的值是1000。
还可以加上行为的命令,例如:
range("cash").select 选择
range("cash").copy 复制
range("cash").formular="=A1" 对单元格写入公式
sheets("raw_data").delete 删除表
程序的结构
一段程序包含三个部分,分别是开头、内容、结尾
新增宏的开头格式为Sub+子过程名称()
新增自定义函数的开头格式为public function 函数名()
在内容部分,包含了三种运行结构,分别是顺序执行,逻辑判断以及循环执行。
以循环执行为例,新增一段计算阶乘的代码:
这个例子中用了带计数器的循环结构,还有条件循环的格式,用Do While....Loop语句来实现。
编程的要素
- 声明变量
程序中存在着许多变量,有些属于自定义的变量。在使用自定义变量之前,需要用Dim作声明,告诉程序以下这些变量是变量。后面加上as还可以指定变量的类型,例如:
Dim abc as Interger
告诉程序:abc变量是整数型变量。
Dim abc as Interger,cba as variant
告诉程序:abc是整数型变量,cba不知道是什么类型,但也是个变量。
为了防止遗漏声明,可以在模块页的第一行加上“Option Explicit”,如果程序中没有定义好变量就会报错,出错的地方会高亮提示,改正后即可。
- 数组变量
变量可以是向量array或者矩阵matrix,给它们定义一个名称即为数组。数组可以是一维,也可以是多维,在使用之前也需要用Dim进行声明。对于数组,数组名后面要加上括号()。
- 调用内置函数
在VBA的编程中,可以调用Excel的内置函数进行运算,格式为Application.函数名()。以求阶乘为例,可写成Application.Fact(jc)。
对于多维数组来说,声明的时候需要定义好维度,例如一维数组写成Dim yiwei(5),多维数组写成Dim duowei(3,5)。由于VBA默认从0开始编号,yiwei(5)表示包含6个数字,duowei(3,5)则表示4行6列的数组。如果要从1开始算,则需要在模块页的第一行加上“Option Base 1”。一般情况下都从1开始比较方便,但做二叉树运算的时候要从0开始。
- 定义动态数组
有时候不知道数组包含数字的个数,这时候可以先Dim一个数组变量,但括号留空。然后知道数组的格式化,再用ReDim进行重定义。
例如:
Dim n, shuzu()
n=3
ReDim shuzu(n)
于是,shuzu()就变成了一个含有四个数字的向量。
结语
通过以上学习,我们掌握了VBA最基础的知识。下一章我们将运用这些知识来解决投资上的一些实际问题,将复杂的运算问题瞬间变成一碟小菜,敬请期待。
刺猬偷腥
2018年1月4日
to be continued.