2.6 查找字符串 2.6.1 InStr函數(shù) 可使用InStr函數(shù)返回一字符串在另一字符串中的位置,因此,也可以使用該函數(shù)確定一個字符串中是否包含有另一個字符串。其語法為: InStr([Start,]string1,string2[,compare]) 其中,參數(shù)Start為可選參數(shù),設置查找的起點,如果省略,則從第一個字符的位置開始查找,當指定了參數(shù)Compare時,則要指定此參數(shù)。參數(shù)string1為被查找的字符串,參數(shù)string2為要查找的字符串,這兩個參數(shù)都是必需的。 如果在String1中沒有找到String2,返回0;如果找到String2,則返回String2第一個出現(xiàn)的首字符位置(即1到String1的長度);如果String2的長度為零,返回Start。 可看看下面的示例: Sub test() Dim SearchString, SearchChar, MyPos SearchString = "XXpXXpXXPXXP" '被搜索的字符串 SearchChar = "P" '要查找字符串 "P" '從第四個字符開始,以文本比較的方式找起,返回值為 6(小寫 p) '小寫 p 和大寫 P 在文本比較下是一樣的 MyPos = InStr(4, SearchString, SearchChar, 1) Debug.Print MyPos '從第一個字符開使,以二進制比較的方式找起,返回值為 9(大寫 P) '小寫 p 和大寫 P 在二進制比較下是不一樣的 MyPos = InStr(1, SearchString, SearchChar, 0) Debug.Print MyPos '缺省的比對方式為二進制比較(最后一個參數(shù)可省略) MyPos = InStr(SearchString, SearchChar) '返回 9 Debug.Print MyPos MyPos = InStr(1, SearchString, "W") '返回 0 Debug.Print MyPos End Sub 2.6.2 InStrRev函數(shù) 也可以使用InStrRev函數(shù)返回一個字符串在另一個字符串中出現(xiàn)的位置,與InStr函數(shù)不同的是,從字符串的末尾算起。其語法為: InStrRev(String1,String2[,[Start[,compare]) 參數(shù)String1為被查找的字符串,參數(shù)String2為要查找的字符串,這兩個參數(shù)都是必需的。參數(shù)Start為可選參數(shù),設置每次查找開始的位置,若忽略則使用-1,表示從上一個字符位置開始查找。參數(shù)Compare為可選參數(shù),表示所使用的比較方法,如果忽略則執(zhí)行二進制比較。 下面的示例使用了InStr函數(shù)和InStrRev函數(shù),相應的結果不同: Sub test() Dim myString As String Dim sSearch As String myString = "I like the functionality that InsStrRev gives" sSearch = "th" Debug.Print InStr(myString, sSearch) '返回8 Debug.Print InStrRev(myString, sSearch) '返回26 End Sub - - - - - - - - - - - - - - - - - - - - - - - 2.7 提取字符/字符串 2.7.1 Left函數(shù) Left函數(shù)可以從字符串的左邊開始提取字符或指定長度的字符串,即返回包含字符串中從左邊算起指定數(shù)量的字符。其語法為: Left(String,CharNum) 其中,如果參數(shù)String包含Null,則返回Null;如果參數(shù)CharNum的值大于或等于String的字符數(shù),則返回整個字符串。 例如,下面的代碼返回指定字符串的前兩個字符: strLeft=Left(“This is a pig.”,2) Left函數(shù)與InStr函數(shù)結合,返回指定字符串的第一個詞,例如下面的代碼: str = "This is a pig." FirstWord = Left(str, InStr(str, " ") - 1) 2.7.2 Right函數(shù) 與Left函數(shù)不同的是,Right函數(shù)從字符串的右邊開始提取字符或指定長度的字符串,即返回包含字符串中從右邊起指定數(shù)量的字符。其語法為: Right(String,CharNum) 例如: AnyString = "Hello World" ' 定義字符串 MyStr = Right(AnyString, 1) ' 返回 "d" MyStr = Right(AnyString, 6) ' 返回 " World" MyStr = Right(AnyString, 20) ' 返回 "Hello World" 如果存放文件名的字符串中沒有反斜杠(),下面的代碼將反斜杠()添加到該字符串中: If Right(strFileName,1) <> “” Then strFileName=strFileName & “” End If 下面的函數(shù)假設傳遞給它的參數(shù)或者是文件名,或者是包含完整路徑的文件名,從字符串的末尾開始返回文件名。 Private Function ParseFileName(strFullPath As String) Dim lngPos As Long, lngStart As Long Dim strFilename As String lngStart = 1 Do lngPos = InStr(lngStart, strFullPath, "") If lngPos = 0 Then strFilename = Right(strFullPath, Len(strFullPath) - lngStart + 1) Else lngStart = lngPos + 1 End If Loop While lngPos > 0 ParseFileName = strFilename End Function 2.7.3 Mid函數(shù) Mid函數(shù)可以從字符串中提取任何指定的子字符串,返回包含字符串中指定數(shù)量的字符的字符串。其語法為: Mid(String,Start[,Len]) 其中,如果參數(shù)String包含Null,則返回Null;如果參數(shù)Start超過了String的字符數(shù),則返回零長度字符串(“”);如果參數(shù)Len省略或超過了文本的字符數(shù),則返回字符串從Start到最后的所有字符。 例如,下面的代碼: Str=Mid(“This is a pig.”,6,2) 將返回文本“is”。 下面的代碼: MyString = "Mid Function Demo" '建立一個字符串 FirstWord = Mid(MyString, 1, 3) '返回 "Mid" LastWord = Mid(MyString, 14, 4) '返回 "Demo" MidWords = Mid(MyString, 5) '返回 "Funcion Demo" Mid函數(shù)常用于在字符串中循環(huán),例如,下面的代碼將逐個輸出字符: Dim str As String Dim i As Integer Str=”Print Out each Character” For i=1 to Len(str) Debug.Print Mid(str,i,1) Next i 2.7.4 Mid語句 Mid語句可以用另一個字符串中的字符替換某字符串中指定數(shù)量的字符。其語法為: Mid(Stringvar,Start[,Len])=string 其中,參數(shù)Stringvar代表為要被更改的字符串;參數(shù)Start表示被替換的字符開頭位置;參數(shù)Len表示被替換的字符數(shù),若省略則全部使用string;參數(shù)string表示進行替換的字符串。 被替換的字符數(shù)量總小于或等于Stringvar的字符數(shù);如果string的數(shù)量大于Len所指定的數(shù)量,則只取string的部分字符。示例如下: MyString = "The dog jumps" ' 設置字符串初值 Mid(MyString, 5, 3) = "fox" ' MyString = "The fox jumps" Mid(MyString, 5) = "cow" ' MyString = "The cow jumps" Mid(MyString, 5) = "cow jumped over" ' MyString = "The cow jumpe" Mid(MyString, 5, 3) = "duck" ' MyString = "The duc jumpe" - - - - - - - - - - - - - - - - - - - - - - - 2.8 刪除空格 LTrim函數(shù)刪除字符串前面的空格; RTrim函數(shù)刪除字符串后面的空格; Trim函數(shù)刪除兩頭的空格。 示例如下: MyString = " <-Trim-> " ' 設置字符串初值 TrimString = LTrim(MyString) ' TrimString = "<-Trim-> " TrimString = RTrim(MyString) ' TrimString = " <-Trim->" TrimString = LTrim(RTrim(MyString)) ' TrimString = "<-Trim->" ' 只使用 Trim 函數(shù)也同樣將兩頭空格去除 TrimString = Trim(MyString) ' TrimString = "<-Trim->" - - - - - - - - - - - - - - - - - - - - - - - 2.9 返回字符代碼 Asc函數(shù)返回指定字符串表達式中第一個字符的字符代碼。示例如下: MyNumber = Asc("A") ' 返回 65 MyNumber = Asc("a") ' 返回 97 MyNumber = Asc("Apple") ' 返回 65 [編程方法和技巧] (1) 在數(shù)據(jù)驗證中用Asc來決定一些條件,如第一個字符是大寫還是小寫、是字母還是數(shù)字。 Private Sub CommandButton1_Click() Dim sTest As String Dim iChar As Integer sTest = TextBox1.Text If Len(sTest) > 0 Then iChar = Asc(sTest) If iChar >= 65 And iChar <= 90 Then MsgBox "第一個字符是大寫" ElseIf iChar >= 97 And iChar <= 122 Then MsgBox "第一個字符是小寫" Else MsgBox "第一個字符不是字母" End If Else MsgBox "請在文本框中輸入" End If End Sub (2) 用Asc函數(shù)和Chr函數(shù)來創(chuàng)建基本加密的方法。 Private Sub CommandButton2_Click() Dim MyName As String, MyEncryptedString As String Dim MyDecryptedString As String Dim i As Integer MyName = "fanjy" For i = 1 To Len(MyName) MyEncryptedString = MyEncryptedString & Chr(Asc(Mid(MyName, i, 1)) + 25) Next i MsgBox "您好!我的名字是" & MyEncryptedString For i = 1 To Len(MyName) MyDecryptedString = MyDecryptedString & Chr(Asc(Mid(MyEncryptedString, i, 1)) - 25) Next i MsgBox "您好!我的名字是" & MyDecryptedString End Sub - - - - - - - - - - - - - - - - - - - - - - - 2.10 返回數(shù)值代表的相應字符 Chr函數(shù)返回指定字符碼所代表的字符,其語法為: Chr(charcode) 其中參數(shù)charcode代表字符碼,一般為0~255。例如: MyChar = Chr(65) ' 返回 A MyChar = Chr(97) ' 返回 a MyChar = Chr(62) ' 返回 > MyChar = Chr(37) ' 返回 % [編程方法和技巧] (1) 使用Chr(34)將引號嵌入字符串,如 Chr(34) & sString & Chr(34) (2) 下面列出了在調(diào)用Chr函數(shù)時比較常用的字符代碼: 代碼 值 描述 0 Null 相當于vbNullChar常數(shù) 8 BS 相當于vbBack常數(shù) 9 TAB 相當于vbTab常數(shù) 10 CR 相當于vbCr和vbCrLf常數(shù) 13 LF 相當于vbLf和vbCrLf常數(shù) 34 “” 引號 - - - - - - - - - - - - - - - - - - - - - - - 2.11 使用字節(jié)的函數(shù) VBA中返回字符串的函數(shù)有兩種格式,一種以$結尾,返回字符串,不需要進行類型轉換,所以速度較快,但如果輸入值是包含Null的Viarant,則會發(fā)生運行錯誤;一種沒有$,返回Viarant數(shù)據(jù)類型,如果輸入值是包含Null的Viarant,則返回Null。因而,如果要使得程序運行速度快,則使用帶有$的函數(shù)且要避免向這些函數(shù)傳遞空值。 - - - - - - - - - - - - - - - - - - - - - - - 2.12 返回數(shù)組的函數(shù) 2.12.1 Filter函數(shù) Filter函數(shù)返回一個下標從零開始的數(shù)組,該數(shù)組包含基于指定篩選條件的一個字符串數(shù)組的子集。其語法為: Filter(sourcearray,match[,include[,compare]]) 其中,參數(shù)sourcearray必需,是要執(zhí)行搜索的一維字符串數(shù)組;參數(shù)match必需,是要搜索的字符串;參數(shù)include可選,Boolean值,表示返回子串包含還是不包含match字符串,如果include為True,返回包含match子字符串的數(shù)組子集,如果include為False,返回不包含match子字符串的數(shù)組子集;參數(shù)compare可選,表示所使用的字符串比較類型,其設置值為:-1(常數(shù)為vbUseCompareOption)表示使用Option Compare語句的設置值來執(zhí)行比較;0(常數(shù)為vbBinaryCompare)表示執(zhí)行二進制比較;1(常數(shù)為vbTextCompare)表示執(zhí)行文字比較;2(常數(shù)為vbDatabaseCompare)只用于Microsoft Access,表示基于數(shù)據(jù)庫信息來執(zhí)行比較。 如果在sourcearray中沒有發(fā)現(xiàn)與match相匹配的值,F(xiàn)ilter函數(shù)返回一個空數(shù)組;如果sourcearray是Null或不是一個一維數(shù)組,則產(chǎn)生錯誤。 Filter函數(shù)所返回的數(shù)組,其元素數(shù)是所找到的匹配項目數(shù)。 [編程方法和技巧] (1) Filter函數(shù)也可以過濾數(shù)字值。此時,應指定Variant類型的字符串sourcearray,并用數(shù)字值給數(shù)組賦值。同時,也可以將字符串、Variant、Long或Integer數(shù)據(jù)傳遞給match。但應注意,返回的字符串表現(xiàn)為被過濾數(shù)字的字符串的形式。例如: Sub test() Dim varSource As Variant, varResult As Variant Dim strMatch As String, i strMatch = CStr(2) varSource = Array(10, 20, 30, 21, 22, 32) varResult = Filter(varSource, strMatch, True, vbBinaryCompare) For Each i In varResult Debug.Print i Next End Sub 將返回20,21,22,32 (2) Filter函數(shù)可以和Dictionary對象很好地配合使用??梢园袲ictionary對象產(chǎn)生的Key值作為一種過濾Dictionary對象成員的快速方法傳遞給Filter函數(shù),如: Sub test() Dim i As Integer Dim sKeys() As Variant Dim sFiltered() As String Dim sMatch As String Dim blnSwitch As Boolean Dim oDict As Dictionary Set oDict = New Dictionary oDict.Add "Microsoft", "One Microsoft Way" oDict.Add "AnyMicro Inc", "31 Harbour Drive" oDict.Add "Landbor Data", "The Plaza" oDict.Add "Micron Co.", "999 Pleasant View" sKeys = oDict.Keys sMatch = "micro" blnSwitch = True '尋找包含字符串macro(不區(qū)分大小寫)的所有鍵 sFiltered() = Filter(sKeys, sMatch, blnSwitch, vbTextCompare) For i = 1 To UBound(sFiltered) Debug.Print sFiltered(i) & "," & oDict.Item(sFiltered(i)) Next i End Sub 2.12.2 Split函數(shù) Split函數(shù)返回一個下標從零開始的一維數(shù)組,包含指定數(shù)目的子字符串。其語法為: Split(expression[,delimiter[,limit[,compare]]]) 其中,參數(shù)expression必需,表示包含子字符串和分隔符的字符串,若expression是一個長度為零的字符串(“”),該函數(shù)則返回一個沒有元素和數(shù)據(jù)的空數(shù)組;參數(shù)delimiter用于標識子字符串邊界的字符串字符,若忽略則使用空格(“ “)作為分隔符,若是一個長度為零的字符串則返回僅包含一個元素的數(shù)組,該元素是expression所表示的字符串;參數(shù)limit表示要返回的子字符串數(shù),-1表示返回所有的子字符串;參數(shù)compare表示判別子字符串時使用的比較方式,其值與Filter函數(shù)的設置值相同。 - - - - - - - - - - - - - - - - - - - - - - - 2.13 連接字符串 Join函數(shù)返回連接某數(shù)組中的多個子字符串而組成的字符串,即將數(shù)組中的字符串連接起來。其語法為: Join(sourcearray[,delimiter]) 其中,參數(shù)sourcearray必需,是包含被連接子字符串的一維數(shù)組;參數(shù)delimiter可選,代表在所返回的字符串中用于分隔子字符串的字符,若忽略則使用空(“ ”)來分隔,若為零長字符串(“”),則所有項目都連接在一起,中間沒有分隔符。 - - - - - - - - - - - - - - - - - - - - - - - 2.14 替換字符串 Replace函數(shù)返回一個被替換了的字符串,該字符串中指定的子字符串已被替換成另一個子字符串,并且替換指定次數(shù)。其語法為: Replace(expression,find,replace[,start[,count[,compare]]]) 其中,參數(shù)expression必需,表示所要替換的子字符串;參數(shù)find必需,表示要搜索到的子字符串;參數(shù)replace必需,表示用來替換的子字符串;參數(shù)start表示開始搜索的位置,若忽略,則從1開始;參數(shù)count表示進行替換的次數(shù),缺省值是-1,表示進行所有可能的替換;參數(shù)compare表示判別子字符串時所用的比較方式,與Filter函數(shù)的設置值相同。 如果expression的長度為零,Replace返回零長度字符串(“”);如果expression為Null,則返回錯誤;如果find的長度為零,則返回expression的副本;如果replace的長度為零,則返回刪除了所有出現(xiàn)find的字符串的副本;如果start的值大于expression的長度,則返回長度為零的字符串;如果count為0,則返回expression的副本。 Replace函數(shù)返回的字符串是從參數(shù)start所指定的位置開始到expression結尾已經(jīng)進行過替換的字符串。 注意: (1) 如果沒有使用參數(shù)count,那么當替換較短字符串時就要注意,防止形成一個不相關的字符。 (2) 如果start值大于1,返回的字符串將從start開始,而不是從原有字符串的第一個字符開始。 - - - - - - - - - - - - - - - - - - - - - - - 2.15 反向字符串 StrReverse函數(shù)返回與指定字符串順序相反的字符串,其語法為: StrReverse(expression) 其中,參數(shù)expression是一個字符串,應用StrReverse函數(shù)后將返回與該字符串順序相反的字符串。如果expression是一個長度為零的字符串(“”),則返回一個長度為零的字符串;如果expression為Null,則產(chǎn)生一個錯誤。
|
|
來自: 昵稱QAb6ICvc > 《vba應用》