大家好,我是永不止步的老牛。上一篇我们介绍了VBA的编辑器,本篇我们介绍VBA过程和函数以及MsgBox函数、InputBox函数、InputBox方法(用代码给单元格设置公式)。
过程以Sub开头,以EndSub结束,过程执行一些代码但不返回值。
函数以Function开头,以EndFunction结束,函数执行一些代码并返回值,函数可以从过程中执行,也可以在Excel工作表中使用,就像Excel内置函数一样在公式中直接使用,Excel中内置了很多函数,但是总有内置函数无法实现的需求,我们可以自己编写代码去实现,建立一些Excel没有的函数。
我们以一个例子开始我们今天的学习,身体质量指数BMI是常用的衡量人体肥胖程度和是否健康的重要标准,BMI正常范围为18.5-23.9,低于18.5为体重过轻,高于23.9为体重过重,BMI=体重(公斤)除以身高的平方(米的平方)。
1.编写一个过程
在名称处输入“CalculateBMI”,点击确定,关闭添加过程窗体,VBA代码窗口增加了一个过程:PublicSubCalculateBMI()
EndSub
如果把Public替换成Private,那么过程只能被“BMI计算”模块里的其它过程调用,而不能被其它模块里的过程调用。
我们在过程体内,就是PublicSubCalculateBMI()和EndSub之间,输入计算BMI的代码,首先定义3个变量BMI、Height和Weight,并给Height和Weight赋值,然后计算BMI数值并将BMI值输出至立即窗口,最后用MsgBox函数提示计算完成及BMI值。
PublicSubCalculateBMI()
DimBMIAsSingle'BMI值
DimHeightAsSingle'身高值
DimWeightAsSingle'体重值
Height=1.81
Weight=66
BMI=Weight/(Height)^2
Debug.PrintBMI
MsgBox"身体质量指数BMI计算完成,BMI为"&BMI,vbOKOnly+vbInformation,"提示"
将光标定位在过程代码的任何地方,按F5运行过程,立即窗口会输出BMI值,并弹出对话框显示BMI值。
“/”是除运算符,“^”表示计算平方,Debug.PrintBMI是将变量BMI的值输出到立即窗口,MsgBox是对话框函数,提供给用户一些信息,并支持人机交互。
2.使用MsgBox函数
MsgBox函数语法为:MsgBox(prompt[,buttons][,title][,helpfile,context])[]内的参数可以省略,具体参数的含义、参数数值、返回值后面用表格列举,MsgBox函数可以有返回值,有2种调用方式:
A.MsgBox"消息",vbOKOnly,"提示"
B.iReturn=MsgBox("确认删除该条数据吗?",vbYesNo+vbQuestion,"提示")
A相当于只是在界面上显示了一个对话框,提示用户一些信息,用户点击按钮后不做任何处理。
B相当于在界面上显示了一个对话框,将用户点击不同的按钮的值返回给变量iReturn,然后程序可以根据iReturn的值决定后续代码如何执行。
MsgBox函数参数说明如下图:
buttons参数值设置如下图:
buttons参数的
用每组数字的一个值加起来就是最终buttons的值。
返回值如下图:
MsgBox函数我们先介绍到这里,我们继续我们的编程,前面编写的代码中我们直接给定了身高和体重数值,我们现在需要让用户输入身高和体重,我们将代码修改成这样:
Height=InputBox("请输入自己的身高")
Weight=InputBox("请输入自己的体重")
MsgBox"身体质量指数BMI计算完成,BMI为"&BMI,vbOKOnly+vbInformation+vbMsgBoxRight,"提示"
将光标定位在过程代码的任何地方,按F5运行过程,会先弹出对话框要求输入身高,输入并确定后,再弹出对话框要求输入体重,输入并确定后,立即窗口会输出BMI值,并弹出对话框显示BMI值。这里我们使用了InputBox函数让用户输入信息。
3.使用InputBox函数
InputBox函数语法:InputBox(prompt,[title],[default],[xpos],[ypos],[helpfile,context])
[]内的参数可以省略。
Prompt:显示在对话框上的信息。
Title:对话框的标题,默认的标题是MictosoftExcel。
xpos和ypos:对话框在屏幕上出现的位置,如果忽略,显示在当前窗口的中央,xpos决定对话框在屏幕上从左起的水平位置,忽略它时,对话框显示在水平中央,ypos决定对话框在屏幕从上而下的竖直位置,忽略它时,对话框就在竖直大约三分之一的位置。
helpfile和context:和本章前面介绍的MsgBox函数相应的参数使用方法一样。
具体参数说明见下表:
明白InputBox函数的用法后,我们将上述代码再修改一下,不使用InputBox函数的默认标题“MictosoftExcel”。
Height=InputBox("请输入一个数值","输入自己的身高")
Weight=InputBox("请输入一个数值","输入自己的体重")
4.编译一个函数,并在过程及公式中使用
过程我们先介绍到这里,我们看一下函数,函数也是一种过程,只是函数能返回值,函数只能由过程调用或在Excel工作表的的公式中使用,而不能像过程一样用F5或菜单“运行”执行。
函数的建立可以像前面介绍的建立过程一样,通过菜单“插入”-“模块”,选择“函数”来建立。
也可以自己手工编写代码来建立,我们在模块“BMI计算”的代码窗口,直接输入如下代码:
PublicFunctionGetBMI(w,hAsSingle)AsSingle
GetBMI=w/(h)^2
EndFunction
关键字Function后面是函数名称GetBMI和一对空括号。括号里的w和h是传递给函数的参数,函数以Function开头,以EndFunction语句结束。
Public表示这个函数可以在所有模块的所有过程里访问,在Excel公式中也可以使用,如果将Public换成Private,那么函数只能被同一模块里的其它过程调用,而不能被其它模块里的过程调用,也不能被Excel公式中使用。
最后面的AsSingle表示函数返回值的数据类型,如果省略,默认成Variant。
函数的返回值就是把要返回的内容赋值给函数名称。
如果给参数前加关键字Optional,那么表示这个是可选参数,就是说调用函数时,可以传递这个参数值,也可以不传递,注意的是,如果某个参数设置成可选参数,那么这个参数之后的参数必须都是可选参数。
函数我们先简单介绍这么多,还有按地址和按值传递参数等内容,后续我们用到时再细说。
写好函数后,我们可以修改前面的过程CalculateBMI,在过程中调用函数GetBMI,代码如下:
BMI=GetBMI(Weight,Height)
F5运行,结果和刚才的一样。
我们看一下Excel公式中如何引用函数GetBMI。
大家现在已经了解了过程和函数的写法,以及MsgBox函数InputBox函数的用法。
5.使用InputBox方法
前面说的InputBox函数属于VBA库,在Excel库中有一个InputBox方法,大家可以在对象浏览器中搜索InputBox,搜索结果可以看到2个InputBox,分别属于VBA和Excel。
InputBox方法的语法:expression.InputBox(Prompt,Title,Default,Left,Top,HelpFile,HelpContextID,Type)
expression:表示Application对象的变量。
参数说明如下图:
除了最后一个参数Type,其余参数基本和InputBox函数对应,我们重点说一下Type参数,Type参数的值为下表中的数据:
Type设置可以允许用户输入的数据类型,可以是一个值,也可以将多个值相加。假如允许输入文本和数字,Type就设置为1+2。
如果Type为0,InputBox返回文本格式的公式,如果Type为4,InputBox返回True或False,如果Type为8,InputBox返回Range对象,如果是8,必须使用Set语句,将结果分配给Range对象,
如果不使用Set语句,此变量就会被设置为区域中的值,而不是Range对象本身。
如果使用InputBox方法提示用户输入公式,必须使用FormulaLocal属性,将公式分配给Range对象。
InputBox方法与InputBox函数的区别在于,前者可以对用户输入进行选择性验证,并能与Excel对象、错误值和公式结合使用。Application.InputBox调用的是InputBox方法;不带对象限定符的InputBox调用的是InputBox函数。
如果用户输入的内容和Type设置的不相符,会出提示,确认后,继续等待用户输入。
用下面的示例展示一下Type为8时,使用和不使用Set的区别,代码如下,区别效果见动图:
PublicSubTestInputBox()
DimValue
DimValue2
SetValue=Application.InputBox(Prompt:="请选择单元格",Type:=8)
SetValue2=Application.InputBox(Prompt:="请选择单元格",Type:=8)
MsgBoxValue
我们在演示一下Type为0时,如何给一个单元格设置我们动态输入的公式,代码如下,效果见动图:
PublicSubTestInputBox2()
Value=Application.InputBox(Prompt:="请输入BMI公式",Type:=0)