乐于分享
好东西不私藏

Excel VBA 编程基础 -- 文字处理(三)

Excel VBA 编程基础 -- 文字处理(三)
今天继续讨论有关字符串操作的函数。
StrComp
StrComp 比较两个字符串,返回比较结果。其一般格式是:
StrComp(string1string2 [, compare ])
其中,string1 和 string2 是两个要比较的字符串表达式,可选参数 compare 指定字符串比较的方式。
compare 的取值列于下表:
表1 compare 的取值
根据 string 1 和 string2,StrComp 返回值列于下表:
表2 StrComp 返回值
表1 vbBinaryCompare 的意义:StrComp 比较 string1 和 string2 时,按照每个字符内部的二进制编码进行比较。vbTextCompare 则是根据字符的文本意义进行比较。譬如,"a" 和 "A",因为字符 a 的内部编码是 &H61,字符 A 的内部编码是 &H41,因此在 vbBinaryCompare 方式下,"a" > "A",而在 vbTextCompare 方式下,"a" = "A"。
例1. StrComp 用法示例
图1 StrComp 用法示例
由图可见,程序运行的结果与我们上面的分析是一致的。
StrConv
返回经过转换的 Variant(String) 类型字符串。其一般格式是:
StrConv(stringconversion [, LCID ])
其中,string 是要转换的字符串表达式,conversion 是 Integer 类型的转换方式,可选参数 LCID 是与当前系统设置的 LocaleID 不同的 LocaleID。
conversion 的取值列于下表:
表3 conversion 取值
注:
  • 上面的值有些是相容的,因此可以组合起来使用,譬如 vbUpperCase + vbWide,有些是相斥的,不能组合使用,譬如 vbWide 和 vbNarrow,vbKatakana 和 vbHiragana, vbUnicode 和 vbFromUnicode,vbUpperCase 和 vbLowerCase。
  • 如果系统区域设置(locale)不支持,则使用 vbWide、vbNarrow、vbKatakana、vbHiragana 会导致运行时错误。
  • 下面的字符是字的合法边界:
    • Null(Chr$(0))、水平tab(Chr$(9))、换行符(Chr$(10))、垂直tab(Chr$(11))、换页符(Chr$(12))、回车符(Chr$(13))、空格符(Chr$(32)),空格符在双字节字符集中有不同的值。
例1. StrConv 用法示例
图2 StrConv 用法示例
我们看到,字符串 s 长度为 15 个字符,经过 StrConv 转换为字节数组 x,x 的长度是 15 个字节。这说明字符串 s 是 ANSI 字符串。
下面在看一个比较复杂的字符串转换。
例2. StrConv 进行复杂的字符串转换示例
图3 StrConv 进行复杂的字符串转换示例
由图可见,对于一个中英文混杂的字符串,StrConv 使用 ANSI 编码将其转换为一个字节数组,其中的英文使用单字节的 ASCII 编码,中文使用双字节的 GB18030 编码。因此转换后的字节数组长度为 15 = 7 + 4*2。
要想将字节数组转换为字符串,使用 StrConv(byteArray, vbUnicode) 进行转换,如图中代码所示。
下面我们来看字符串 s 本身的构成。
我们把构成字符串 s 的字符一个个地打印出来,可以看出,前面的英文字符和后面的中文字符都是占用 2 个字节,英文字母 H 的 Unicode 编码是 &H0048,显示的时候,前面的 00 被丢掉了,因此显示为 48。从中文字符的编码可以看出,这是 Unicode(UTF-16)编码。可以看出这里的编码和前面数组 x 输出的编码是不同的,譬如,“早”在数组 x 中的编码为 &HD4E7(GB18030 编码),而在字符串 s 中的编码为 &H65E9(Unicode 编码)。最后一个中文字符!的编码为 &HFF01,显示的时候因为符号扩展,因此显示为 FFFFFF01。
以后我们在讲到文件处理时,还会更多地涉及到 StrConv 函数。
StrReverse
StrReverse 反转字符串。其一般格式是:
StrReverse(string)
其中,string 是要反转的字符串。如果 string 为空字符串,则 StrReverse 也返回空字符串。如果 string 为 Null,则引发错误。
例1. StrReverse 用法示例
Debug.Print StrReverse("Hello")' 输出 olleH
InStr
InStr 返回 Variant(Long) 类型的结果,表示要搜索的字符子串在字符串中位置。其一般格式如下:
InStr([ start, ]  string1string2 [, compare ])
其中,可选参数 start 表示在 string1 中搜索的起始位置,如果省略,则从 string1 的第一个字符开始搜索,如果指定了后面的 compare 参数,则 start 参数不可省略。如果 start 为 Null,则引发错误。
string1 为被搜索字符串,string2 是要搜索的字符子串。
可选参数 compare 意义与取值与前面 StrComp 函数中的 compare 一样,请参见前面的说明。
例1. InStr 用法示例
图4 InStr 用法示例
由图可见,InStr 返回 0 值表示被搜索字符子串在源字符串中没找到,否则,返回被搜索字符子串在源字符串中首次出现的位置。
InStrRev
与 InStr 功能相同,只是搜索顺序相反,InStr 是从左向右搜索,InStrRev 则是反过来,从右向左搜索。返回被搜索字符子串在源字符串中的位置。
注意:InStrRev 虽然搜索顺序是从右向左,但返回的位置则是按照从左向右计算的顺序。
InStrRev 的一般格式是:
InStrRev(string1string2 [, start [, compare ]])
其中,string1 和 string2 的意义与 InStr 中的同名参数相同。可选参数 start 指定搜索的起始位置,如果省略,则默认为 -1,表示从最后一个字符开始搜索。如果 start 为 Null,则引发错误。可选参数 compare 的作用和取值与 InStr 中的同名参数一样。
注:start 参数指定的起始位置是从 string1 的起始位置从左向右计算的。
InStrRev 各参数的取值与 InStrRev 返回值之间的关系列表于下:
表4 InStrRev 返回值与其参数之间的关系
例1. InStrRev 用法示例
图5 InStrRev 用法示例
最后一个 InStrRev(s, "L", 2, vbTextCompare) 之所以会返回 0,是因为搜索从第 2 个字符开始向左搜索,因为此时可搜索的字符串只有"He",没有要搜索的字符子串,因此返回 0。
相关阅读
Excel VBA 编程基础 -- 文字处理(一)
Excel VBA 编程基础 -- 文字处理(二)