购买
下载掌阅APP,畅读海量书库
立即打开
畅读海量书库
扫码下载掌阅APP

5.2 字符串的理解要点

5.2.1 空字符串

前面说到一个字符串是由任意个字符连接而成,“任意个”既包括“多个”,也包括“一个”,甚至还包括“零个”。字符串之所以称为字符串,关键不在于其含有多少个字符,而在于其具有“串”的能力。

在视频课程中,我们用一段关于羊肉串的动画描述了字符串的这一特点:只要具有随时将多个字符连接在一起的能力,即使当前一个字符都没有,仍然被视作一个字符串,因为我们可以随时向其中添加字符。

如果一个字符串中没有任何字符,就称之为“空字符串”。空字符串写出来如同图5.10代码中一样,只有两个紧连在一起且中间毫无间隔的半角双引号。如果把空字符串赋值给一个单元格,那么就是让这个单元格的内容变成“一无所有”,等同于“清空单元格”的操作。比如在如图5.10所示的例子中,在运行程序前,B2单元格中有两行文本内容;在运行程序之后,B2单元格的内容则被完全清空。

图5.10 使用空字符串为单元格赋值的效果

空字符串对于文本处理来说,就如同“0”对于算术运算一样重要,所以我们在后面的学习中,会经常使用空字符串解决一些基本问题。

此外,在讲解变量时提到:使用 Dim 声明一个变量,但又没有为其指定初始值时,VBA 默认该变量为“空”,这时如果将该变量当作一个数字使用(比如将其用于加法运算),则“空”的含义就是数字0,也就是VBA默认该变量为0。现在,需要补充一点:假如程序将这个默认为空的变量当作一个字符串使用(比如执行字符串连接操作),那么“空”的含义就是“空字符串”,也就是说,VBA将默认该变量为“”。

5.2.2 非打印字符(空白字符)

接下来需要明白的是:空字符串并不是空白字符串。所谓空白字符串,就是由空格符(Space键)、制表符(Tab 键)、回车符及其他各种不可显示的字符(一般称为“非打印字符”或“空白字符”)所构成的字符串,比如由5个空格符构成的字符串:“ ”。

这个字符串虽然看上去一片空白,没有内容,但从计算机的角度来看,它仍然是由多个字符构成的,就是由5个空格字符构成,或者说字符串长度为5。只不过根据操作系统字库的设定,将这些字符绘制到屏幕上时不需要将任何像素染成黑色,所以我们用肉眼看不到它们。换言之,空白字符的特点是“有内容,不显示”。

这一点与前面讲解的空字符串有很大区别。因为空字符串中完全没有字符,也就是完全没有内容,整个字符串的长度为0。

由于空白字符的存在,两个字符串即使看上去非常相似,也不一定完全相等。比如“abcd”与“ abcd ”,前者是一个包含4个字符,即长度为4的字符串;但是后者首尾各有一个空格字符,所以包含6个字符(长度为6),因此二者并不相同。

小心检查空白字符,对于Excel表格处理非常重要。因为一个单元格是否是真正的空单元格、是否包含空白字符等,往往很难用肉眼观察出来。特别是在数据量较大又使用了“居中对齐”等排版操作后(见图5.11),更加难以直接判断。因此,在编写VBA程序对单元格文本进行比较时,必须考虑如何消除空白字符的影响。本书会在介绍字符串函数的章节中详细讲解这方面的经验。

图5.11 含有各种空格与无空格的单元格比较(表格格

5.2.3 区分大小写字符

字母分为大写与小写两种形式,虽然大小写字母(如“A”与“a”)含义相同,但是在计算机中却被严格地区分为完全无关的两个字符。

所以在使用VBA进行字符串比较时必须考虑字母的大小写问题,切记Abc与abC是完全不同的两个字符串,二者的比较结果是“不相等”。例如在案例5-1中,如果把第4行零部件报价的货币单位符号改成“usd”,那给出的代码就不能将其对应到判断结构中的“USD”分支,就无法进行正确计算(请读者思考:在这种情况下,案例5-1的运行结果,并说明原因。请在电脑上亲自运行验证)。

读者可能还记得,本书第1章中讲到VBA是一个大小写不敏感的语言,比如在代码中写“IF”和“if”,都会被当作符合语法的判断语句。那么为什么这里又提醒大家必须注意大小写呢?

这是因为程序设计语言中的“大小写不敏感”,是专门针对程序代码中的语法元素而言的,包括“Sub”“For”等各种关键字(保留字),以及变量名、程序名等自定义名称。它们与字符串最明显的区别就在于没有两边的双引号。而对于双引号内的字符串,以及存储在文本文件或 Excel单元格内的文字等,代表的是存储于计算机内部的文本数据,与 VBA 程序语法没有任何关系,所以不适用“大小写不敏感”这种说法。

由于我们在Excel、Word等Office软件中经常会遇到缩写、人名、地名等信息,因此在VBA编程中需要充分注意大小写字母对字符串比较带来的影响。

5.2.4 区分数字与字符串

另一个初学者经常混淆的问题就是“数字”与“数字字符”之间的区别。在 VBA 代码中,如果一个数字出现在某对双引号之内,比如 “123”,那么它代表的就是由1、2和3三个表示数字的字符构成的字符串,如同a、b和c构成字符串 “abc” 一样。

我们知道,字符串代表的是一段文本,因此不能像数字那样执行各种数学运算(比如求取字符串“齐天大圣——孙悟空”的平方,是一个完全没有意义的操作)。所以,尽管字符串123看上去与数字123完全一样,但是二者却有本质的不同,因为前者是一段文本而非数值,不能进行数学运算 。图5.12演示了为数字添加引号后,程序运行结果的变化。

图5.12 数字与数字字符串的区别

在图5.12左侧的代码中,变量 a 被赋值为数字“123”,请读者将其读作“一百二十三”。因此在执行 a+a 操作时,就是执行算术加法运算,并将结果“246”写入A1单元格。但是在图5.12右侧的代码中,a被赋值为字符串“123”,由于不是数字,因此各个字符之间也不存在进位关系,所以应当读作“一二三”。这时若执行 a+a 操作,VBA就认为这不是一个算术加法运算,而是一个字符串加法,即字符串连接操作。因此,右侧程序的执行结果是将两个字符串“123”连接在一起,得到的结果为“123123”,读作“一二三一二三”,而不是“十二万三千一百二十三”。

总之,带有双引号的数字字符串本质上与一串英文字母或一行汉字没有区别,只是人类用于信息交流的符号,不能像数字一样进行算术运算。事实上,数字与数字字符串在计算机中的存在方式是完全不同的——数字“123”被视作一个数据存放,而字符串“123”则被视作紧密关联的3个数据(字符“1”“2”和“3”)存放。因此,为避免出现误解和歧义,请读者一定要厘清二者的关系。 nI8vRx289Al8es/ctfx8X3EBJTjLiPxn7M7Esz6u+h6ZjlBjISf33iuqerMFilBv

点击中间区域
呼出菜单
上一章
目录
下一章
×