Array函數(shù)
Array函數(shù)是一種使用值創(chuàng)建和填充數(shù)組的方法。將所有的值作為參數(shù)傳遞給該函數(shù),返回一個使用這些值作為元素的一維數(shù)組,數(shù)組值的順序和傳遞給函數(shù)的數(shù)值的順序相同。第一個元素的索引值總是0,不依賴任何Option Base設置。
Sub TestArray()Dim myArray() As Variant '從逗號分隔的字符串列表中創(chuàng)建數(shù)組 myArray = Array("One", "Two", "Three")'顯示數(shù)組元素 MsgBox myArray(0) & vbCr & myArray(1) & vbCr & myArray(2)'也可以使用數(shù)值作為參數(shù) myArray = Array(10, 20, 30)'顯示數(shù)組元素 MsgBox myArray(0) & vbCr & myArray(1) & vbCr & myArray(2)End Sub
Array函數(shù)總是返回Variant類型的數(shù)組,但元素的數(shù)據(jù)類型可以不同,取決于傳遞給該函數(shù)的數(shù)值的類型。
例如,Array(“One”, 2, 3.4)返回的數(shù)組,第一個元素是String類型,第二個元素是Integer型,最后一個元素是Double型。
如果沒有傳遞參數(shù)給Array函數(shù),那么將返回一個空數(shù)組。此時,數(shù)組的上界為-1,小于下界(總為0)。例如,
UBound(Array())
將返回-1。
更多內(nèi)容參見:Array函數(shù)。
Split函數(shù)
如果所有的值都不是分開的,而是在一個字符串中,那么可以使用Split函數(shù)分開它們并創(chuàng)建一個一維字符串數(shù)組。同樣,結(jié)果數(shù)組的索引值總是以0開始。
可以指定字符串中分離值的分隔符,例如,逗號或分號。如果沒有指定分隔符,那么將通過空格分離字符串。
如果將一個空字符串傳遞給Split函數(shù),那么將返回一個空數(shù)組。與Array函數(shù)一樣,如果為空則返回的數(shù)組上界為-1。
當給Split函數(shù)傳遞一個字符串且沒有包含分隔符時,不會獲得一個空數(shù)組。此時,返回的數(shù)組包含一個元素,就是字符串本身。
Split函數(shù)功能相對的函數(shù)是Join函數(shù)。該函數(shù)接受一組字符串作為參數(shù),并返回包含數(shù)組所有元素所組成的字符串??梢灾付ǚ指舴?,這樣將在每個值之間添加該分隔符。
如果給Join函數(shù)傳遞一個空數(shù)組,那么將返回一個空字符串。
Sub TestSplitJoin()Dim myStr As StringDim myArray() As String '由逗號分隔的字符 myStr = "A1,B2,C3"'將字符串分成一組子字符串 myArray = Split(myStr, ",")'顯示數(shù)組元素 MsgBox myArray(0) & vbCr & myArray(1) & vbCr & myArray(2)'將數(shù)組的所有元素合成一個字符串 '使用 " and " 連接 myStr = Join(myArray, " and ")'顯示字符串 MsgBox myStrEnd Sub
Filter函數(shù)
如果想檢查是否某項存在于一組字符串中,則可以遍歷所有項并和匹配的字符串相比較,但此時也可以使用Filter函數(shù)。
Filter(myArray, myMatch, myInclude)
接受myArray,并將其元素中的每一項與myMatch中的字符串相比較,取決于myInclude是True(缺省的)或False,返回一個數(shù)組,包含myArray中包含myMatch的所有元素,或者不包含myMatch的所有元素。
查找是區(qū)分大小寫的,因此如果myMatch是小寫,那么不會查找包含該字母大寫形式的元素,反之亦然。
由于該函數(shù)返回一個包含所找到的元素的新數(shù)組,不能夠在查找到的數(shù)組里獲得元素的索引值。該函數(shù)僅告訴你元素是否存在,即包含/不包含匹配字符串,是哪個而不是在哪兒。
如果沒有找到匹配的元素,那么Filter函數(shù)返回一個沒有元素的數(shù)組,其上界值是-1。
Filter函數(shù)的另一個限制是不能要求它僅查找完全匹配項,它總是返回包含匹配字符串的所有的元素,換句話說,比較而不是檢查。
這個函數(shù)總是比較字符串,因此如果你篩選一個數(shù)值數(shù)組,那么它將數(shù)值轉(zhuǎn)換成字符串,然后檢查它們。因為它不會僅查找完全匹配項,所以查找一個數(shù)值將不僅返回等于該匹配的元素,而且也包含將該數(shù)值作為一部分的元素,例如:
Filter(Array(1, 10, 210), 1)
將返回該數(shù)組中的所有元素,因為每個數(shù)值里面都有1。
測試Filter函數(shù)的示例:
Sub TestFilter()Dim myArray() As VariantDim myFilteredArray As Variant '創(chuàng)建數(shù)組 myArray = Array("One", "Two", "Three") '篩選數(shù)組中包含"T"的元素 myFilteredArray = Filter(myArray, "T", True)'顯示結(jié)果 MsgBox "在數(shù)組(""One"", ""Two"", ""Three"")中 " & _"篩選含有 ""T"" 的元素將返回" & _vbCr & Join(myFilteredArray, vbCr)'篩選數(shù)組中不包含 "T" 的元素 myFilteredArray = Filter(myArray, "T", False)'顯示結(jié)果 MsgBox "在數(shù)組(""One"", ""Two"", ""Three"")中 " & _"篩選不含有 ""T"" 的元素將返回" & _vbCr & Join(myFilteredArray, vbCr)'篩選數(shù)組中含有 "t" 的元素 myFilteredArray = Filter(myArray, "t", True)'顯示結(jié)果 MsgBox "在數(shù)組(""One"", ""Two"", ""Three"")中 " & _"篩選含有 ""t"" 的元素將返回" & _vbCr & Join(myFilteredArray, vbCr)'在數(shù)值數(shù)組中篩選數(shù)字 "1" myArray = Array(1, 2, 3, 10)myFilteredArray = Filter(myArray, 1)'顯示結(jié)果 MsgBox "在數(shù)值數(shù)組(1, 2, 3, 10)中 " & _"篩選含有 1 的數(shù)組元素返回" & _vbCr & Join(myFilteredArray, vbCr)End Sub
下面的代碼示例展示如何僅獲取完全匹配的元素:
Sub FilterExactly()Const myMarker As String = "!"Const myDelimiter As String = ","Dim myArray() As VariantDim mySearchArray As VariantDim myFilteredArray As Variant '創(chuàng)建數(shù)組 myArray = Array(1, 2, 3, 10)'預先在數(shù)組中篩選包含1的元素 myFilteredArray = Filter(myArray, 1) If UBound(myFilteredArray) > -1 Then'標記每個找到的元素的開始和結(jié)束 'myMarker和myDelimiter必須是字符 '且該字符不會出現(xiàn)在數(shù)組的任何元素中! mySearchArray = Split(myMarker & Join(myFilteredArray, myMarker & _myDelimiter & myMarker) & myMarker, myDelimiter)'下面篩選修改后的數(shù)組 myFilteredArray = Filter(mySearchArray, _myMarker & "1" & myMarker)'從結(jié)果中移除標記 myFilteredArray = Split(Replace(Join(myFilteredArray, _myDelimiter), myMarker, ""), myDelimiter)End If'顯示結(jié)果 MsgBox "篩選數(shù)組(" & Join(myArray, ", ") & _") 以獲得含有1的完全匹配的元素將返回:" & _vbCr & Join(myFilteredArray, vbCr)End Sub