如前所述,使用变量的意义在于将重复出现的内容抽取出来,并且根据需要对其进行运算,使其内容发生变化。不过有时我们还会遇到一些“重复出现但不允许变化”的数据,这时使用变量就会产生一定问题,比如案例2-3所示的几何计算程序。
案例2-3: 在图2.13所示的工作表中,B4单元格存放了一个圆的半径。单击表格中的按钮可以执行宏Geo,按照这个半径计算出圆的周长与面积,分别存入C4和D4单元格。
图2.13 几何计算程序示例
在上面的代码中,因为需要多次使用圆周率π,所以3.14这个数字也会出现多次。考虑到用户可能随时提出修改圆周率精度的要求,比如将3.14改为3.14159,所以可以使用变量Pi代替3.14,以便于修改及降低出错的风险。下面是使用变量Pi以后得到的程序代码。
可是即使这样,这个程序也存在计算标准不一致的隐患。因为Pi是一个变量,允许随时修改它的数值,所以下面这段代码完全符合语法要求。但是这段代码在计算完圆的周长之后,将Pi的值修改为3.14159,从而导致计算圆的周长与面积时采用了不同的圆周率数值。
读者可能会觉得奇怪:谁会犯这种低级错误呢?如果去询问专业的软件开发人员,十有八九会得到这样的回复:“永远不要高估自己的谨慎与细心”。随着学习和实践的深入,我们编写的程序会比这个案例复杂许多,而且往往需要不断进行调试与修改。在这个过程中,稍有疏忽就会犯下类似“重复赋值”的错误。此外,当几个人合作完成一个工程时,也难免会由于缺少沟通,把别人已经赋值的变量又重新修改。
所以为了避免这种风险,我们一方面希望使用变量符号将重复出现的数据抽取出来,另一方面又不能允许在程序中修改它们的内容。“常量”(Constant)就是为了解决这一问题而设计的。
与变量相同,也可以将常量理解为内存中一个带有标识符的单元。它们的区别在于,常量所在的“小房子”不是“长期居所”,而是“无期监禁牢房”——一旦入住了一个数据,就不允许它“出来”,也不允许其他数据进去。换言之:一经赋值,永不改变,直到不再需要(如程序结束)并清空所有内存时为止。
在 VBA 代码中使用常量与使用变量的方法很相似:遵循同样的命名规则,并且使用 Const关键字进行事先声明,就像使用Dim关键字声明变量一样。只不过在使用Const声明常量的时候,必须同时指定它的取值,因为以后无法再为它赋值。所以 Const 语句的一般格式为:“Const 常量名=值”。图2.14所示为在案例2-3中定义了常量Pi而得到的代码。
图2.14 将Pi声明为常量(注意Const关键字)
将Pi声明为常量后,如果在代码中尝试修改Pi的数值,VBA就会拒绝运行该程序,并提示出错,要求进行修改。比如在计算面积之前将Pi的数值重新修改为3.14159,VBA就会弹出错误提示框,如图2.15所示。
图2.15 尝试给常量Pi赋值时引发的错误提示
从设计程序的角度来说,使用常量与使用变量并没有泾渭分明的界线,很多时候既可以使用一个变量保存某个数值,也可以定义一个常量代表它,关键在于这个数值是否发生变化。比如上图中代表数据所在行号的变量RowData,把它定义成一个常量也没有问题,因为在这段代码中确实从未修改过RowData的取值。不过在讲解“循环”时,就会希望RowData能够在每次循环中都变成一个新的行号数字,从而实现对多行数据的批处理。在这种情况下,就必须把它定义为变量了。
最后需要特别指明的是,“常量”一词还经常用于指代程序中的所有数字、文本等“常数”。比如在图2.15所示的代码中,3.14、4、2、3等数字也会经常被称作“常量”,只不过VBA在执行程序时,并没有给它们所在的内存单元起名字(标识符)。所以当读者在查阅资料或与别人交流时,如果遇到“常量”一词,需要注意区分这是由 Const 语句声明的狭义的常量,还是包括常数等在内的广义的常量。