VBA编程——字符串

字符串(String)是什么?在计算机应用程序中,字符串就是文本,文本就是字符串。在Excel中我们称为文本,而在VBA编程和大多数可编程环境里则称为字符串。本文将介绍VBA中的字符串处理。

VBA中的字符串使用一对英文双引号定义,如果字符串也包含双引号则需要使用两个双引号转义为一个双引号。将两个字符串连接到一起时可以使用&运算符,将变量声明为字符串类型时使用String关键字,下面的代码演示了字符串的基本应用。

VBA
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参数确定字符的比较方式,其设置如下表所示:

常量说明
-1vbUseCompareOption使用Option Compare语句的设置执行比较。默认设置为Binary,即按字符编码二进制编码排序;设置为Text时将不区域字母大小写。
0vbBinaryCompare执行二进制比较。
1vbTextCompare执行文本比较。

InStrRev()函数的定义InstrRev(stringcheck, stringmatch, [ start, [ compare ]]),函数的功能是在stringcheck中查找stringmatch,并返回最后一次出现的位置;可以使用start参数指定开始查找的位置,默认为1;compare参数设置参照上表。下面的代码演示了InStr()和InStrRev()函数的应用。

VBA
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()函数的应用。

VBA
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个字符。下面的代码演示了这三个函数的应用。

VBA
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()函数同是将字符串中的所有字母转换为大写形式并返回转换后的字符串;下面的代码演示了这两个函数的应用。

VBA
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指定转换方法,其设置如下表。

常量说明
1vbUpperCase将字符串转换为大写字符。
2vbLowerCase将字符串转换为小写字符。
3vbProperCase将字符串中每个单词的第一个字母转换为大写。
4vbWide将字符串中的窄 (单字节) 字符转换为宽 (双字节) 字符。
8vbNarrow将字符串中的宽 (双字节) 字符转换为窄 (单字节) 字符。
16vbKatakana将字符串中的平假名字符转换为片假名字符。
32vbHiragana将字符串中的片假名字符转换为平假名字符。
64vbUnicode使用系统的默认代码页将字符串转换为 Unicode。 (在 Macintosh 上不可用)。
128vbFromUnicode将字符串从 Unicode 转换为系统的默认代码页。 (在 Macintosh 上不可用)

字符串内容反序排列

StrReverse()函数可以将字符串中的字符反序排列,如下面的代码。

VBA
Sub test()
    Dim s1 As String
    s1 = "abc165"
    Debug.Print (StrReverse(s1)) '561cba
End Sub

请注意,StrReverse()函数是反序排列而不是降序排列。

删除开始和结尾部分空格

Trim()函数可以删除字符串开始和结尾部分的空格,并返回处理后的字符串;LTrim()和RTrim()函数分别删除字符串开始部分和结束部分的空格并返回处理后的字符串。下面的代码演示了这三个函数的应用。

VBA
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()函数的应用。

VBA
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()函数的应用。

VBA
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()函数的应用。

VBA
Sub test()
    Debug.Print (String(5, "ab")) 'aaaaa
    Debug.Print (String(4, "*")) '****
End Sub

ASCII编码和字符转换

ASCII编码和字符互转可以使用Asc()和Chr()函数,其中,Asc()函数返回字符的ASCII编码,Chr()函数返回指定ASCII码对应的字符。下面的代码演示了相关应用。

VBA
Sub test()
    Debug.Print (Chr(48)) '0
    Debug.Print (Chr(65)) 'A
    Debug.Print (Chr(97)) 'a
End Sub

字符串比较和Like运算符

StrComp()函数定义为StrComp(string1,string2,[compare]),用于比较两个字符串,其中,compare参数指定比较方法,请参照本文前面的内容设置。函数返回的返回值可能有:

  • -1值,表示string1小于string2。
  • 0值,表示string1等于string2。
  • 1值,表示string1大于string2。
  • Null值,表示string1或string2为Null。

Like运算符用于模糊查询,可以按简单的模式进行匹配,查询模式中可以使用的匹配符有:

  • 问号?表示任意单个字符。
  • 星号*表示零个或多个字符。
  • 数字符号#表示任何个位数字 (0-9) 。
  • [charlist],charlist列表中的任意单个字符。
  • [!charlist],不包含charlist列表中字符的任意单个字符。

在字符列表中,除了一一列出字符,还可以使用连字符(-)指定范围的上限和下限,如[A-Z]任意一个大写字母。请注意,如果需要匹配左方括号([)、问号(?)、数字符号(#)和星号(*),则用方括号将它们括起。右方括号 (]) 可作为单独的字符匹配。

下面的代码演示了Like运算符的应用。

VBA
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()函数的应用。

VBA
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()函数。