学习笔记(四)下 VBA编程小记
什么是VBA
Visual Basic Applications(VBA)是一种可用于扩展Office应用程序的简单且强大的编程语言
我们使用Visual Basic Applications(VBA)脚本编程还可以大大提高我们的工作效率,以及扩展Excel的应用范围
什么是Excel应用
首先我们来定义一个Excel应用,因为它与其他的应用和应用开发是不一样的。Excel应用是指电子表格(spreadsheet)的应用,即我们Excel开发人员使用Excel和VBA脚本来开发一个电子表格,然后给自己或者别人使用的意思。VBA本质上就是VB(Visual Basic)程序语言,只不过微软把它修改之后,让它在微软的Excel和Word文档中运行使用。Excel应用包含的VBA代码可以达成下面的目标:
1、自动处理重复的过程(Automate tedious processes)。通常情况下,我们创建一个电子表格之后,为达到某种特定目标,我们需要指定重复执行固定的流程。为了达到这个目标,我们通过使用Excel中的宏来记录这个重复的过程。
2、改进用户体验(Enhance the user experience)。使用Excel变量来改善用户的体验感。
3、隐藏电子表格的底层的复杂性(Hide the underlying complexity of a spreadsheet)。优秀的电子表格是可以简单把用户希望的结果数据呈现出来,并且要把复杂的计算过程给封装起来。通过VBA来管理工作簿的布局和呈现工,从而让用户可以非常简捷的得到想要的计算结果。
4、整合其他的应用和数据(Integrate with another application or database)。一般企业的数据是存在于企业的应用或者企业的数据库中的,通过Excel可以整合这些数据源,然后呈现给用户来分析这些数据。
5、防止用户的误操作导致修改电子表格(Prevent the modification of certain aspects of a spreadsheet)。我们通过VBA来控制用户对于工作簿(workbook)的使用。
Excel应用的一般适用范围
1、投资分析(Investment research publication)。一般投资银行的蓝皮书使用Excel应用从底层数据中拉出数据,然后打印成100多页的统计数据、报表等。
2、销售报价(Sales quote generation)。制造企业使用Excel生成一个复杂的销售报价应用。
3、预算/预测模型(Budget/forecast models)。这个是的游戏策划需要的。
4、复杂的财务分析(Complex financial analysis)。这个也是我们游戏策划需要的,因为经济系统、装备系统培养系统、关卡系统等都可以使用到。
使用Excel的原因:
-
可以使用它来计算而不用手写公式
-
几乎所有PC机都安装了Excel应用
-
Excel应用很容易发布
-
大家都有了Excel使用经验
-
Excel应用可以被快速开发
-
VBA是一种非常容易学习的开发语言
设置VBA开发环境
1、先创建一个Excel文件,打开文件后进入选项,信任中心中找到宏设置,启用所有宏,并信任对VBA工程对象模型的访问
2、勾选自定义功能区中的开发工具
注:欲使用VBA宏的Excel保存格式必须为xlsm格式
ALT+F11快捷键可以直接进入VBE编辑器
VBE功能简介
可以映射对worksheet属性的更改,例如文件名称等
VBE常用功能简介
-
窗体(Forms)–用户窗体是给该VBA项目加入一个用户操作窗体界面。
-
模块(Modules)–一个模块包含我们所需要处理的脚本代码。我们的VBA代码就写在模块中,然后通过模块对象绑定到VBA项目中。
-
类模块(Class modules)–类模块是一种特殊的模块,该允许程序员开发自己的对象。
显示/隐藏工作表
虽然在Excel中可以直接右键worksheet进行隐藏操作,但这并不是完全隐藏
可以使用代码或直接更改sheet的属性visible为veryhidden
注:此操作必须保证至少有一个worksheet是非隐藏属性
显示运行过程的立即窗体
使用好处:
1、可以调试所写的VBA宏
2、可以在中断模式下看到变量和对象的状态
3、可使用立即代码来执行语句:在立即窗体中先输入“?”号,然后接着输入thisworkbook.Name
单步调试按键为F8
VBA代码窗体
VBA的代码窗体就是我们使用VBA编程的地方,其中“通用”部分就是对象列表,也就是我们书写的业务逻辑代码都包含在对象中,而“声明”就是列出所有的业务逻辑方法,方便我们在编程的时候阅读和查找。我们还可以通过点击视图中的“对象浏览器”菜单来查看对象列表
锁定项目文件
为了保护代码或工作簿不被客户看见,第一种方式是把工作表绝对隐藏掉,还有一种方法是给工作簿文件加密
在VBE中右键VBAproject点击VBAproject属性,在保护中可设置密码
宏录制
点击Excel的开发工具菜单,或点击左下角的宏录制按钮即可开始录制宏
例如:在弹出的对话框输入一个宏名,接着对某一单元格进行格式设置,关闭宏后就可以在VBE里看见生成的模块代码
VBA构建块
我们在VBA项目中的空模块对象中书写脚本代码,构建的代码叫做过程
像C中的函数调用函数,Java中的方法调用方法一样,我们可以通过call 关键字来调用所写的过程
变量
代码是由变量、操作符和语句组成的。而变量是一个应用的核心,从概念上讲变量表示工作内容项或者对象。比如一个变量可以表示数学运算值,或者表示一个字符串对象,或者表示工作表对象、工作薄的对象等。我们通过变量来操作这些东西,并且与它们交互。在VBA脚本代码中使用代码必须遵守下面三个步骤:
① 使用Dim关键创建一个对象或者数据类型的变量
② 给变量赋初始值
③ 使用变量与运算符和语句进行组合
例如:
示例1:
Sub displayMessage(message)
# 定义一个变量
Dim infoButtons
# 为变量赋值
infoButtons = vbOKOnly + vbinfomation
# 调用系统函数显示
MsgBox prompt:=message, Buttons:=infoButtons
End Sub
示例2:
Sub showCalcResult()
Dim goodsPrice
Dim goodsCount
Dim total
goodsPrice = CInt(InputBox("请输入商品单价"))
goodsCount = CInt(InputBox("请输入购买数量"))
total = goodsPrice * goodsCount
displayMessage ("需要支付总金额:" & total)
# &为VBA中的拼接符
End Sub
数据类型
每个变量都有数据类型,那就那个变量到底是什么分类的,然后一个变量就保存相应类型数据的值。下面给出VBA的基本数据类型:
其中Variant类型可以表示除了固定长度字符串以外的所有数据类型,也支持用户自成定义类型。该类型从Excel 2002版本开始支持,另外,它还可以表示Empty值、Error值、Nothing值和Null值。为识别一个变量的类型,我们使用系统函数VarType来判定。
Sub showCalcResult()
Dim goodsPrice
Dim goodsCount
Dim total
goodsPrice = CInt(InputBox("请输入商品单价"))
goodsCount = CInt(InputBox("请输入购买数量"))
total = goodsPrice * goodsCount
displayMessage ("需要支付总金额:" & total)
displayMessage ("total的数据类型:" & VarType(total))
displayMessage ("vbInteger的取值是:" & vbInteger)
End Sub
因此我们可以使用if语句来判断一个变量类型后再处理相应的业务逻辑
其中,我们这里需要特别有一下面几个特殊的数据类型:
① Empty:这个值表示一个可变变量已经被声明了,但是还没有初始化值。一个空的变量表示—如果它是数值类型那就是0,如果它是字符串类型,那么就是“”字符串。
② Error:这个值表示在子程序中出身定义错误。有点类似Java语言中的自定义异常类型。
③ Nothing:这个值是把一个变量和它表示的对象分离开。如果一个可变变量被设定这个值,表示该变量等输入一个值,并且它具体的类型是不确定的。
④ Null:这个值表示一个变量里没有包含合法的数据。Null与Empty的区别是Null故意包含了一个无效的数据,但是Empty是有数据的,要么是0,要么是“”值。
声明变量
为便于代码的阅读,我们可以声明变量时就指定它的数据类型,在VBA中声明的语法格式如下:
Dim variableName as DataType
条件结构
if 条件 then
操作
end if
循环结构
固定次数循环的语法:
for 条件 next
dim num as Integer
for n = 1 to 100
操作
next
这段代码就是固定的用法,表示循环中的操作执行100次,当然,也可以使用if语句在循环中特定条件时退出循环
dim num as Integer
for n = 1 to 100
操作
if 条件 then
exit for
end if
next
与Java、C等语言不同,VBA中的数组第一个元素的下标为1,所以习惯在for循环中,定义变量初始值为1
一般我们会用循环语法来遍历工作薄和工作表对象,比如遍历所有工作表、工作表中的行和列对象等。下面给一个遍历工作薄文件中所有工作表对象的固定循环语句示例代码:
Sub workSheetLoop1()
Dim index As Integer
Debug.Print "当前工作簿中的所有工作表:"
For index = 1 To ThisWorkbook.Worksheets.Count
Debug.Print ThisWorkbook.Worksheets(index).Name
Next
End Sub
For…Each可变循环语法:
Sub workSheetLoop2()
Dim wb As Worksheet
Debug.Print "当前工作簿中的所有工作表:"
For Each wb In ThisWorkbook.Worksheets
Debug.Print wb.Name
Next
End Sub
使用可变循环语法可以非常方便的遍历数组对象:
Sub arrayLoop()
Dim colors As Variant
Dim item As Variant
colors = Array("红色", "绿色", "蓝色")
For Each item In colors
Debug.Print item
Next
End Sub
更多语法
以上只是VBA使用的冰山一角
再次附上VBA官网的使用详解方便食用
https://docs.microsoft.com/en-us/office/vba/language/reference/user-interface-help/unload-statement