|
楼主 |
发表于 2009-5-31 20:15
|
显示全部楼层
第9部分 函数的使用
技巧169 数组的使用
169-1 代码运行时创建数组
使用Array函数可以在代码运行时创建数组并把一系列数据保存在数组中,示例代码如下:- #001 Option Base 1
- #002 Sub arr()
- #003 Dim arr As Variant
- #004 Dim i As Integer
- #005 arr = Array("王晓明", "吴胜玉", "周志国", "曹武伟", "张新发", "卓雪梅", "沈煜婷", "丁林平")
- #006 For i = LBound(arr) To UBound(arr)
- #007 Cells(i, 1) = arr(i)
- #008 Next
- #009 End Sub
复制代码 代码解析:
Arr过程使用Array函数创建一个数组用来保存数据并将其写入到工作表的单元格区域。
第1行代码使用Option Base语句声明数组下标的缺省下界为1,数组下标的缺省下界默认为0。
第5行代码使用Array函数创建数组用来保存数据。Array函数返回一个包含数组的Variant,语法如下:
Array(arglist)
Arglist参数是一个用逗号隔开的值表,这些值用于给Variant所包含的数组的各元素赋值。如果不提供Arglist参数,则创建一个长度为 0 的数组。
第6行代码使用LBound函数和UBound函数取得数组的最小和最大下标。
LBound函数返回一个Long型数据,其值为指定数组维可用的最小下标,语法如下:
LBound(arrayname[, dimension])
UBound函数返回一个Long型数据,其值为指定数组维可用的最大下标,语法如下:
UBound(arrayname[, dimension])
参数arrayname是必需的,数组变量的名称。
参数dimension是可选的,指定返回哪一维的下界,1表示第一维,2表示第二维,如此类推。默认为1。
UBound函数与LBound函数一起使用,可以用来确定数组的大小。
第7行代码确定数组的大小后使用For...Next语句遍历数组元素并将数组元素依次写入到工作表的A列单元格中,如图所示。
169-2 文本转换为数组
在处理字符串时可以使用Split 函数将字符串按指定的分隔符分开并以数组返回,代码如下:- #001 Sub Splitarr()
- #002 Dim Arr As Variant
- #003 Arr = Split(Sheet2.Cells(1, 1), ",")
- #004 Sheet1.Cells(1, 1).Resize(UBound(Arr) + 1, 1) = Application.Transpose(Arr)
- #005 End Sub
复制代码 代码解析:
Splitarr过程使用Split 函数将工作表Sheet2中A1单元格的姓名分别写入到工作表Sheet1中的A列单元格。
Split 函数返回一个下标从零开始的一维数组,包含指定数目的子字符串,语法如下:
Split(expression[, delimiter[, limit[, compare]]])
参数expression是必需的,包含子字符串和分隔符的字符串表达式。
参数delimiter是必需的,用来标识子字符串边界的字符串字符。如果忽略,则使用空格字符(" ")作为分隔符。
第4行代码,首先使用UBound函数取得返回数组的最大下标后调整单元格区域,因为数组下标的缺省下界默认为0,所以在使用Resize属性调整单元格区域时参数RowSize需要在返回数组的最大下标上加一。
然后使用工作表Transpose函数将返回数组转置后写入到工作表调整后的单元格区域中。
工作表Transpose函数返回转置单元格区域,即将一行单元格区域转置成一列单元格区域,反之亦然,语法如下:
TRANSPOSE(array)
参数array为需要进行转置的数组或工作表中的单元格区域。
Splitarr过程将如图所示的工作表单元格中的字符串以逗号分隔后依次写入到工作表的A列单元格中。
169-3 使用动态数组去除重复值
在技巧169-2中使用数组函数将单元格中的文本进行分隔后写入到工作表Sheet1中的A列单元格,但是如果文本中含有大量的重复值,在写入时也会将重复值写入到工作表中,此时可以使用动态数组去除文本中的重复值,如下面的代码所示。- #001 Sub Splitarr()
- #002 Dim Splarr() As String
- #003 Dim Arr() As String
- #004 Dim Temp() As String
- #005 Dim r As Integer
- #006 Dim i As Integer
- #007 On Error Resume Next
- #008 Splarr = Split(Sheet2.Range("a1"), ",")
- #009 For i = 0 To UBound(Splarr)
- #010 Temp = Filter(Arr, Splarr(i))
- #011 If UBound(Temp) < 0 Then
- #012 r = r + 1
- #013 ReDim Preserve Arr(1 To r)
- #014 Arr(r) = Splarr(i)
- #015 End If
- #016 Next
- #017 Sheet1.Range("a1").Resize(r, 1) = Application.Transpose(Arr)
- #018 End Sub
复制代码 代码解析:
Splitarr过程将工作表Sheet2中A1单元格的文本去除重复值后写入到工作表Sheet1中的A列单元格。
第2行代码声明数组Splarr用来保存Sheet2中A1单元格的文本。
第3行代码声明数组Arr用来保存去除重复值后的文本。
第4行代码声明数组Temp用来判断文本是否重复。
第5行代码声明变量r用来保存去除重复值后的文本数量。
第7行代码启动错误处理程序来忽略错误,因为在程序运行到第11行代码会发生下标越界错误。
第8行代码使用Split 函数以Sheet2中A1单元格的文本创建一个下标从零开始的一维数组。关于Split 函数请参阅技巧169-2。
第9行代码使用For...Next语句遍历数组Splarr的所有元素。
第10行代码使用Filter函数创建一个数组Temp用来保存以当前Splarr数组的值在Arr数组中的搜索结果。Filter函数返回一个下标从零开始的数组,该数组包含基于指定筛选条件的一个字符串数组的子集,语法如下:
Filter(sourcesrray, match[, include[, compare]])
参数sourcesrray是必需的,要执行搜索的一维字符串数组。
参数match是必需的,要搜索的字符串。
参数include是可选的,Boolean值,表示返回子串是否包含match字符串。如果参数include是True,Filter函数返回的是包含match参数子字符串的数组子集。如果参数include是False,Filter函数返回的是不包含match参数子字符串的数组子集。
参数compare是可选的,所使用的字符串比较类型。
第11行代码根据返回的数组Temp的最大下标来判断当前Splarr数组的值是否重复。在使用使用Filter函数时如果没有相匹配的值,将返回一个空数组,最大下标小于0。
第12行代码如果当前Splarr数组的值不重复则将变量r的值加1。
第13行代码重新定义动态数组大小。ReDim语句,在过程级别中使用,用于为动态数组变量重新分配存储空间,语法如下:
ReDim [Preserve] varname(subscripts) [As type] [, varname(subscripts) [As type]]
参数Preserve是可选的,关键字,当改变原有数组最末维的大小时,使用此关键字可以保持数组中原来的数据。
参数varname是必需的,变量的名称。
参数subscripts是必需的,数组变量的维数,最多可以定义 60 维的多维数组,使用下面的语法;
[ lower To] upper [,[lower To] upper]
第14行代码将不重复值添加到数组Arr中。
第15行代码使用工作表Transpose函数将去除重复值的的文本转置后写入到工作表的A列单元格中。
如果需要将去除重复值的的文本写入到第一行单元格中,可以将第15行代码改成下面的代码:
Sheet1.Range("a1").Resize(1, r) = Arr
如果需要将去除重复值的的文本还是以逗号作为分隔符写入到A1单元格中,可以将第15行代码改成下面的代码:
Sheet1.Range("a1") = Join(Arr, ",")
Join函数返回一个字符串,该字符串是通过连接某个数组中的多个子字符串而创建的,语法如下:
Join(sourcearray[, delimiter])
参数sourcearray是必需的,包含被连接子字符串的一维数组。
参数delimiter是可选的,在返回字符串中用于分隔子字符串的字符,如果忽略则使用空格(" ")来分隔子字符串。 |
|