1.比较运算符
包括:<、<=、>、>=、=、<>六种运算,当两个字符串完全一样时,相等,否则就不等;大于小于的判定标准是第一个不同字符的比较ASCII码的顺序来确定先后大小关系的,ASCII编码较大的大于ASCII编码较小的字符)
ASCII的排序规则:
1>.
区分大小写时:
A < B < E < Z
< a < b < e
< z
2>.
不区分大小写时:
(A=a) < ( _=_) < (B=b)
< (E=e) < (_=_) <
(Z=z) <
(_=_)
|
演示代码:
Sub StringComparisonOperatorDemo1()
Dim MyStr1
As String, MyStr2 As String
MyStr1 =
"Hello"
MyStr2 =
"hello"
Debug.Print
MyStr1 > MyStr2
Debug.Print
MyStr1 >= MyStr2
Debug.Print
MyStr1 = MyStr2
Debug.Print
MyStr1 < MyStr2
Debug.Print
MyStr1 <= MyStr2
Debug.Print
MyStr1 <> MyStr2
End Sub
运行的结果为:
False
False
False
True
True
True
|
2.
Like对比
语法为:字符串 Like
模式
模式可以为单个字符或字符串,也可以是包含通配符
返回值:如果字符串与模式匹配,模式不含通配符时,字符串和模式完全相同返回True,否则返回False;模式含有通配符时,如果匹配返回True,否则为False。
注:如果Like两端的字符串和模式有一个为Null,则结果为Null。
|
演示代码:
Sub StringLikeDemo1()
Dim a As
String
Dim b As
String
Dim c As
String
Dim d As
String
a =
"A"
b =
"A"
c =
"a"
d =
"Aa"
Debug.Print "a like b is "; a Like b
Debug.Print "a like c is "; a Like c
Debug.Print "a like d is "; a Like d
End Sub
运行结果:
a like b is True
a like c is False
a like d is False
|
上面的演示代码似乎并没有意义,因为其完全可以用运算符进行比较。Like的真正用途是用于发现包含通配符中的字符,如下面的代码筛选出“王”姓的人名:
|
演示代码
Sub StringLikeDemo2()
Dim Arr(2)
As String
Dim i As
Integer
Arr(0) =
"王三"
Arr(1) =
"王五"
Arr(2) =
"李四"
For i =
LBound(Arr) To UBound(Arr)
If Arr(i) Like "王?" Then
Debug.Print Arr(i)
End If
Next
End Sub
运行结果:
王三
王五
|
演示代码StringLikeDemo2中使用了“?”通配符,下面给出比较使用的通配符。常用的通配符如下:
-
?:任何单个字符
- *:0个或多个字符
- #:单个数字
- [list]:在list中的任意单个字符
- [!list]:不在list中的字符
3.比较函数StrComp
语法为:StrComp(string1,string2 [,Compare])
string1,string2分别为两个对比的字符串
Compare为可选参数,为对比规则,通常有vbBinaryCompare和vbTextCompare两种方式。
返回结果:两字符串相同,返回0,string1的第一个不同的字符排在string2前,返回-1.
string1的第一个不同的字符排在string2后,返回1.
演示代码:
Sub StrCompDemo()
Dim a As
String
Dim b As
String
Dim c As
String
a =
"a"
b =
"A"
c =
"B"
Debug.Print
StrComp(a, b, vbBinaryCompare)
Debug.Print
StrComp(a, b, vbTextCompare)
Debug.Print
StrComp(a, c, vbBinaryCompare)
Debug.Print
StrComp(a, c, vbTextCompare)
End Sub
运行结果:
1
0
1
-1
|
细心的朋友会发现,同样的变量a和变量b对比,不同的对比方式(vbBinaryCompare和vbTextCompare)返回的值不同(1和0),这里对其做一下说明:
注:第四种对比方式vbDatabaseCompare,只用于Access数据库中,不常用,这里不做介绍。
在比较中,VBA提供了一个定制模块,可以在代码块外部对对比方式进行限定,其用法为在代码块外加如下语法:
Option Compare Compare_Method
Compare_Method有三个常量:
- Binary:区分大小写
- Text:不区分大小写
- Database:仅用于Access数据库
注:默认情况下,不管是比较运算符、Like,还是StrComp(StrComp函数对比方式省略的情况下),对比方式都是Binary,即区分大小写的。
下面演示代码给出一个不区分大小写的比较运算符比较的演示代码:
|
演示代码:
'使用外部条件Option Compare限定比较类型,Binary区分大小写,Text不区分大小写
Option Compare Text
Sub
StringComparisonOperatorDemo2()
Debug.Print "Hello" = "hello"
End Sub
运行结果:True
|
逻辑运算符和Strcomp函数运行性能对比
完成一次简单的单一比较,如
If UCase(MyString1)
比使用StrComp函数
If StrComp(MyString1,MyString2,vbTextCompare)=-1 Then
在性能上要提高30%(平均情况下),且更容易阅读和理解
|
演示代码:
'使用比较运算符
Sub StrCompareDemo()
Dim
Arr()
Dim i As
Integer
Dim aCount
As Integer
Dim StarTime
As Long
StarTime =
Timer
aCount =
0
Arr =
Array("a", "b", "c", "d", "a", "d", "c", "a", "d", "a", "d",
"c")
For i = 0 To
UBound(Arr)
If Arr(i) < "b" Then
aCount = aCount 1
End If
Next i
Debug.Print
aCount
Debug.Print
"The time is :" & Timer - StarTime
& "ms"
Debug.Print
String(30, "=")
End Sub
'使用StrComp函数
Sub StrCompareDemo1()
Dim
Arr()
Dim i As
Integer
Dim aCount
As Integer
Dim StarTime
As Long
StarTime =
Timer
aCount =
0
Arr =
Array("a", "b", "c", "d", "a", "d", "c", "a", "d", "a", "d",
"c")
For i = 0 To
UBound(Arr)
If StrComp(Arr(i), "b") = -1 Then
aCount = aCount 1
End If
Next i
Debug.Print
aCount
Debug.Print
"The time is :" & Timer - StarTime
& "ms"
End Sub
运行结果:
4
The time is :-.172119140625ms
==============================
4
The time is :.389892578125ms
|
下面给出比较的一个应用:
【应用】排序
|
Sub SortArray(arr As Variant, _
Optional compare As VbCompareMethod = vbBinaryCompare)
Dim lb As Integer, ub As Integer, i As Integer, str As String
Dim j As Integer
' If argument is not an array, then exit.
If Not IsArray(arr) Then Exit Sub
lb = LBound(arr)
ub = UBound(arr)
' If only one element, then exit.
If lb = ub Then Exit Sub
For i = lb To ub
str = arr(i)
For j = lb To ub
' Swap values if out of order.
If StrComp(str, arr(j), compare) = -1 Then
str = arr(j)
arr(j) = arr(i)
arr(i) = str
End If
Next
Next
End Sub
Function SortString(str As
String, Optional ignorecase = False)
Dim arr As Variant
' Covert the string to an array.
arr = Split(str, " ")
' Sort the array case-sensitive or case-insensitive.
If ignorecase Then
SortArray arr, vbTextCompare
Else
SortArray arr, vbBinaryCompare
End If
' Convert the array back to a string and return it.
SortString = Join(arr, " ")
End
Function
|
|
注:
- 设定外部Option
Compare的比较方式在比较运算符、Like、StrComp函数中均可以应用
-
在实际编程中,通常选用UCase或LCase函数将字符转化后再进行比较,而不是来改变设定的对比方法。
|
|
|
加载中,请稍候......