1. 程式人生 > >VBA字串處理大全-from EH

VBA字串處理大全-from EH

VBA字串處理大全 轉載出處

1 VBA中的字串
2 VBA中處理字串的函式
    2.1 比較字串
    2.2 轉換字串
    2.3 建立字串
    2.4 獲取字串的長度
    2.5 格式化字串
    2.6 查詢字串
    2.7 提取字元/字串
    2.8 刪除空格
    2.9 返回字元程式碼
    2.10 返回數值代表的相應字元
    2.11 使用位元組的函式
    2.12 返回陣列的函式
    2.13 連線字串
    2.14 替換字串
    2.15 反向字串
====================================================


1 VBA中的字串

VBA不僅可以處理數字,也可以處理文字(字串)。VBA提供了兩類字串:
一類為固定長度的字串,宣告時包含指字的字元數。例如,下面的語句
Dim strFixedLong As String*100
宣告字串變數後,無論賦予該變數多少個字元,總是隻包含100個字元,但字串最長不超過65526個字元,且需要使用Trim函式去掉字串中多餘的空格。定長字串只有在必要時才使用。
另一類為動態字串。例如,宣告字串變數Dim strDynamic As String後,可以給該變數任意賦值,最多可包含20億個字元。
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

2 VBA中處理字串的函式
2.1 比較字串通常,在VBA中進行字串比較時,會用到比較運算子(如=、>等)、Like運算子和StrComp函式。此外,在模組的開頭用Option Compare語句指定比較方式。
2.1.1 比較運算子
可以採用簡單的邏輯運算子進行兩個字串的比較,即<(小於)、<=(小於或等於)、>(大於)、>=(大於或等於)、=(等於)、<>(不等於)。此外,還可以使用Like運算子進行比較。
2.1.2 StrComp函式
StrComp函式返回字串比較的結果。其語法為:
    StrComp(string1,string2[,compare])

其中,引數string1和strng2為必需的引數,可以是任何有效的字串表示式。
引數Compare為可選引數,如果該引數為Null,將發生錯誤。如果引數Compare設定為常數vbUseCompareOption或-1或忽略該引數,將使用Option Compare語句設定進行比較;如果忽略該引數且沒有設定Option Compare語句,則按二進位制進行比較;如果引數Compare設定為常數vbBinaryCompare或0,則用二進位制進行比較;如果引數Compare設定為常數vbTextCompare或1,則按文字進行比較;如果引數Compare設定為常數vbDatabaseCompare或2,此時僅適用於Microsoft Access,進行基於資料庫資訊的比較。
StrComp函式的返回值為:如果String1<String2,則返回值為-1;如果String1=String2,則返回值為0;如果String1>String2,則返回值為1;如果String1或String2為Null,則返回值為Null。
看看下面的示例:
Sub testStringCompare()
  Dim MyStr1 As String, MyStr2 As String, MyComp1, MyComp2, MyComp3, MyComp4
  MyStr1 = "ABCD"
  MyStr2 = "abcd"
  MyComp1 = StrComp(MyStr1, MyStr2, 1)    ' 返回 0
  MyComp2 = StrComp(MyStr1, MyStr2, 0)    ' 返回 -1
  MyComp3 = StrComp(MyStr1, MyStr2)    ' 返回 -1
  MyComp4 = StrComp(MyStr2, MyStr1)    '返回1
  MsgBox "StrComp(MyStr1, MyStr2, 1)的結果為:" & MyComp1
  MsgBox "StrComp(MyStr1, MyStr2, 0)的結果為:" & MyComp2
  MsgBox "StrComp(MyStr1, MyStr2)的結果為:" & MyComp3
  MsgBox "StrComp(MyStr2, MyStr1)的結果為:" & MyComp4
End Sub
示例說明:如果StrComp函式的第三個引數值為1,則以文字比較的方式進行字串比較;如果第三個引數值為0或忽略該引數,則以二進位制比較的方式進行字串比較。注意,文字比較的方式不區分字母大小寫,而二進位制比較方式則區分大小寫。
[程式設計方法和技巧] 完成一次簡單的單一比較,如
If UCase(sString1)<UCase(sString2) Then
比使用StrComp函式:
If StrComp(sString1,sString2,vbTextCompare)=-1 Then
在效能上要提高30%,且更容易閱讀和理解。

2.2 轉換字串
2.2.1 StrConv函式
使用StrConv函式來按指定型別轉換字串。其語法為:
    StrConv(string,conversion,LCID)
其中,引數string為要轉換的字串,引數conversion為指定轉換的型別,引數LCID為可選引數。
如果將引數conversion設定為vbUpperCase或1,則將字串轉換成大寫;設定為vbLowerCase或2,則將字串轉換成小寫;設定為vbProperCase或3,則將字串中每個字的開頭字母轉換成大寫;設定為vbUnicode或64,則根據系統的預設碼頁將字串轉換成Unicode;設定為vbFromUnicode或128,則將字串由Unicode轉換成系統的預設碼頁。
在將ANSI格式的Byte陣列轉換成字串時,應使用StrConv函式;轉換Unicode格式的陣列時,使用賦值語句。下面的例子使用StrConv函式將Unicode字串轉換成ANSI字串:
Sub testConverseString()
  Dim i As Long
  Dim x() As Byte
  x = StrConv("ABCDEFG", vbFromUnicode)    ' 轉換字串。
  For i = 0 To UBound(x)
    Debug.Print x(i)
  Next
End Sub
下面的例子將句子中每個詞語的首字母轉換為大寫:
Sub testConverseString2()
  Debug.Print StrConv("my book is this book.", vbProperCase)
End Sub
程式執行後,在VBE視窗中的立即視窗中將會看到上述結果。
下面的示例演示瞭如何把一個字串轉換為位元組陣列,以便使用在API函式呼叫中:
Sub Test()
  Dim byArray() As Byte
  Dim sString As String
  sString = "Some stuff"
  byArray = StrConv(sString, vbFromUnicode)
End Sub
StrConv函式將下面的字元看成是字的分隔符:
Null:Chr$(0)
水平製表符:Chr$(9)
換行符:Chr$(10)
垂直製表符:Chr$(11)
換頁符:Chr$(12)
回車符:Chr$(13)
空格:Chr$(32)
[程式設計方法和技巧] 在使用API時該函式很重要,很多程式呼叫都要求傳遞給它們Unicode字元,或者賦給返回變數Unicode字元。
2.2.2 Str函式
將數值轉換成字串,即返回代表一個數值的字串。其語法為:
    Str(number)
當一個數字轉成字串時,總會在前面保留一個空位來表示正負,即字串的第一位一定是空格或正負號。如果引數number為正,返回的字串前面包含一空格。Str函式將句點(.)作為有效的小數點。示例如下:
  MyString = Str(459)    ' 返回 " 459"
  MyString = Str(-459.65)   ' 返回 "-459.65"
  MyString = Str(459.001)    ' 返回 " 459.001"
[程式設計方法和技巧] 使用LTrim函式可刪除Str函式在返回的字串開頭新增的前導空格。此外,CStr函式和Format函式已經取代了Str函式,CStr函式不用為正數的符號而新增前導空格,Format函式能夠用來識別小數點。
2.2.3 CStr函式
CStr將數值表示式轉換成String資料型別。示例如下:
MyDouble = 437.324   ' MyDouble 為 Double 型別
MyString = CStr(MyDouble)    ' MyString 的內容為"437.324"
[程式設計方法和技巧] 傳遞給CStr的未初始化的數字資料型別返回“0”,傳遞給CStr的未初始化的日期變數返回“0:00:00”。

2.3 建立字串
2.3.1 Space函式
該函式返回指定數的空格的字串。語法為:
    Space(number)
其中,引數number必須,為字串中指定的空格數。
如下例所示:
Sub CreateString1()
  Dim MyString
' 返回 10 個空格的字串。
  MyString = Space(10)
  ' 將 10 個空格插入兩個字串中間。
  MyString = "Hello" & Space(10) & "World"
End Sub
該函式可用於在呼叫外部DLL時建立字串緩衝區,特別是在呼叫Window API時。此外,使用該函式還可以使字串在特定長度的緩衝區左對齊或右對齊。
注意,如果引數number是負數,則會產生執行時錯誤5:“無效的過程呼叫或引數”。
[程式設計方法和技巧] 可以使用Space函式新增和清除儲存在定長字串中的資料,例如,下面的程式碼用空格填充一個定長字串:
Dim strFixed As String * 32
……
strFixed = Space(Len(strFixed))
2.3.2 String函式
該函式返回重複的字元或字串。其語法為:
    String(number,character)
其中,引數number必須,指定所返回的字串的長度;引數character必須,指定字元的字元程式碼或字串表示式。
例如,下面使用String函式生成指定長度且只含單一字元的字串。
Sub CreateString2()
  Dim MyString
  MyString = String(5, "*")    ' 返回 "*****"
  MyString = String(5, 42)    ' 返回 "*****"
  MyString = String(10, "ABC")    ' 返回 "AAAAAAAAAA"
End Sub
如果引數number包含Null,則返回Null;如果引數character包含Null,則返回Null;引數character可以指定為字串或者是ANSI字元程式碼,如:
strString1=String(128,”=”) ‘用”=”填充
strString2=String(128,0) ‘用Chr$(0)填充
[程式設計方法和技巧] 
(1) String函式在用於建立較長的“_”,“-”,或者“=”構成的水平線以便給報表分段時十分有用。
(2) 當呼叫API函式向緩衝區寫入字串值時,首先要用String函式建立一個長度合適的字串變數,並且用諸如Chr$(0)之類的單個字元來填充。

2.4 獲取字串的長度
可以使用Len函式來確定任何字串或字串表示式的長度,其語法為:
    Len(string|varname)
其中,引數string為任何有效的字串表示式;引數varname為任何有效的變數名稱。兩個引數必須取一。
利用LenB函式可以確定儲存某變數所需的實際位元組數。
下面的示例使用Len函式來獲取某字串的長度(字元數)或某變數的大小(位數)。
Type CustomerRecord    ' 定義使用者自定義的資料型別
    ID As Integer   ' 將此定義放在常規模組中
    Name As String * 10
    Address As String * 30
End Type
Sub GetStrLen()
  Dim Customer As CustomerRecord    ' 宣告變數
  Dim MyInt As Integer, MyCur As Currency
  Dim MyString, MyLen
  MyString = "Hello World"    ' 設定變數初值
  MyLen = Len(MyInt)    ' 返回 2
  MyLen = Len(Customer)    ' 返回 42
  MyLen = Len(MyString)    ' 返回 11
  MyLen = Len(MyCur)    ' 返回 8
End Sub
此外,在需要大量判斷是否為空字串的程式碼中,使用Len函式也可以加快程式碼執行的速度。例如:
If strTemp = "" Then
  '要執行的程式碼
End If
上面的程式碼可以用以下程式碼代替:
If Len(strTemp) = 0 Then
  '要執行的程式碼
End If
注意:
(1) 引數string和引數varname互不相容,即只能指定這兩個引數中的某一個,不能同時指定這兩個引數。
(2) 如果引數string或引數varname中包含Null,則Len函式會返回Null。
(3) 在向檔案寫入某種使用者自定義型別資料時,Len函式會返回資料的大小(字元數)。
(4) LenB函式返回使用者自定義型別資料實際佔用的記憶體大小。
(5) 在對位元組資料或Unicode字串使用LenB函式時,LenB函式返回表示資料或字串的位元組數。
(6) 不能對物件變數使用Len函式。
(7) 如果引數varname是一個數組,則必須指定一個有效的下標,即Len函式不能確定陣列中元素的總數或陣列佔用記憶體的大小。
(8) Len函式對Variant型別變數的處理和字串變數一樣,Len函式返回變數所儲存的實際字元數,如下面的程式碼:
Dim vVar
vVar=100
MsgBox Len(vVar)
結果為3。
(9) 由於VB本質上使用的是Unicode字串(用兩個位元組的空間來儲存一個字元),因此當相同的字串變數傳遞給Len函式和LenB函式時會出現不同的返回值。例如,對於一個包含4個字元的字串,使用Len函式時返回值為4,使用LenB函式則為8。
(10) 使用強型別變數(即強制宣告該變數的型別)時,Len函式會返回儲存該變數所需的位元組數。例如,長整型變數的長度為4。
下面的示例說明了為什麼要顯式宣告資料型別:
Sub test()
  Dim lVar As Long
  Dim vVar
  lVar = 10000000
  vVar = 10000000
  MsgBox LenB(lVar) '返回4
  MsgBox LenB(vVar)'返回16
End Sub

很顯然,Variant型別變數比強制宣告的型別變數要佔用更多的記憶體。

2.5 格式化字串
可以使用Format函式規定輸出的字串的格式,其語法為:
    Format(expression[,format[,firstdayofweek[,firstweekofyear]]])
其中,引數expression必須,為任何有效的表示式;其餘引數均可選。引數format表示所要採用的格式,引數firstdayofweek使用常數,表示一星期的第一天,引數firstweekofyear使用常數,表示一年的第一週。
在引數format中,使用字元“@”,表示空格或字元佔位符,如果在輸入的字串相應位置有字元,則顯示該字元,否則顯示空格;使用字元“&”,表示空或字元佔位符,如果在輸入的字串的相應位置有字元,則顯示該字元,否則不顯示;使用字元“<”,則將所有字元顯示為小寫格式;使用字元“>”,則將所有字元顯示為大寫格式;使用字元“!”,強制佔位符從左向右填滿, 滿足預設為從右向左。
例如下面的程式碼:
Dim strOut
  strOut = Format("8888888", "(@@@)&&&-&&&&") '返回(   )888-8888
  strOut = Format("8888888", "(&&&)&&&-&&&&") '返回()888-8888
在Format函式中,還可以同時格式化普通字串和空字串,只須在指定的格式中用分號隔開兩個部分,第一部分用於非空字串,第二部分用於空字串。例如:
strOut = Format("6666666", "(@@@)&&&-&&&&;No Phone") '返回(   )666-6666
strOut = Format("", "(@@@)&&&-&&&&;No Phone") '返回No Phone
又如,下面的程式碼將字母全部轉換為大寫:
Dim strOut
strOut = Format("Hello", ">@@@@@") ‘返回HELLO
同理,可以使用“<”將字母全部轉換為小寫。
Format函式的簡要使用規則:
(1) 允許用預先定義或使用者定義的格式來建立多種用於輸出字串、數字和日期/時間資料的方法。
(2) 建立使用者定義的數值格式最多可以有四個部分,每個部分代表一種不同型別的數值,且用分號分隔。第一部分在單獨命名使用時可用於所有值,與其它多個部分一起使用時只用於正數;第二部分用於負數;第三部分用於零值;第四部分用於Null值。
在引數format中不必包括所有四部分,但所用部分的數目決定了每一個部分所定義的數值型別:只有一個部分,則應用於所有數值;有兩個部分,則第一部分應用於正數和零值,第二部分應用於負數;有三個部分,則第一部分用於正數,第二部分應用於負數,第三部分應用於零值;有四個部分,則每部分的使用如前所述。
如果忽略了一個部分,則該部分使用與定義正數的部分一樣的格式,例如:
“#.00;;#,##”
表示負數值與正數值使用同一種格式顯示。
如果引數含有命名格式,則只能有一個部分。
(3) 字串值的使用者定義格式有兩個部分,第一部分可應用於所有值,第二部分只應用於Null值或零長字串。
(4) 預定義的日期和時間格式如下:
General Date
範例: Format("28/02/2007","General Date")
返回: 2007-2-28
Long Date
範例: Format("28/02/2007","Long Date")
返回: 2007年2月28日

E - String of CCPC (字串處理)(str.substr()的運用)

滴答滴答---題目連結  BaoBao has just found a string  of length  consisting of 'C' and 'P' in his pocket. As a big fan of the China

04: 字串處理 擴充套件的指令碼技巧 正則表示式

Top NSD SHELL DAY04 案例1:字串擷取及切割 案例2:字串初值的處理 案例3:expect預期互動 案例4:使用正則表示式 1 案例1:字串擷取及切割 1.1 問題 使用Shell完成各種Linux運維任務時,一旦涉及到判斷、條

字元和字串處理(2)

2.5 安全字串函式 不安全的字串函式 Strsafe函式 Safe CRT函式 (C執行庫) strcpy, wcscpy, _tcscpy, _mbscpy, strcpy , lstrcpy, _tccpy

字元和字串處理(1)

2.1 字符集及字元編碼(字符集——字元的集合,不同的字符集,收錄的字元可能不同) 2.1.1多位元組字符集及ANSI編碼標準 (1)單位元組編碼:ASCII字符集及擴充套件——滿足英語及西歐語言的需要 (2)雙位元組編碼:——滿足亞洲等國家語言文字的需要,如:

1001 A+B Format - 字串處理

思路:用stringstream把int轉換為string 程式碼如下: #include<iostream> #include<cstdio> #include<algorithm> #include<string> #include<

EL表示式整數被當作字串處理

 通過把web.xml內容 <web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:s

python3字串處理,高效切片

高階技巧:切片,迭代,列表,生成器 切片 L = ['Hello', 'World', '!'] print("-------1.一個一個取-------") print(L[0]) print(L[1]) print(L[2]) print("-------2.開闢一個

(C/C++學習)14.C語言字串處理函式(二)

說明:上節著重解釋了字串處理的庫函式處理,這節將針對一些常用的需求,進行非庫函式的處理。 一.去除某一個字串中的某個字元 1.去除字串右邊的空格 1 void trimStrRightSpace(char * str) 2 { 3 while(*str) 4 s