字符串(String)是什么?在计算机应用程序中,字符串就是文本,文本就是字符串。在Excel中我们称为文本,而在VBA编程和大多数可编程环境里则称为字符串。本文将介绍VBA中的字符串处理。
VBA中的字符串使用一对英文双引号定义,如果字符串也包含双引号则需要使用两个双引号转义为一个双引号。将两个字符串连接到一起时可以使用&运算符,将变量声明为字符串类型时使用String关键字,下面的代码演示了字符串的基本应用。
Sub test() Dim x As String, y As String x = "ABC" y = """123""" Debug.Print (x & y) End Sub
执行代码会显示ABC"123"。
Len()函数可以返回字符串中的字符数量,需要注意的是两个双引号转义为一个双引号时只算作一个字符。如Len("abc")返回3、Len("""123""")返回5。下面继续了解一些常用的字符串操作函数。
InStr()函数的定义为InStr([ start ], string1, string2, [ compare ]),其功能是在string1中查找string2,并返回首次出现的位置(整数索引值),如果没有找到返回0。如果string1或string2为NULL则返回NULL值。参数start默认为1,即从第一个字符开始查找,也可以指定一个位置开始查找。compare参数确定字符的比较方式,其设置如下表所示:
InStrRev()函数的定义InstrRev(stringcheck, stringmatch, [ start, [ compare ]]),函数的功能是在stringcheck中查找stringmatch,并返回最后一次出现的位置;可以使用start参数指定开始查找的位置,默认为1;compare参数设置参照上表。下面的代码演示了InStr()和InStrRev()函数的应用。
Sub test() Dim s1 As String, s2 As String s1 = "123ABC456abc789ABC" s2 = "ABC" Debug.Print (InStr(s1, s2)) '4 Debug.Print (InStr(10, s1, s2)) '16 Debug.Print (InStr(10, s1, s2, vbTextCompare)) '10 Debug.Print (InStrRev(s1, s2)) '16 End Sub
Replace()函数的定义为Replace(expression,find,replace,[start,[count, [compare ]]]),其功能是在expression中找到find,然后将其替换为replace;start指定开始查找的位置,默认为1;,count参数指定替换的次数,默认为替换所有找到的内容;compare参数指定字符比较方式,参照上表中的设置。下面的代码演示了Replace()函数的应用。
Sub test() Dim s1 As String, s2 As String s1 = "1ABC2abc3ABC" s2 = "ABC" Debug.Print (Replace(s1, s2, "***")) '1***2abc3*** Debug.Print (Replace(s1, s2, "***", 1, -1, vbTextCompare)) '1***2***3*** End Sub
获取字符串的一部分内容,可以使用Mid()、Right()、Left() 函数;其中,Mid()函数定义为Mid(string, start, [ length ]),其功能是从string中截取从start位置开始的length个字符,如果不指定length则返回从start开始的所有字符。Left()函数定义为Left(string, length),功能返回string中开始部分的length个字符;Right()函数定义为Right(string, length),功能是返回string中结尾部分的length个字符。下面的代码演示了这三个函数的应用。
Sub test() Dim s1 As String s1 = "abcdefg" Debug.Print (Mid(s1, 5, 2)) 'ef Debug.Print (Mid(s1, 5)) 'efg Debug.Print (Left(s1, 3)) 'abc Debug.Print (Right(s1, 3)) 'efg End Sub
LCase()函数的功能是将字符串中的所有字母转换为小写形式并返回转换后的字符串;UCase()函数同是将字符串中的所有字母转换为大写形式并返回转换后的字符串;下面的代码演示了这两个函数的应用。
Sub test() Dim s1 As String s1 = "abcDEFg" Debug.Print (LCase(s1)) 'abcdefg Debug.Print (UCase(s1)) 'ABCDEFG End Sub
StrConv()函数可以提供更多转换功能,其定义为StrConv (string,conversion,[LCID]),其中,string指定需要转换的字符串,conversion指定转换方法,其设置如下表。
StrReverse()函数可以将字符串中的字符反序排列,如下面的代码。
Sub test() Dim s1 As String s1 = "abc165" Debug.Print (StrReverse(s1)) '561cba End Sub
请注意,StrReverse()函数是反序排列而不是降序排列。
Trim()函数可以删除字符串开始和结尾部分的空格,并返回处理后的字符串;LTrim()和RTrim()函数分别删除字符串开始部分和结束部分的空格并返回处理后的字符串。下面的代码演示了这三个函数的应用。
Sub test() Dim s1 As String s1 = " abc " Debug.Print (Trim(s1)) 'abc Debug.Print (Len(LTrim(s1))) '6 Debug.Print (RTrim(s1)) ' abc End Sub
Join()函数定义为Join(sourcearray,[delimiter]),其功能是将数组的元素连接为一个字符串;参数sourcearray为数组,delimiter为连接各元素之间的分隔符,默认为空格符。下面的代码演示了Join()函数的应用。
Sub test() Dim arr arr = Array("a", "b", "c") Debug.Print (Join(arr)) 'a b c Debug.Print (Join(arr, ",")) 'a,b,c Debug.Print (Join(arr, "")) 'abc End Sub
Split()函数定义为Split(expression,[delimiter,[limit,[compare]]]),函数会使用delimiter分割expression,并返回分割后元素组成的数组。其中,delimiter默认为空格符,limit指定分割的最多元素数量,默认值-1表示全部分割;compare指定字符比较方法,请参照本文前面的内容。下面的代码演示了Split()函数的应用。
Sub test() Dim s As String s = "a,b,c,d,e,f,g" arr = Split(s, ",") For Each e In arr Debug.Print (e) Next ' arr = Split(s, ",", 3) For Each e In arr Debug.Print (e) Next End Sub
代码中,第一次分割会返回包含了"a"、"b"、"c"、"d"、"e"、"f"、"g"七个元素的数组,而第二次分割只返回三个元素,分别是"a"、"b"和"c、d、e、f、g"。
Space(n)函数,返回n个空格组成的字符串。
String()函数定义为String(number, character),其功能是返回number个character(只使用第一个字符)组成的字符串,下面的代码演示了String()函数的应用。
Sub test() Debug.Print (String(5, "ab")) 'aaaaa Debug.Print (String(4, "*")) '**** End Sub
ASCII编码和字符互转可以使用Asc()和Chr()函数,其中,Asc()函数返回字符的ASCII编码,Chr()函数返回指定ASCII码对应的字符。下面的代码演示了相关应用。
Sub test() Debug.Print (Chr(48)) '0 Debug.Print (Chr(65)) 'A Debug.Print (Chr(97)) 'a End Sub
StrComp()函数定义为StrComp(string1,string2,[compare]),用于比较两个字符串,其中,compare参数指定比较方法,请参照本文前面的内容设置。函数返回的返回值可能有:
Like运算符用于模糊查询,可以按简单的模式进行匹配,查询模式中可以使用的匹配符有:
在字符列表中,除了一一列出字符,还可以使用连字符(-)指定范围的上限和下限,如[A-Z]任意一个大写字母。请注意,如果需要匹配左方括号([)、问号(?)、数字符号(#)和星号(*),则用方括号将它们括起。右方括号 (]) 可作为单独的字符匹配。
下面的代码演示了Like运算符的应用。
Sub test() Dim s As String s = "abc123" Debug.Print (s Like "*#") 'True Debug.Print (s Like "*[5-9]") 'False Debug.Print (s Like "a*") 'True Debug.Print (s Like "[A-Z]*") 'False Debug.Print (s Like "[a-z]*") 'True End Sub
Filter()函数的定义为Filter(sourcearray,match,[include,[compare]]),其中,sourcearray为查询元素的数组;match为查询内容;include参数默认值为True,将返回包含查询内容的元素的数组,为False时返回不包含查询内容的元素的数组;compare参数用于是指定字符比较方式,请参照本文前面的内容设置。
下面的代码显示了Fliter()函数的应用。
Sub test() Dim arr1 arr1 = Array("tom", "john", "tom", "timmy", "smith") ' arr = Filter(arr1, "tom", False) For Each e In arr Debug.Print (e) Next End Sub
本例将显示tom以外的元素,包括"john"、"timmy"、"smith"。
判断字符串能否转换为数值类型时可以使用IsNumeric()函数,将字符串形式的数值转换为数值类型时,可以使用对应的函数,如CInt()、CLng()、CSng()、CDbl()、CCur()函数等。将数值转换为字符串时可以使用Str()函数。