刺猬教你量化投资(九):VBA编程入门

VBA编程入门

VBA语言能帮助我们方便地将投资想法转化为便捷的模型,并且大大降低数据处理的工作量,因此掌握VBA的基本运用方法,对提高金融建模效率大有益处。

学习VBA的理由

  1. 解决重复工作或运算的问题
  2. 做成分析产品给别人用
  3. 提高建模效率,包括设置自定义函数及设置宏,宏是子过程的 意思(Macros or subroutines)。自定义函数要自己输入变量值,宏的input已内嵌在表格中。
  4. 操作简单,可以录制宏,自动将重复性的操作变成代码,门槛低。录制完后打开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 函数名()

VBA的编写基本格式

在内容部分,包含了三种运行结构,分别是顺序执行,逻辑判断以及循环执行。

以循环执行为例,新增一段计算阶乘的代码:

输入VBA代码
询问输入变量
得到阶乘运算的结果

这个例子中用了带计数器的循环结构,还有条件循环的格式,用Do While....Loop语句来实现。

编程的要素

  1. 声明变量

程序中存在着许多变量,有些属于自定义的变量。在使用自定义变量之前,需要用Dim作声明,告诉程序以下这些变量是变量。后面加上as还可以指定变量的类型,例如:

Dim abc as Interger
告诉程序:abc变量是整数型变量。
Dim abc as Interger,cba as variant
告诉程序:abc是整数型变量,cba不知道是什么类型,但也是个变量。

为了防止遗漏声明,可以在模块页的第一行加上“Option Explicit”,如果程序中没有定义好变量就会报错,出错的地方会高亮提示,改正后即可。

  1. 数组变量

变量可以是向量array或者矩阵matrix,给它们定义一个名称即为数组。数组可以是一维,也可以是多维,在使用之前也需要用Dim进行声明。对于数组,数组名后面要加上括号()。

  1. 调用内置函数

在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开始。

  1. 定义动态数组

有时候不知道数组包含数字的个数,这时候可以先Dim一个数组变量,但括号留空。然后知道数组的格式化,再用ReDim进行重定义。
例如:
Dim n, shuzu()
n=3
ReDim shuzu(n)
于是,shuzu()就变成了一个含有四个数字的向量。

结语

通过以上学习,我们掌握了VBA最基础的知识。下一章我们将运用这些知识来解决投资上的一些实际问题,将复杂的运算问题瞬间变成一碟小菜,敬请期待。



刺猬偷腥
2018年1月4日


to be continued.

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,332评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,508评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,812评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,607评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,728评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,919评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,071评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,802评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,256评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,576评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,712评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,389评论 4 332
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,032评论 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,798评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,026评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,473评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,606评论 2 350

推荐阅读更多精彩内容

  • 1.1 VBA是什么 直到90年代早期,使应用程序自动化还是充满挑战性的领域.对每个需要自动化的应用程序,人们不得...
    浮浮尘尘阅读 21,726评论 6 49
  • 本例为设置密码窗口 (1) If Application.InputBox(“请输入密码:”) = 1234 Th...
    浮浮尘尘阅读 13,628评论 1 20
  • 可以通过在属性窗口设置名称来给对象重新命名,名字可以由字母、汉字(2字符)、数字以及下划线组成,但必须以字母或汉字...
    重头再来0706阅读 2,171评论 0 1
  • //Clojure入门教程: Clojure – Functional Programming for the J...
    葡萄喃喃呓语阅读 3,634评论 0 7
  • 工作一年了,似乎这几天才确定,我已经是喜欢你的了,我叫下雨的雨,因为你。 我不是一个浪漫的人,却有着非常非常天真的...
    下雨的雨阅读 167评论 0 1