Excel VBA 编程基础 -- 文字处理(二)
LCase(string) / UCase(string)其中,string 是要转换的字符串,LCase 将 string 全部转换为小写,UCase 则将 string 全部转换为大写。如果 string 是 Null,则 LCase / UCase 也返回 Null。由图可见,LCase / UCase 对于中文这样没有大小写概念的文字是不起作用的。返回去掉了头部空格(LTrim)、尾部空格(RTrim)、头尾两边空格(Trim)的 Variant(String) 类型的字符串。一般格式如下:LTrim(string) / RTrim(string) / Trim(string)其中,string 是任何合法字符串。如果 string 为 Null,则 LTrim / RTrim / Trim 也都返回 Null。注:英文字 trim 是“修剪、削减、切除”的意思,因此 LTrim 就是把字符串左边(头部)的空格剪掉,RTrim 就是把字符串右边(尾部)的空格剪掉,Trim 则是将两边(头、尾)的空格都剪掉。例1. LTrim / RTrim / Trim 用法示例图2 LTrim / RTrim / Trim 用法示例由图可见,LTrim(RTrim(s)) = Trim(s)。返回字符串的字符数,或变量所需字节数。其一般格式为:Len(string | varname) / LenB(string | varname)其中,string 为字符串,varname 为变量名。对于 string,Len 返回其字符数,LenB 返回其字节数。对于 varname,Len 和 LenB 均返回其字节数。由图可见,Len(s) 返回其中的字符数,LenB(s) 返回 s 的字节数,因为 VBA 使用 Unicode 作为字符的内部编码,因此一个字符占用 2 个字节。LenMbcs 函数是将字符串由 Unicode 转换为 MBCS 编码后计算出字符串占用的字节数,"string"作为单字节编码,“是字符串”作为双字节编码,因此其字节数是 6 + 2 * 4 = 14。对于非字符串型变量如双精度浮点型变量 d,则 Len(d) 和 LenB(d) 是一样的,都返回其占用的字节数。返回 Variant(String) 类型,包含字符串的左侧部分。其一般格式是:其中,string 是字符串表达式,length 是 Variant(Long) 型表达式,表示字符数。Left 返回 string 中长度为 length 的左侧部分。如果 string 为 Null,则返回 Null;如果 length 为 0,则返回空字符串("");如果 length 大于 string 的长度,则返回整个 string。VBA 中还有一个 Left$ 函数,但 VBA 文档中并没有包含这个函数,我们也就不去讨论了。与 Left 相对,Right 返回字符串的右侧部分。其一般格式是:其中,string 是字符串表达式,length 是 Variant(Long) 型表达式,表示字符数。Right 返回 string 中长度为 length 的右侧部分。如果 string 为 Null,则返回 Null;如果 length 为 0,则返回空字符串("");如果 length 大于 string 的长度,则返回整个 string。Left 和 Right 分别是从左侧和右侧截取字符子串,Mid 则是从中间截取子串。其一般格式是:Mid(string, start [, length ])- string 是字符串表达式,如果 string 为 Null,则返回 Null。
- start 是 Long 表达式,表示从哪里开始截取,如果 start 大于 string 的长度,则返回空字符串。
- length 是 Variant(Long) 型表达式,表示截取的子串的字符数,如果省略了 length,或者从 start 到 string 结尾的字符串长度小于 length,则返回从 start 开始的所有字符。
Space 返回 Variant(String) 的字符串,包含指定数量的空格。其一般格式如下:其中,number 是数值表达式,指定返回的空格数。Spc 和 Tab 都是 Print 命令中用来定位输出的指令:- Spc(n):从当前位置开始,通过添加空格向右移动指定数量的列
- Tab [(n)]:直接移动到指定的列号,如果 n 省略,则移动到下一个打印区
注:打印区(print zone):每 14 列组成一个打印区,每列的宽度取所选字体所有字符的平均宽度。我们从右侧的立即窗口看到,Tab 和 Spc 的行为并非如文档所言。按照文档,无参数的 Tab 表示跳到下一个打印区,而不管 Tab 前面是否有内容。但我们看到,第一行和第二行的 next 并没有对齐。我们将图8 的打印内容写入文件,在控制台窗口显示文件内容,如下图所示:从图9 可以看出,Spc 和 Tab 完美符合文档所言。- "Tab"; Tab; "ABC":ABC 确实从下一个打印区开始打印。
- "Tab6"; Tab(6); "ABC":因为 Tab6 占用了 4 列,Tab(6) 表示后面的 ABC 要从第 6 列开始打印,因此 Tab6 和 ABC 之间隔了一个空格。
- "Tab5"; Tab(5); "ABC":ABC 从第 5 列开始打印,因此 Tab5 和 ABC 之间无空格。
- "Tab4"; Tab(4); "ABC":Tab(4) 表示 ABC 要从第 4 列开始打印,但因为第 4 列已经被前面的 4 所占用,因此 ABC 换一行从第 4 列开始打印。
另外,从图中也可以看出,Space(n) 和 Spc(n) 用在 Print 语句上效果是一样的,但二者相似也仅此而已,Spc(n) 不能用在非 Print 语句上。如下面的代码所示:Dim s As Strings = "Hello" & Space(2) & "morning" ' Oks = "Hello" & Spc(2) & "morning" ' 编译错误:缺少表达式!
Spc 和 Tab 是 TUI 时代的产物,在 GUI 时代,由于都是非等宽字体,靠简单计算列数和列宽来进行格式化,其结果就像图8 右侧立即窗口所显示的那样,很难得到理想的结果,除非你的报告要在图9 那样的控制台窗口显示。