ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 效率神器,一键搞定繁琐工作
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
让更多数据处理,一键完成 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
楼主: yuanzhuping

VBA常用技巧代码解析

    [复制链接]

TA的精华主题

TA的得分主题

 楼主| 发表于 2009-5-31 20:15 | 显示全部楼层

第9部分 函数的使用

本帖已被收录到知识树中,索引项:开发帮助和教程
技巧169         数组的使用
169-1        代码运行时创建数组
       使用Array函数可以在代码运行时创建数组并把一系列数据保存在数组中,示例代码如下:
  1. #001  Option Base 1
  2. #002  Sub arr()
  3. #003      Dim arr As Variant
  4. #004      Dim i As Integer
  5. #005      arr = Array("王晓明", "吴胜玉", "周志国", "曹武伟", "张新发", "卓雪梅", "沈煜婷", "丁林平")
  6. #006      For i = LBound(arr) To UBound(arr)
  7. #007          Cells(i, 1) = arr(i)
  8. #008      Next
  9. #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列单元格中,如图所示。
       Snap1.jpg

169-2        文本转换为数组
       在处理字符串时可以使用Split 函数将字符串按指定的分隔符分开并以数组返回,代码如下:
  1. #001  Sub Splitarr()
  2. #002      Dim Arr As Variant
  3. #003      Arr = Split(Sheet2.Cells(1, 1), ",")
  4. #004      Sheet1.Cells(1, 1).Resize(UBound(Arr) + 1, 1) = Application.Transpose(Arr)
  5. #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列单元格中。
       Snap2.jpg
       Snap3.jpg

169-3        使用动态数组去除重复值
       在技巧169-2中使用数组函数将单元格中的文本进行分隔后写入到工作表Sheet1中的A列单元格,但是如果文本中含有大量的重复值,在写入时也会将重复值写入到工作表中,此时可以使用动态数组去除文本中的重复值,如下面的代码所示。
  1. #001  Sub Splitarr()
  2. #002      Dim Splarr() As String
  3. #003      Dim Arr() As String
  4. #004      Dim Temp() As String
  5. #005      Dim r As Integer
  6. #006      Dim i As Integer
  7. #007      On Error Resume Next
  8. #008      Splarr = Split(Sheet2.Range("a1"), ",")
  9. #009      For i = 0 To UBound(Splarr)
  10. #010          Temp = Filter(Arr, Splarr(i))
  11. #011          If UBound(Temp) < 0 Then
  12. #012              r = r + 1
  13. #013              ReDim Preserve Arr(1 To r)
  14. #014              Arr(r) = Splarr(i)
  15. #015          End If
  16. #016      Next
  17. #017      Sheet1.Range("a1").Resize(r, 1) = Application.Transpose(Arr)
  18. #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是可选的,在返回字符串中用于分隔子字符串的字符,如果忽略则使用空格(" ")来分隔子字符串。

技巧169 数组的使用.rar

23.56 KB, 下载次数: 1593

点评

第三个“向丽芳”把第十三处“向丽”过滤掉了  发表于 2014-2-16 21:21

TA的精华主题

TA的得分主题

发表于 2009-5-31 20:23 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
fdsfsdfsdfsdfsdfsdfsdfdsfs

TA的精华主题

TA的得分主题

 楼主| 发表于 2009-5-31 20:39 | 显示全部楼层
1-9部分Word文档
VBA常用技巧(1-9)部分.part1.rar (1.89 MB, 下载次数: 6074)
VBA常用技巧(1-9)部分.part2.rar (1.89 MB, 下载次数: 5800)
VBA常用技巧(1-9)部分.part3.rar (1.89 MB, 下载次数: 5896)
VBA常用技巧(1-9)部分.part4.rar (1.89 MB, 下载次数: 5703)
VBA常用技巧(1-9)部分.part5.rar (524.09 KB, 下载次数: 4709)

1-9部分附件
示例文件(1-9)部分.part1.rar (1.89 MB, 下载次数: 8122)
示例文件(1-9)部分.part2.rar (1.89 MB, 下载次数: 7415)
示例文件(1-9)部分.part3.rar (1.53 MB, 下载次数: 6936)

[ 本帖最后由 yuanzhuping 于 2009-5-31 20:48 编辑 ]

TA的精华主题

TA的得分主题

发表于 2009-5-31 22:21 | 显示全部楼层
请教版主老师
    我这个图标为什么显示不出来

技巧135 用户窗体添加图标.rar

9.71 KB, 下载次数: 1469

TA的精华主题

TA的得分主题

发表于 2009-5-31 22:38 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
楼主真伟大,你的文档还要继续更新吗

TA的精华主题

TA的得分主题

发表于 2009-5-31 22:54 | 显示全部楼层
老师不遗余力令我非常敬仰!

TA的精华主题

TA的得分主题

 楼主| 发表于 2009-6-1 08:05 | 显示全部楼层
原帖由 ayu330602 于 2009-5-31 22:21 发表
请教版主老师
    我这个图标为什么显示不出来

注意图标文件的格式

TA的精华主题

TA的得分主题

发表于 2009-6-1 08:43 | 显示全部楼层
原帖由 yuanzhuping 于 2009-6-1 08:05 发表

注意图标文件的格式

谢谢老师
    我用的是*.bmp位图文件呀,老师在 楼上说明用的也是*.bmp位图,不过我用过*.cur文件,会显示但成了黑色?

TA的精华主题

TA的得分主题

发表于 2009-6-1 10:32 | 显示全部楼层

感谢

袁版主:您好!
   您的功绩是无法是言语来表达的。
   不过还是万分感谢您的雷锋精神!

TA的精华主题

TA的得分主题

发表于 2009-6-1 12:40 | 显示全部楼层
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2024-11-22 05:24 , Processed in 0.045973 second(s), 9 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

沪公网安备 31011702000001号 沪ICP备11019229号-2

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:李志群律师

快速回复 返回顶部 返回列表