防火门能安装锁吗:一些有用的在VBA中处理数组的函数
来源:百度文库 编辑:偶看新闻 时间:2024/05/03 02:55:49
Array函数
Array函数是一种使用值创建和填充数组的方法。将所有的值作为参数传递给该函数,返回一个使用这些值作为元素的一维数组,数组值的顺序和传递给函数的数值的顺序相同。第一个元素的索引值总是0,不依赖任何Option Base设置。
Sub TestArray()Dim myArray() As Variant '从逗号分隔的字符串列表中创建数组 myArray = Array("One", "Two", "Three")'显示数组元素 MsgBox myArray(0) & vbCr & myArray(1) & vbCr & myArray(2)'也可以使用数值作为参数 myArray = Array(10, 20, 30)'显示数组元素 MsgBox myArray(0) & vbCr & myArray(1) & vbCr & myArray(2)End Sub
Array函数总是返回Variant类型的数组,但元素的数据类型可以不同,取决于传递给该函数的数值的类型。
例如,Array(“One”, 2, 3.4)返回的数组,第一个元素是String类型,第二个元素是Integer型,最后一个元素是Double型。
如果没有传递参数给Array函数,那么将返回一个空数组。此时,数组的上界为-1,小于下界(总为0)。例如,
UBound(Array())
将返回-1。
更多内容参见:Array函数。
Split函数
如果所有的值都不是分开的,而是在一个字符串中,那么可以使用Split函数分开它们并创建一个一维字符串数组。同样,结果数组的索引值总是以0开始。
可以指定字符串中分离值的分隔符,例如,逗号或分号。如果没有指定分隔符,那么将通过空格分离字符串。
如果将一个空字符串传递给Split函数,那么将返回一个空数组。与Array函数一样,如果为空则返回的数组上界为-1。
当给Split函数传递一个字符串且没有包含分隔符时,不会获得一个空数组。此时,返回的数组包含一个元素,就是字符串本身。
Split函数功能相对的函数是Join函数。该函数接受一组字符串作为参数,并返回包含数组所有元素所组成的字符串。可以指定分隔符,这样将在每个值之间添加该分隔符。
如果给Join函数传递一个空数组,那么将返回一个空字符串。
Sub TestSplitJoin()Dim myStr As StringDim myArray() As String '由逗号分隔的字符 myStr = "A1,B2,C3"'将字符串分成一组子字符串 myArray = Split(myStr, ",")'显示数组元素 MsgBox myArray(0) & vbCr & myArray(1) & vbCr & myArray(2)'将数组的所有元素合成一个字符串 '使用 " and " 连接 myStr = Join(myArray, " and ")'显示字符串 MsgBox myStrEnd Sub
Filter函数
如果想检查是否某项存在于一组字符串中,则可以遍历所有项并和匹配的字符串相比较,但此时也可以使用Filter函数。
Filter(myArray, myMatch, myInclude)
接受myArray,并将其元素中的每一项与myMatch中的字符串相比较,取决于myInclude是True(缺省的)或False,返回一个数组,包含myArray中包含myMatch的所有元素,或者不包含myMatch的所有元素。
查找是区分大小写的,因此如果myMatch是小写,那么不会查找包含该字母大写形式的元素,反之亦然。
由于该函数返回一个包含所找到的元素的新数组,不能够在查找到的数组里获得元素的索引值。该函数仅告诉你元素是否存在,即包含/不包含匹配字符串,是哪个而不是在哪儿。
如果没有找到匹配的元素,那么Filter函数返回一个没有元素的数组,其上界值是-1。
Filter函数的另一个限制是不能要求它仅查找完全匹配项,它总是返回包含匹配字符串的所有的元素,换句话说,比较而不是检查。
这个函数总是比较字符串,因此如果你筛选一个数值数组,那么它将数值转换成字符串,然后检查它们。因为它不会仅查找完全匹配项,所以查找一个数值将不仅返回等于该匹配的元素,而且也包含将该数值作为一部分的元素,例如:
Filter(Array(1, 10, 210), 1)
将返回该数组中的所有元素,因为每个数值里面都有1。
测试Filter函数的示例:
Sub TestFilter()Dim myArray() As VariantDim myFilteredArray As Variant '创建数组 myArray = Array("One", "Two", "Three") '筛选数组中包含"T"的元素 myFilteredArray = Filter(myArray, "T", True)'显示结果 MsgBox "在数组(""One"", ""Two"", ""Three"")中 " & _"筛选含有 ""T"" 的元素将返回" & _vbCr & Join(myFilteredArray, vbCr)'筛选数组中不包含 "T" 的元素 myFilteredArray = Filter(myArray, "T", False)'显示结果 MsgBox "在数组(""One"", ""Two"", ""Three"")中 " & _"筛选不含有 ""T"" 的元素将返回" & _vbCr & Join(myFilteredArray, vbCr)'筛选数组中含有 "t" 的元素 myFilteredArray = Filter(myArray, "t", True)'显示结果 MsgBox "在数组(""One"", ""Two"", ""Three"")中 " & _"筛选含有 ""t"" 的元素将返回" & _vbCr & Join(myFilteredArray, vbCr)'在数值数组中筛选数字 "1" myArray = Array(1, 2, 3, 10)myFilteredArray = Filter(myArray, 1)'显示结果 MsgBox "在数值数组(1, 2, 3, 10)中 " & _"筛选含有 1 的数组元素返回" & _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 '创建数组 myArray = Array(1, 2, 3, 10)'预先在数组中筛选包含1的元素 myFilteredArray = Filter(myArray, 1) If UBound(myFilteredArray) > -1 Then'标记每个找到的元素的开始和结束 'myMarker和myDelimiter必须是字符 '且该字符不会出现在数组的任何元素中! mySearchArray = Split(myMarker & Join(myFilteredArray, myMarker & _myDelimiter & myMarker) & myMarker, myDelimiter)'下面筛选修改后的数组 myFilteredArray = Filter(mySearchArray, _myMarker & "1" & myMarker)'从结果中移除标记 myFilteredArray = Split(Replace(Join(myFilteredArray, _myDelimiter), myMarker, ""), myDelimiter)End If'显示结果 MsgBox "筛选数组(" & Join(myArray, ", ") & _") 以获得含有1的完全匹配的元素将返回:" & _vbCr & Join(myFilteredArray, vbCr)End Sub