加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

VBA学习笔记之Text(八)——字符串之间的比较

(2012-10-26 08:30:00)
标签:

excel

like

strcomp函数

排序

比对字符串

分类: VBA
 
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),这里对其做一下说明:
  • vbBinaryCompare:区分大小写,即a的排序是在A的后面的,所以返回1
  • vbTextCompare:不区分大小写,即认为字符a和A一样,所以返回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函数将字符转化后再进行比较,而不是来改变设定的对比方法。
 

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有