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

5.3 字符串连接操作

5.3.1 字符串连接符
——“+”与“&”

刚刚提到,字符串之间也可以执行“加法”,例如 “123”+“123”=“123123”。这种操作的正式名称是“字符串连接”,也就是将两个字符串按照前后顺序连在一起,构成一个新的字符串。

虽然在VBA中允许使用普通加号“+”执行字符串加法,但是如果加号两边分别为数字和字符串,比如 a=“123”+123,这个加号的功能就会存在歧义:既可以将数字123转换为字符串“123”,从而执行字符串连接操作得到 “123123”,也可以将字符串 “123” 转换为数字123,从而执行数字加法操作,得到 246。对此 VBA 统一规定:一律将字符串转换为数字,执行算术加法操作,所以这个语句执行后的实际效果是让变量a变为数字246。

普通加号的这种歧义性经常给我们编写代码带来困扰。特别是在实际工作中,有些 Excel 文件中常会存放格式混乱的数据,看上去像是文本内容,实际上却是以数字形式存放。这时当我们想使用加号将多个单元格的文本连接在一起时,实际执行的却有可能是算术加法,导致错误结果。

因此,请读者牢记一个重要的 VBA 最佳实践:除非有特殊需求,否则不应使用加号执行字符串连接操作,而应使用另一个字符串连接符号——&。

在VBA语言中,字符串连接的正式操作符是“&”,也就是在标准键盘中数字7上的符号。如果在VBA代码中写 s=“abc” & “123 甲乙丙”,就会将变量s 赋值为字符串 “abc123 甲乙丙”。图5.13所示的例子演示了&符号的典型用法。

图5.13 使用 & 进行字符串连接操作

在图5.13的代码中,首先将字符串“Hello”存放在变量s中。在接下来的一句代码里,把变量 s 的内容(“Hello”)、一个由连续空格构成的字符串(“ ”),以及另一个字符串 “VBA!” 连接在了一起,从而得到一个新的字符串“Hello VBA!”,并赋值给变量s。这时变量s 的内容就会被改写为这个新的字符串,并最终赋值给B2单元格,于是得到左边的输出结果。

需要特别指出的是:在执行字符串连接操作的语句中,&符号的左边必须留有一个空格。待读者学完数据类型相关章节后就会知道,如果没有空格,VBA可能会认为 & 符号的用处是指明前面的变量是长整型数字,而非代表字符串连接操作。

5.3.2 灵活构造字符串

字符串连接操作的最大用处就是可以帮助我们按照特定格式(或称“模板”)灵活构造出新的文本。案例5-2演示了这种最简单的需求。

案例5-2: 在如图5.14左侧所示的工作表中,C3到E3单元格存放了一个快递包裹的收件人信息。现在希望编写一个程序,能够自动将这些信息按邮寄格式组成一句话,并保存在 C4到E4组成的合并单元格中,以备打印。图5.14右侧所示的表格就是执行程序以后预期得到的效果。

图5.14 案例5-2示例(右侧为单击“生成打印内容

在这个案例中,我们希望得到的最终结果可以分解为图5.15所示的几个部分,而VBA程序的任务就是根据表格中已有的信息,按照如图5.15所示的规则构造出一个字符串。

图5.15 案例5-2中的文本格式解析

从图5.15中可以看到,最终结果应该由多个字符串合并而成,其中有一些字符串(如“张三”)来自单元格内容,而其他字符串(如“(收)”)则需要手动写在代码中。这里需要说明的是,用于显示最终结果的单元格是由C4、D4和E4三个单元格合并而成。针对这种情况,我们在VBA代码中可以直接用合并区域的左上角单元格(也就是本例中的 C4单元格)代表整个合并区域。所以在本例中直接给Cells(4,3)赋值,就可以把结果显示在这个合并区域中。

按此思路,本例的需求可以使用下面的程序代码来实现。

在这段代码中,空格字符串 “ ” 和文字 “(收)” 是固定内容,无论收件人信息如何变化,这两个内容都不会发生改变;而 Cells(3,4)等代表的都是变化内容,完全取决于用户填写的信息。通过这种连接操作,我们就能够根据表格内容和要求格式,构造出期望的文本信息。

最后,我们再讨论一个需要综合运用循环结构、判断结构、逻辑表达式及字符串连接操作的案例。

案例5-3: 图5.16左侧所示的工作表中存放了5位同学的文化课及体育成绩,并且已经按照每个人的文化课成绩从高到低进行了排序。现在需要根据这些成绩评选学习明星奖,评选规则为:体育成绩必须达到“良”才有资格获奖,而获奖名次则依据文化课成绩由高到低排序。请编写VBA程序实现这个功能,最终在E列单元格中按照“第N 名”的格式输出排名结果。对于体育成绩不达标因而无资格获奖的同学,在其E列单元格中输出“—”。预期运行效果如图5.16右侧的工作表所示。

图5.16 案例5-3 原始数据及预期运行效果

这个案例乍看上去似乎并不复杂,使用普通的表格公式就能解决问题。可是仔细思考一下就会发现事情并不那么简单,因为它要求能够跳过体育成绩不达标因而不能获奖的同学,同时还要保持获奖同学排名的连续性。

这种“跳跃—连续”的需求在实际工作中十分常见,解决起来也非常简单,只要创建一个变量专门用于记录这种数字(比如本例中的获奖名次)即可。具体来说,我们可以让程序从上向下扫描整个表格。当扫描到第4行并发现王五有资格获奖时,一共只发现一人(王五自己)获奖,所以王五必然是第1名;接下来扫描到第6行发现张三也有资格获奖,此时程序一共发现两人(王五与张三)获奖,所以张三必是第2名,以此类推。

在这段代码中,使用了字符串连接操作 “第” & k & “名” 来构造获奖名次。这个表达式将三个元素连接为一个字符串,分别包括字符串“第”“名”及变量 k。虽然变量 k 存放着一个数字(当前获奖人数),但是由于 VBA 发现这是一个字符串连接操作,所以会自动将 k 的数值转换为一个数字字符串(如“3”),从而顺利完成连接操作。所以每当执行到这句代码时,由于k的数值刚刚被增加1,E列单元格就会输出一个由新数字构成的字符串。

在实际教学中,笔者发现很多初学者虽然能够理解上面这段代码,但实际练习时却经常犯一个错误:把变量k写到双引号中。比如写成“第k 名” 或 “第” & “k” & “ 名”,甚至写成如图5.17所示的样子。这种写法会导致最终输出结果出错,因为k不再代表存放获奖人数的变量,而是代表一个固定不变的小写英文字母。同理,“&”也不再是一个字符串连接操作符,而是一个位于双引号内部的字符,代表一个普通标点符号。

图5.17 将变量 k 与操作符

总之,将固定不变的内容与可变的内容合并在一起,从而灵活构造出规范文本的操作,这在实际工作中非常重要且会频繁遇到,所以请初学程序设计的读者一定要理解透彻。 1gFNSwuM5k2gDf8litmfFUgmMjEZQ1fH7GyXiESBhAP6dDkd/S9DDx2YugJuzE27

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