ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[分享] VBA中集合collection方法的基础知识

  [复制链接]

TA的精华主题

TA的得分主题

发表于 2016-9-19 13:55 | 显示全部楼层
本帖已被收录到知识树中,索引项:数组集合和字典
多条板凳来听听,挺有意思的。

TA的精华主题

TA的得分主题

发表于 2016-9-30 15:04 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
香川群子 发表于 2013-7-4 16:34
前面讲了常识性的东西。

下面继续,稍微有点变化了。

很奇怪,把s.Add 1, CStr(1)去掉,就会出现“无效过程或调用参数”的错误
敢问该语句究竟起何作用?现在发现集合一个序号、再另搭一个key,有时真有大用!

TA的精华主题

TA的得分主题

发表于 2016-9-30 15:09 | 显示全部楼层
香川群子 发表于 2013-7-4 16:34
前面讲了常识性的东西。

下面继续,稍微有点变化了。

再追问,s.Add 1, CStr(1)改成s.Add 1, CStr(1),1是不行的,但起到了这种效果,因为:
s.item(1)=1
s.item("1")=1
cstr(1)是key吧,为何认定item是1?

TA的精华主题

TA的得分主题

 楼主| 发表于 2016-9-30 15:10 | 显示全部楼层
hhjjpp 发表于 2016-9-30 15:04
很奇怪,把s.Add 1, CStr(1)去掉,就会出现“无效过程或调用参数”的错误
敢问该语句究竟起何作用?现在 ...

集合本质上是一个数组,但是是一个可以随时插入、删除某个序号位置元素的“灵活”数组。

这个功能显然比一般的一维数组更有意思。

并且,集合也可以使用字典key来关联、定位。所以功能更强大一些。





评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2016-9-30 15:19 | 显示全部楼层
如果改为s.Add 0, "0",发现这个“非法”的序号0,总是排位于最后
如果改为s.Add 1, "0",同时for i=2改为for i=1则会有点乱!

TA的精华主题

TA的得分主题

发表于 2016-9-30 16:11 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
明白了,添加集合元素宜改成两段,序号自动添加,不能指定
即改成s.Add Int(Rnd * (i - 1) + 1), CStr(i + 800)

TA的精华主题

TA的得分主题

发表于 2016-10-23 08:29 | 显示全部楼层
香川群子 发表于 2013-7-4 11:47
集合是什么?

集合是用户定制的一组数据信息,存放于一个一维数组中,以便用户随时访问、增添、删除同类 ...

再次回顾,发现集合元素真可以是图片!
  1. Private Sub CommandButton1_Click()
  2. Dim s As New Collection, i%, j%, n%, cir As New Collection, t, l%, xy#(), temp#, temp2#, p#, r#
  3. [b16].ClearContents
  4. 'vPause 10                                                    '发现运行速度加快,原来的7不够录屏的准备
  5. n = [c11]
  6. p = Application.Pi() * 2
  7. ReDim xy(1 To n, 1 To 2)                                     'xy记录圆圈偏移中心点位置
  8. l = Len(n)
  9. r = 10.2 / Sin(p / n / 2)                                    '推算围圈半径;估计的图形尺寸与坐标度量关系,圈径20成10.3
  10. For i = 1 To n                                               '绘制n个围圈
  11.     s.Add i
  12.     xy(i, 1) = r * Cos(p / n * (i - 1))
  13.     xy(i, 2) = r * Sin(p / n * (i - 1))                      '▼集合真的可以容纳图形元素,与数组xy相比免去了redim的烦恼
  14.     cir.Add ActiveSheet.Shapes.AddShape(msoShapeOval, 250 + xy(i, 1), 300 + xy(i, 2), 20, 20)
  15.     cir(i).Select
  16.     Selection.Characters.Text = i & ""
  17.     Selection.HorizontalAlignment = xlCenter
  18.     Selection.Characters(Start:=1, Length:=l).Font.Size = 10  '字号仅考虑2位数
  19. Next
  20. t = [c12] - 1
  21. i = 1
  22. Do
  23.    If i + t > s.Count Then
  24.       i = (i + t - 1) Mod s.Count + 1
  25.    Else
  26.       i = i + t
  27.    End If
  28.    For j = i - t To i
  29.        If j <= 0 Then                                          'j出现0或负是圈邻的大数
  30.           cir(s(j - Application.Ceiling(j - 1, -s.Count))).Select '1个s.Count不一定够负数相减
  31.        Else
  32.           cir(s(j)).Select
  33.        End If
  34.        Selection.ShapeRange.Fill.ForeColor.SchemeColor = 22    '1-t报数的灰圈
  35.        vPause 0.6                                              '停顿时长的过程
  36.        Selection.ShapeRange.Fill.ForeColor.SchemeColor = 9     '改成白底;别用Transparency=1#改透明色,会对后续圈产生影响
  37.    Next
  38.    cir(s(i)).Delete                                            '出局的圈
  39.    vPause 1
  40.    s.Remove (i)
  41.    r = 10.2 / Sin(p / s.Count / 2)
  42.    If s.Count > 2 Then                                         '余两时不必重新围圈
  43.       For j = 1 To s.Count
  44.           temp = r * Cos(p / s.Count * (j - 1))
  45.           temp2 = r * Sin(p / s.Count * (j - 1))
  46.           cir(s(j)).Select
  47.           Selection.ShapeRange.IncrementLeft -xy(s(j), 1)       '各圈先回中心点聚集初始化
  48.           Selection.ShapeRange.IncrementTop -xy(s(j), 2)
  49.           Selection.ShapeRange.IncrementLeft temp               '再按新位一次性偏移围圈,这样避免了多次求差偏移引起的误差累积
  50.           Selection.ShapeRange.IncrementTop temp2
  51.           xy(s(j), 1) = temp
  52.           xy(s(j), 2) = temp2
  53.       Next
  54.    End If
  55. Loop Until s.Count = 1
  56. vPause 1
  57. cir(s(1)).Delete
  58. [b16] = s(1)
  59. End Sub
  60. Sub vPause(s!)
  61.     Dim ss!
  62.     ss = Timer
  63.     Do
  64.         DoEvents
  65.     Loop Until Abs(Timer - ss) >= s
  66. End Sub
复制代码

qr.gif

循环绕圈报数逢t退出-filter-集合-h.rar

26.26 KB, 下载次数: 57

TA的精华主题

TA的得分主题

发表于 2016-10-23 08:45 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2016-10-23 08:49 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
lolmuta 发表于 2014-9-26 09:22
在砍元素方面反过来砍元素通常比较"安定"

如果砍元素之后,exit for就不会不安定了吧?

按指定值剔除元素,用数组的filter更方便!

TA的精华主题

TA的得分主题

发表于 2018-5-14 20:10 | 显示全部楼层
香川群子 发表于 2016-9-19 13:17
因为二维数组,或一维数组(含单行多列一维数组 或Transpose转置的多行1列二维数组)都可以直接对应为工 ...

集合对象、数组、数据区域的值既有太多相似点,对于这个集合的概念问题,应先说明。
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2024-11-22 11:34 , Processed in 0.030940 second(s), 7 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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