codecamp

VBA变量赋值

既然你已经知道如何命名和声明变量了,是时候开始使用它们了。我们以学习如何创建变量开始。在VB中,你可以在你程序的任何地方创建变量,只有给它赋个值就行。


1.  打开一个新工作簿并且保存为Chap03.xls
2.  激活VB编辑器窗口
3.  在工程浏览器窗口,选择这个新的工程并在属性窗口里将它的名称改为Chap03
4.  选择“插入”-“模块”在工程Chap03里面添加一个新模块
5.  在属性窗口将该模块名Module1改为Variables

6.  在代码窗口,输入CalcCost过程,如下面所示。这个过程基于下述假设来计算购买一个计算器的价钱:计算器的价格为35美元,销售税为8.5%


Sub CalcCost()
            slsPrice = 35
            slsTax = 0.085
            Range("A1").Formula = "The cost of calculator"
            Range("A4").Formula = "Price"
            Range("B4").Formula = slsPrice
            Range("A5").Formula = "Sales Tax"
            Range("A6").Formula = "Cost"
            Range("B5").Formula = slsPrice * slsTax
            Cost = slsPrice + (slsPrice * slsTax)
            With Range("B6")
                        .Formula = Cost
                        .NumberFormat = "0.00"
End With
strMsg = "The calculator total is " & "$" & Cost & "."
Range("A8").Formula = strMsg

End Sub

过程CalcCost使用了四个变量:slsPrice,slsTax,Cost和strMsg。因为这些变量都没有显式声明,所以它们的数据类型都是Variant。变量slsPrice和slsTax是在过程的开始时通过给它们赋值而产生的,变量Cost分配的值是下面计算的结果:slsPrice + (slsPrice * slsTax)。价格的计算是使用变量slsPrice和slsTax提供的值来进行的。变量strMsg将信息合并为一个文本信息给用户,然后这个信息是在工作表的一个单元格里输入一个完整的句子。


当你给变量赋值时,需要在变量名称后面输入一个等号,等号之后是你要输入的值。它可以是数字,公式或者带引号的文本。赋给变量slsPrice,slsTax和Cost的值比较容易理解,然而保存在变量strMsg的值则有些棘手。解释一下变量strMsg的内容吧。


strMsg = "The calculator total is " & "$" & Cost & "."


1、字符串“The calculator total is ”被引号包括起来了,注意,后面的引号前有个空格。
„

2、字符&让你将一个字符串附加在另一个字符串或者变量的内容后面

3、在引号里面的美元符合(“$”)用来表明货币类型。因为美元符合是字符,它需要用引号来包括起来


4、字符&必须用于每次你要在前面的字符串后加新信息的时候
„  

5、变量Cost是一个占位符,当过程运行时,计算器的实际价格将显示在这儿
„  

6、字符&可以连接任何字符串
„  

7、句号用引号包括起来。当你需要在句子后面加句号时,如果它是在一个变量后面时,你必须单独再在后面加上它。

现在来运行它,将光标放在过程CalcCost的任何地方,并且选择“运行”-“运行宏”

技巧:变量初始化
VB创建变量的时候就将其初始化了。变量假定为它们的默认值,数字型变量设置为0,布尔型变量初始化为False,字符串变量设置为空字符(””),已经日期型变量则设置为1899年12月30日注意,你在运行这个过程时,VB可能会弹出下面的信息:“编译错误:变量未定义”。如果这个情况发生了,点击确定以关闭这个信息框。VB将会选中变量slsPrice并且加亮过程名称Sub CalcCost,标题栏则显示“Microsoft Visual Basic-Chap03.xls [中断]”。VB中断模式允许你在继续之前更正错误。如果你遇到上面提及的错误时,通过选择“运行”-“重新设置”来退出中断模式;接下来,在代码窗口的上面删除显示在第一行的语句Option Explicit。Option Explicit语句意味着在本模块里使用的所有变量都必须经过正式声明。删除OptionExplicit语句后,重新运行该过程,运行后,切换到Excel界面,过程运行的结果应该和图3-1一致。


VBA过程可以在工作表里输入数据并计算结果

图3-1 VBA过程可以在工作表里输入数据并计算结果


单元格A8显示变量strMsg的内容。注意,在单元格B6里面输入的价格有两位小数,而strMsg的价格却显示三位小数。要在单元格A8里显示带两位小数的计算器价格,你必须给变量Cost设置需要的格式,而不是给该单元格设置格式。VBA有专门的函数让你改变数据格式,你将使用Format函数来改变变量Cost的格式。该函数的语法是:

Format(expression, format)


Expression(表达式)是你要设置格式的值或者变量;format(格式)则是你要使用的格式类型。

1.  在CalcCost过程里更改变量Cost的计算:
Cost = Format(slsPrice + (slsPrice * slsTax), "0.00")

2.  将With…End With代码块取代为下述指令:
Range("B6").Formula = Cost

3.  将语句Range("B5").Formula = slsPrice * slsTax改为下面指令:
Range("B5").Formula = Format((slsPrice * slsTax), "0.00")

4.  重新运行修改后的程序
试验过程CalcCost之后,你可能会困惑,为什么我们要为声明变量烦恼,如果VB自己可以处理未声明的变量的话?因为过程CalcCost是如此之短,因此你不必担心VB每次使用这些Variant变量时会占用多少内存。然而,在短的过程中,内存问题不重要,但是当你输入变量名称时,你很可能出现错误。当你第二次使用Cost变量时,你忽略了“o”而写成“Cst”,后果会如何呢?


Range("B6").Formula = Cst


如果你使用了Tax在下面的公式中,而没有用slsTax,结果你将得到什么呢?


Cost = Format(slsPrice + (slsPrice * Tax), "0.00")


引入上面提及的错误后过程CalcCost的结果显示在图3-2。


变量名称错误导致结果错误

图3-2 变量名称错误导致结果错误


注意,在图3-2里,单元格B6没有数值,因为VB没有找到变量Cst的任务语句。再因为VB不知道销售税,显示的计算器价格为总价(而没有加税金,见单元格A8)。VB不会猜测,它只是简单地做你告诉它的事情。这带我们到下一个部分,解释如何避免这类错误。在你继续之前,确保更正变量Cst和Tax为Cost和slsTax。

如何明确VBA变量的数据类型
VBA强制声明变量
温馨提示
下载编程狮App,免费阅读超1000+编程语言教程
取消
确定
目录

关闭

MIP.setData({ 'pageTheme' : getCookie('pageTheme') || {'day':true, 'night':false}, 'pageFontSize' : getCookie('pageFontSize') || 20 }); MIP.watch('pageTheme', function(newValue){ setCookie('pageTheme', JSON.stringify(newValue)) }); MIP.watch('pageFontSize', function(newValue){ setCookie('pageFontSize', newValue) }); function setCookie(name, value){ var days = 1; var exp = new Date(); exp.setTime(exp.getTime() + days*24*60*60*1000); document.cookie = name + '=' + value + ';expires=' + exp.toUTCString(); } function getCookie(name){ var reg = new RegExp('(^| )' + name + '=([^;]*)(;|$)'); return document.cookie.match(reg) ? JSON.parse(document.cookie.match(reg)[2]) : null; }