VBA字符串函數

Trim(string)            去掉string左右兩端空白
Ltrim(string)          
去掉string左端空白

Rtrim(string)          
去掉string右端空白

Len(string)            
計算string長度

Left(string, x)         
string左段x個字符組成的字符串

Right(string, x)       
string右段x個字符組成的字符串

Mid(string, start,x)   
stringstart位開始的x個字符組成的字符串

Ucase(string)          
轉換爲大寫

Lcase(string)          
轉換爲小寫

Space(x)                 
返回x個空白的字符串

Asc(string)              
返回一個 integer,代表字符串中首字母的字符代碼

Chr(charcode)          
返回 string,其中包含有與指定的字符代碼相關的字符

 

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])
其中,參數string1strng2爲必需的參數,可以是任何有效的字符串表達式。
參數Compare爲可選參數,如果該參數爲Null,將發生錯誤。如果參數Compare設置爲常數vbUseCompareOption-1或忽略該參數,將使用Option Compare語句設置進行比較;如果忽略該參數且沒有設置Option Compare語句,則按二進制進行比較;如果參數Compare設置爲常數vbBinaryCompare0,則用二進制進行比較;如果參數Compare設置爲常數vbTextCompare1,則按文本進行比較;如果參數Compare設置爲常數vbDatabaseCompare2,此時僅適用於Microsoft Access,進行基於數據庫信息的比較。
StrComp函數的返回值爲:如果String1<String2,則返回值爲-1;如果String1=String2,則返回值爲0;如果String1>String2,則返回值爲1;如果String1String2Null,則返回值爲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)    &apos;
返回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設置爲vbUpperCase1,則將字符串轉換成大寫;設置爲vbLowerCase2,則將字符串轉換成小寫;設置爲vbProperCase3,則將字符串中每個字的開頭字母轉換成大寫;設置爲vbUnicode64,則根據系統的缺省碼頁將字符串轉換成Unicode;設置爲vbFromUnicode128,則將字符串由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
  &apos;
要執行的代碼

End If
上面的代碼可以用以下代碼代替:
If Len(strTemp) = 0 Then
  &apos;
要執行的代碼
End If
注意:
(1) 參數string和參數varname互不相容,即只能指定這兩個參數中的某一個,不能同時指定這兩個參數。
(2) 如果參數string或參數varname中包含Null,則Len函數會返回Null
(3) 在向文件寫入某種用戶自定義類型數據時,Len函數會返回數據的大小(字符數)
(4) Len函數返回用戶自定義類型數據實際佔用的內存大小。
(5) 在對字節數據或Unicode字符串使用Len函數時,Len函數返回表示數據或字符串的字節數。
(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", "(@@@)&&&-&&&&") &apos;
返回(   )888-8888
  strOut = Format("8888888", "(&&&)&&&-&&&&") &apos;
返回()888-8888
Format函數中,還可以同時格式化普通字符串和空字符串,只須在指定的格式中用分號隔開兩個部分,第一部分用於非空字符串,第二部分用於空字符串。例如:
strOut = Format("6666666", "(@@@)&&&-&&&&;No Phone") &apos;
返回(   )666-6666
strOut = Format("", "(@@@)&&&-&&&&;No Phone") &apos;
返回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")
返回: 2007228
Medium Date
範例:
Format("28/02/2007","Medium Date")
返回:
07-02-28
Short Date
範例:
Format("28/02/2007","Short Date")
返回:
2007-2-28
Long Time
範例:
Format("17:30:03","Long Time")
返回:
17:30:03
Medium Time
範例:
Format("17:30:03","Medium Time")
返回: 下午
05:30
Short Time
範例:
Format("17:30:03","Short Time")
返回:
17:30
(5)
預定義的數值格式如下:
General Number
範例:
Format(123456.0789,"General Number")
返回:
123456.0789
Currency
範例:
Format(123456.0789,"Currency")
返回:
123,456.08
Fixed
範例:
Format(0.2,"Fixed")
返回:
0.20
Standard
範例:
Format(123456.0789,"Standard")
返回:
123,456.08
Percent
範例:
Format(.7321,"Percent")
返回:
73.21%
Scientific
範例:
Format(123456.0789,"Scientific")
返回:
1.23E+05
Yes/No
範例1
Format(0,"Yes/No")
返回:
  No
範例2
Format(23,"Yes/No")
返回:
  Yes
True/False
範例1
Format(0,"True/False")
返回:
  False
範例2
Format(23,"True/False")
返回:
  True
On/Off
範例1
Format(0,"On/Off")
返回:
  Off
範例2
Format(23,"On/Off")
返回:
On
(6)
創建用戶自定義的日期和時間格式的字符:
C
元素:日期
顯示:基於當前Windows系統的短日期和短時間國際設置格式的日期或時間。
範例:
Format("28/02/2007 17:30:03","c")
返回:
2007-2-28 17:30:03
dddddd
元素:日期
顯示:基於當前Windows系統的長日期國際設置格式的完整日期。
範例:
Format("28/02/2007","dddddd")
返回:2007228
/
元素:日期分隔符

範例:Format("28/02/2007","mm-dd-yyyy")
返回:
02-28-2007
d
元素:日
顯示:131範圍內的一個數字,無前導0
範例:
Format("02/02/2007","d")
返回:
2
dd
元素:日
顯示:0131範圍內的一個數字,有前導0
範例:
Format("02/02/2007","dd")
返回:
02
ddd
元素:日
顯示:英文簡寫(Sun
Sat)
範例:
Format("02/02/2007","ddd")
返回:
Fri
dddd
元素:日
顯示:英文全稱(Sunday
Saturday)
範例:
Format("02/02/2007","dddd")
返回:
Friday
ddddd
元素:日期
顯示:基於計算機Windows國際設置短日期格式的日期。
範例:
Format("02/02/2007","ddddd")
返回:
2007-2-2
h
元素:小時
顯示:023範圍內的一個數字,無前導0
範例:
Format("05:08:06","h")
返回:
5
hh
元素:小時
顯示:0023範圍內的一個數字,有前導0
範例:
Format("05:08:06","hh")
返回:
05
n
元素:分
顯示:059範圍內的一個數字,無前導0
範例:
Format("05:08:06","n")
返回:
8
nn
元素:分
顯示:0059範圍內的一個數字,有前導0
範例:
Format("05:08:06","nn")
返回:
08
s
元素:秒
顯示:059範圍內的一個數字,無前導0
範例:
Format("05:08:06","s")
返回:
6
ss
元素:秒
顯示:0059範圍內的一個數字,有前導0
範例:
Format("05:08:06","ss")
返回:
06
ttttt
元素:時間
顯示:基於12小時制的時間,包含Windows區域設置中指定的時間分隔符和前導0
範例:
Format("05:08:06","ttttt")
返回:
5:08:06
AM/PM
元素:時間
顯示:用大寫的AMPM表示的12小時制的時鐘格式。
範例:
Format("17:08:06","hh:mm:ss AM/PM")
返回:
05:08:06 PM
am/pm
元素:時間
顯示:用小寫的ampm表示的12小時制時鐘格式。
範例:
Format("17:08:06","hh:mm:ss am/pm")
返回:
05:08:06 pm
A/P
元素:時間
顯示:12小時制時鐘格式,用大寫“A”表示AM,大寫“P”表示PM
範例:
Format("17:08:06","hh:mm:ss A/P")
返回:
05:08:06 P
a/p
元素:時間
顯示:12小時制時鐘格式,用小寫“a”表示am,小寫“p”表示pm
範例:
Format("17:08:06","hh:mm:ss a/p")
返回:
05:08:06 p

元素:時間分隔符

顯示:時間格式
範例:Format("17:08:06","hh:mm:ss")
返回:
17:08:06
w
元素:星期幾
顯示:17範圍內的一個數字(17分別表示星期天到星期六)
範例:
Format("02/02/2007","w")
返回:
6
ww
元素:周
顯示:154範圍內的一個數字。
範例:
Format("02/02/2007","ww")
返回:
5
m
元素:月
顯示:112範圍內的一個數字,無前導0
範例:
Format("02/02/2007","m")
返回:
2
mm
元素:月
顯示:0112範圍內的一個數字,有前導0
範例:
Format("02/02/2007","mm")
返回:
02
mmm
元素:月
顯示:英文月份簡寫(Jan
Dec)
範例:
Format("02/02/2007","mmm")
返回:
Feb
mmmm
元素:月
顯示:英文月份全稱(January
December)
範例:
Format("02/02/2007","mmmm")
返回:
February
q
元素:季度
顯示:14範圍內的一個數字
範例:
Format("02/02/2007","q")
返回:
1
y
元素:一年中的某天
顯示:1366範圍內的一個數字。
範例:
Format("02/02/2007","y")
返回:
33
yy
元素:年
顯示:0099範圍內的一個兩位數字。
範例:
Format("02/02/2007","yy")
返回:
07
yyyy
元素:年
顯示:1009999範圍內的一個四位數字。
範例:
Format("02/02/2007","yyyy")
返回:
2007
(7)
用於創建用戶自定義數字格式的字符
0
說明:數字佔位符。如果參數expression所代表的數值在相應的0位置上有一個數字,則顯示這個數字,否則顯示0。所指定的小數點後的位數,使數值舍入爲給定的小數位數,但不影響小數點左邊的數字位數。
範例1Format(23.675,"00.0000")  返回:
23.6750
範例2Format(23.675,"00.00")  返回:
23.68
範例3Format(2345,"00000")  返回:
02345
範例4Format(2345,"00.00")  返回:
2345.00
#
說明:數字佔位符。如果參數expression所代表的數值在相應的#位置上有一個數字,則顯示這個數字,否則什麼也不顯示。
範例1Format(23.675,"##.##")  返回:
23.68
範例2Format(23.675,"##.####")  返回:
23.675
範例3Format(12345.25,"#,###.##")  返回:
12,345.25
.
說明:小數點佔位符。小數點佔位符實際顯示的字符由本機Windows系統國際設置格式決定。
%
說明:百分數佔位符。首先將參數expression所代表的數值乘以100,然後把它作爲百分數顯示。
範例:Format(0.25,"##.00%") 返回:
25.00%

說明:千位分隔符。實際顯示的字符由本機Windows系統國際設置格式決定。在格式定義中只需要給出一個千位分隔符。
範例:Format(1000000,"#,###")  返回:
1,000,000
E-E+ e-e+
說明:科學計數法格式。如果格式表達式在E-E+e-e+的右邊至少有一個數字佔位符(0#),數字就以科學計數法格式顯示數字,參數Format中所用的字母Ee在該數字和它的指數之間顯示。右邊的數字佔位符數目決定了要在指數中顯示的位數。使用E-e-可以在負指數前插入一個減號,使用E+e+可以在正指數前插入一個正號。
範例:Format(1.09837555,"######E-###")  返回:
109838E-5
-+$
說明:顯示一個直接量字符。
範例:Format(2345.25,"$#,###.##")  返回:
$2,345.25
/
說明:反斜槓後的字符以直接量字符顯示。可以用反斜槓將某個特定格式的字符以直接量字符顯示。
範例:Format(0.25,"##.##/%")  返回:
.25%
(8)
用於創建用戶自定義字符串格式的字符
@
說明:字符佔位符。如果expression在相應的@位置上有一個字符,就顯示這個字符,否則顯示一個空格。
範例:Format("VBA","/*@/*@@@@@")  返回:
* *  VBA
&
說明:字符佔位符。如果expression在相應的&位置上有一個字符,就顯示這個字符,否則什麼也不顯示。
範例:Format("VBA","/*&&/*&&&&")  返回:
**VBA
<
說明:用小寫形式顯示所有字符。
範例:Format("VBA","<")  返回:
vba
>
說明:用大寫形式顯示所有字符。
範例:Format("vba",">")  返回:
VBA

說明:從左向右處理佔位符(缺省情況爲從右向左處理佔位符)
[
編程方法和技巧]
(1)
使用沒有格式定義的Format函數格式化數字比使用Str函數格式化數字更好。Format函數與Str函數不同,它會把正數中一般保留用於表示符號的前導空格清除掉。
(2)
可以使用Format函數以1000爲單位對數字進行標度,做法是在語句中小數點的左邊用一個千位分隔符()
表示標度數字的一個千位;可以使用多個千位分隔符。例如:
Format(1000000,"##0,.")
返回:1000.
Format(1000000,"##0,,.") 
返回:1.

2.6
查找字符串
2.6.1 InStr
函數
可使用InStr函數返回一字符串在另一字符串中的位置,因此,也可以使用該函數確定一個字符串中是否包含有另一個字符串。其語法爲:
    InStr([Start,]string1,string2[,compare])
其中,參數Start爲可選參數,設置查找的起點,如果省略,則從第一個字符的位置開始查找,當指定了參數Compare時,則要指定此參數。參數string1爲被查找的字符串,參數string2爲要查找的字符串,這兩個參數都是必需的。
如果在String1中沒有找到String2,返回0;如果找到String2,則返回String2第一個出現的首字符位置(1String1的長度);如果String2的長度爲零,返回Start
可看看下面的示例:

Sub test()
  Dim SearchString, SearchChar, MyPos
  SearchString = "XXpXXpXXPXXP"   &apos;
被搜索的字符串
  SearchChar = "P"   &apos;
要查找字符串 "P"
 &apos;
從第四個字符開始,以文本比較的方式找起,返回值爲 6(小寫 p)
  &apos;
小寫 p 和大寫 P 在文本比較下是一樣的
  MyPos = InStr(4, SearchString, SearchChar, 1)
  Debug.Print MyPos
  &apos;
從第一個字符開使,以二進制比較的方式找起,返回值爲 9(大寫 P)
  &apos;
小寫 p 和大寫 P 在二進制比較下是不一樣的
  MyPos = InStr(1, SearchString, SearchChar, 0)
  Debug.Print MyPos
  &apos;
缺省的比對方式爲二進制比較(最後一個參數可省略)
  MyPos = InStr(SearchString, SearchChar)    &apos;
返回 9
  Debug.Print MyPos
  MyPos = InStr(1, SearchString, "W")   &apos;
返回 0
  Debug.Print MyPos
End Sub
2.6.2 InStrRev
函數
也可以使用InStrRev函數返回一個字符串在另一個字符串中出現的位置,與InStr函數不同的是,從字符串的末尾算起。其語法爲:
    InStrRev(String1,String2[,[Start[,compare])
參數String1爲被查找的字符串,參數String2爲要查找的字符串,這兩個參數都是必需的。參數Start爲可選參數,設置每次查找開始的位置,若忽略則使用-1,表示從上一個字符位置開始查找。參數Compare爲可選參數,表示所使用的比較方法,如果忽略則執行二進制比較。
下面的示例使用了InStr函數和InStrRev函數,相應的結果不同:
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) &apos;
返回8
  Debug.Print InStrRev(myString, sSearch) &apos;
返回26
End Sub

- - - - - - - - - - - - - - - - - - - - - - -
2.7 提取字符/
字符串
2.7.1 Left
函數

Left
函數可以從字符串的左邊開始提取字符或指定長度的字符串,即返回包含字符串中從左邊算起指定數量的字符。其語法爲:
    Left(String,CharNum)
其中,如果參數String包含Null,則返回Null;如果參數CharNum的值大於或等於String的字符數,則返回整個字符串。
例如,下面的代碼返回指定字符串的前兩個字符:

strLeft=Left(“This is a pig.”
2)
Left函數與InStr函數結合,返回指定字符串的第一個詞,例如下面的代碼:
str = "This is a pig."
FirstWord = Left(str, InStr(str, " ") - 1)

2.7.2 Right
函數
Left函數不同的是,Right函數從字符串的右邊開始提取字符或指定長度的字符串,即返回包含字符串中從右邊起指定數量的字符。其語法爲:
    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

下面的函數假設傳遞給它的參數或者是文件名,或者是包含完整路徑的文件名,從字符串的末尾開始返回文件名。

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
函數
Mid
函數可以從字符串中提取任何指定的子字符串,返回包含字符串中指定數量的字符的字符串。其語法爲:
    Mid(String,Start[,Len])
其中,如果參數String包含Null,則返回Null;如果參數Start超過了String的字符數,則返回零長度字符串(“”);如果參數Len省略或超過了文本的字符數,則返回字符串從Start到最後的所有字符。
例如,下面的代碼:
Str=Mid(“This is a pig.”,6,2)
將返回文本“is”
下面的代碼:

MyString = "Mid Function Demo"   &apos;
建立一個字符串
FirstWord = Mid(MyString, 1, 3)   &apos;
返回 "Mid"
LastWord = Mid(MyString, 14, 4)    &apos;
返回 "Demo"
MidWords = Mid(MyString, 5)   &apos;
返回 "Funcion Demo"
Mid函數常用於在字符串中循環,例如,下面的代碼將逐個輸出字符:
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
語句可以用另一個字符串中的字符替換某字符串中指定數量的字符。其語法爲:
    Mid(Stringvar,Start[,Len])=string
其中,參數Stringvar代表爲要被更改的字符串;參數Start表示被替換的字符開頭位置;參數Len表示被替換的字符數,若省略則全部使用string;參數string表示進行替換的字符串。
被替換的字符數量總小於或等於Stringvar的字符數;如果string的數量大於Len所指定的數量,則只取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
函數刪除字符串前面的空格;
RTrim
函數刪除字符串後面的空格;
Trim
函數刪除兩頭的空格。
示例如下:
MyString = "  <-Trim->  "    ;
設置字符串初值
TrimString = LTrim(MyString)    ;TrimString = "<-Trim->  "
TrimString = RTrim(MyString)   ;TrimString = "  <-Trim->"
TrimString = LTrim(RTrim(MyString))    ;TrimString = "<-Trim->"

;
只使用 Trim 函數也同樣將兩頭空格去除
TrimString = Trim(MyString)   ;TrimString = "<-Trim->"
- - - - - - - - - - - - - - - - - - - - - - -
2.9
返回字符代碼

Asc
函數返回指定字符串表達式中第一個字符的字符代碼。示例如下:
MyNumber = Asc("A")   ;
返回 65
MyNumber = Asc("a")    ;
返回 97
MyNumber = Asc("Apple")   ;
返回 65
[
編程方法和技巧]
(1)
在數據驗證中用Asc來決定一些條件,如第一個字符是大寫還是小寫、是字母還是數字。
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函數和Chr函數來創建基本加密的方法。
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
返回數值代表的相應字符
Chr函數返回指定字符碼所代表的字符,其語法爲:
    Chr(charcode)
其中參數charcode代表字符碼,一般爲0255。例如:
MyChar = Chr(65)  ;
返回 A
MyChar = Chr(97)   ;
返回 a
MyChar = Chr(62)  ;
返回 >
MyChar = Chr(37)  ;
返回 %
[
編程方法和技巧]
(1)
使用Chr(34)將引號嵌入字符串,如
Chr(34) & sString & Chr(34)
(2)
下面列出了在調用Chr函數時比較常用的字符代碼:
代碼     
描述
0   Null  
相當於vbNullChar
常數
8   BS  
相當於vbBack
常數
9   TAB  
相當於vbTab
常數
10   CR  
相當於vbCrvbCrLf
常數
13   LF  
相當於vbLfvbCrLf
常數
34   “”  
引號

- - - - - - - - - - - - - - - - - - - - - - -
2.11
使用字節的函數
VBA中返回字符串的函數有兩種格式,一種以$結尾,返回字符串,不需要進行類型轉換,所以速度較快,但如果輸入值是包含NullViarant,則會發生運行錯誤;一種沒有$,返回Viarant數據類型,如果輸入值是包含NullViarant,則返回Null。因而,如果要使得程序運行速度快,則使用帶有$的函數且要避免向這些函數傳遞空值。
- - - - - - - - - - - - - - - - - - - - - - -
2.12
返回數組的函數

2.12.1 Filter
函數
Filter
函數返回一個下標從零開始的數組,該數組包含基於指定篩選條件的一個字符串數組的子集。其語法爲:
    Filter(sourcearray,match[,include[,compare]])
其中,參數sourcearray必需,是要執行搜索的一維字符串數組;參數match必需,是要搜索的字符串;參數include可選,Boolean值,表示返回子串包含還是不包含match字符串,如果includeTrue,返回包含match子字符串的數組子集,如果includeFalse,返回不包含match子字符串的數組子集;參數compare可選,表示所使用的字符串比較類型,其設置值爲:-1(常數爲vbUseCompareOption)表示使用Option Compare語句的設置值來執行比較;0(常數爲vbBinaryCompare)表示執行二進制比較;1(常數爲vbTextCompare)表示執行文字比較;2(常數爲vbDatabaseCompare)只用於Microsoft Access,表示基於數據庫信息來執行比較。
如果在sourcearray中沒有發現與match相匹配的值,Filter函數返回一個空數組;如果sourcearrayNull或不是一個一維數組,則產生錯誤。
Filter函數所返回的數組,其元素數是所找到的匹配項目數。

[
編程方法和技巧]
(1) Filter
函數也可以過濾數字值。此時,應指定Variant類型的字符串sourcearray,並用數字值給數組賦值。同時,也可以將字符串、VariantLongInteger數據傳遞給match。但應注意,返回的字符串表現爲被過濾數字的字符串的形式。例如:
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
將返回20212232
(2) Filter
函數可以和Dictionary對象很好地配合使用。可以把Dictionary對象產生的Key值作爲一種過濾Dictionary對象成員的快速方法傳遞給Filter函數,如:
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
  &apos;
尋找包含字符串macro(不區分大小寫)的所有鍵
  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
函數
Split
函數返回一個下標從零開始的一維數組,包含指定數目的子字符串。其語法爲:
    Split(expression[,delimiter[,limit[,compare]]])
其中,參數expression必需,表示包含子字符串和分隔符的字符串,若expression是一個長度爲零的字符串(“”),該函數則返回一個沒有元素和數據的空數組;參數delimiter用於標識子字符串邊界的字符串字符,若忽略則使用空格(“ “)作爲分隔符,若是一個長度爲零的字符串則返回僅包含一個元素的數組,該元素是expression所表示的字符串;參數limit表示要返回的子字符串數,-1表示返回所有的子字符串;參數compare表示判別子字符串時使用的比較方式,其值與Filter函數的設置值相同。
- - - - - - - - - - - - - - - - - - - - - - -
2.13 連接字符串

Join
函數返回連接某數組中的多個子字符串而組成的字符串,即將數組中的字符串連接起來。其語法爲:
    Join(sourcearray[
delimiter])
其中,參數sourcearray必需,是包含被連接子字符串的一維數組;參數delimiter可選,代表在所返回的字符串中用於分隔子字符串的字符,若忽略則使用空(“ ”)來分隔,若爲零長字符串(“”),則所有項目都連接在一起,中間沒有分隔符。
- - - - - - - - - - - - - - - - - - - - - - -
2.14 替換字符串

Replace
函數返回一個被替換了的字符串,該字符串中指定的子字符串已被替換成另一個子字符串,並且替換指定次數。其語法爲:
    Replace(expression,find,replace[,start[,count[,compare]]])
其中,參數expression必需,表示所要替換的子字符串;參數find必需,表示要搜索到的子字符串;參數replace必需,表示用來替換的子字符串;參數start表示開始搜索的位置,若忽略,則從1開始;參數count表示進行替換的次數,缺省值是-1,表示進行所有可能的替換;參數compare表示判別子字符串時所用的比較方式,與Filter函數的設置值相同。
如果expression的長度爲零,Replace返回零長度字符串(“”);如果expressionNull,則返回錯誤;如果find的長度爲零,則返回expression的副本;如果replace的長度爲零,則返回刪除了所有出現find的字符串的副本;如果start的值大於expression的長度,則返回長度爲零的字符串;如果count0,則返回expression的副本。
Replace函數返回的字符串是從參數start所指定的位置開始到expression結尾已經進行過替換的字符串。
注意:
(1) 如果沒有使用參數count,那麼當替換較短字符串時就要注意,防止形成一個不相關的字符。
(2) 如果start值大於1,返回的字符串將從start開始,而不是從原有字符串的第一個字符開始。
- - - - - - - - - - - - - - - - - - - - - - -
2.15 反向字符串

StrReverse
函數返回與指定字符串順序相反的字符串,其語法爲:
    StrReverse(expression)
其中,參數expression是一個字符串,應用StrReverse函數後將返回與該字符串順序相反的字符串。如果expression是一個長度爲零的字符串(“”),則返回一個長度爲零的字符串;如果expressionNull,則產生一個錯誤。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章