ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 Excel Home精品图文教程库
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
300集Office 2010微视频教程 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
查看: 6997|回复: 32

[讨论] 数组真的是"万能容器"吗?

[复制链接]

TA的精华主题

TA的得分主题

发表于 2018-11-19 21:41 | 显示全部楼层 |阅读模式
        今天试着将几个对象放入数组时,忽然冒了了个想法,平时工作中,数组用来用去,无非就是最常见的几种数据处理及数组用法,有时再来个数组或字典嵌套之类的,就自以为是“高级应用”了,实在是太太太LOW了,就如“一叶障目,不见泰山“。
        用简单的说法:VBA数组就是储存一组数据的数据空间。数据类型可以数字,可以是文本,可以是对象,也可以是VBA数组。那么,一个大胆的想法就来了:数组是不是一个“万能容器”呢?
       如:数组、字典可入到数组里,图片、图表也可以放一数组里,工作表、工作薄也可以放到数组里,各处集合可以放到数组里,那么,是否所有的EXCEL的“对象”,所有能引用的“VBAProject”、所有能调用的系统的API……等等,都能“装”到数组里面去呢?
       而“对象”,则包含太多太多东西了,列都列不清,说不完
       如:控件、窗体等能装到数组里去吗?各类文件文档,能装到数组里面去吗(一个文件当量个数组元素),API集合能作为数组元素吗,甚至,一个程序能作为一个“对象”成为一个数组元素吗?等等…………(请高手勿笑喷,当是一个幼稚的VBA学习者脑洞大开好了)
       就如某人说的电脑、网络中的“一切都是数据”,数组既是是储存一组数据的空间,那它是否可以是“一切”的容器,一切是宇宙的话,它就是装着宇宙的容器(这个比喻有一个勃论,这个装着宇宙的容器又存在何处呢——这里就不讨论了)
      希望大家能就数组的各种“另类”应用予以讨论、释疑,又或能简单的举一两个示例,那真的就是为象我这样徘徊在VBA门外一知半解的人打开另一扇大门了。

评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2018-11-19 22:04 来自手机 | 显示全部楼层
涉及到数据结构方面的知识了,有兴趣可以研究

TA的精华主题

TA的得分主题

 楼主| 发表于 2018-11-19 22:24 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
zmj9151 发表于 2018-11-19 22:04
涉及到数据结构方面的知识了,有兴趣可以研究

果真是“专业”与“非专业”的差别,一个“数据结构”就指明了大方向

TA的精华主题

TA的得分主题

发表于 2018-11-19 22:35 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
数组和集合的比较

(1)数组的特点
a.数组本质上就是一段连续的内存空间,用于记录多个类型相同的数据;
b.数组一旦声明完毕,则内存空间固定不变;
c.插入和删除操作不方便,可能会移动大量的元素导致效率太低;
d.支持下标访问,可以实现随机访问;
e.数组中的元素可以是基本数据类型,也可以使用引用数据类型;

(2)集合的特点
a.内存空间可以不连续,数据类型可以不相同;
b.集合的内存空间可以动态地调整;
c.集合的插入删除操作可以不移动大量元素;
d.部分支持下标访问,部分不支持;
e.集合中的元素必须是引用数据类型;
---------------------
作者:xyphf_和派孔明
来源:CSDN
原文:https://blog.csdn.net/xyphf/article/details/78218814
版权声明:本文为博主原创文章,转载请附上博文链接!


评分

2

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2018-11-19 23:05 | 显示全部楼层
本帖最后由 aman1516 于 2018-11-20 12:50 编辑
zopey 发表于 2018-11-19 22:35
数组和集合的比较

(1)数组的特点

谢谢详细的对比说明,本人更想弄明白的是,“数组”都能装些什么东西:
例如简单的,
Sub arrtest1()
Dim shr, i, j, k, n
Dim shp As Shape
With Sheet1
     n = .Shapes.Count
     ReDim shr(1 To n, 1 To 2)
     For Each shp In .Shapes
         k = k + 1
         Set shr(k, 1) = shp
         shr(k, 2) = shp.TopLeftCell.Offset(0, -1).Value
     Next
End With
End Sub
上面将Shape放到数组里面是可以的,同样,若将各工作表的Shapes集合写入数组(相当于嵌套),也应可以的(妄猜,下面代码未做实例测试)
Sub arrtest2()
Dim shr, i, j, k, n, m
Dim ws As Worksheet
Dim shp As Shapes
m = Worksheets.Count
ReDim shr(1 To m, 1 To 2)
For Each ws In Worksheets
    k = k + 1
    Set shr(k, 1) = ws.Shapes
    shr(k, 2) = ws.Name
Next
End With
End Sub
然后,再通过对数组“元素”操作,对各个 ws.Shapes 集合内具体各个Shape再进行处理操作
如此引申于其它对象时,又该如何?

TA的精华主题

TA的得分主题

 楼主| 发表于 2018-11-19 23:25 | 显示全部楼层
又例如,还是EXCEL的:我有6个数据库,7个字典、8个图片集合、9个窗体、10个控件,能将这些东西形成一个类似arr(1*10,1 *5)的二维数组,并通过数组元素,对对应的对象进行相应的操作吗?

TA的精华主题

TA的得分主题

发表于 2018-11-20 06:34 来自手机 | 显示全部楼层
collection可以,dictionary可以,好像就是数组不能放置集合吧?

TA的精华主题

TA的得分主题

 楼主| 发表于 2018-11-20 22:58 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
本帖最后由 aman1516 于 2018-12-9 18:14 编辑

自己慢慢摸索,将控件放到数组里:
  1. <p>
  2. Sub arrtest3()
  3. Dim br, i, j, k, n
  4. ReDim br(1 To 3, 1 To 1)
  5. Set br(1, 1) = Me.CommandButton1
  6. Set br(2, 1) = Me.CommandButton2
  7. Set br(3, 1) = Me.CommandButton3
  8. br(1, 1).Caption = "我的控件1"
  9. 'MsgBox br(1, 1).Name & "-" & br(1, 1).Caption
  10. Dim CodeN
  11.     CodeN = ThisWorkbook.Worksheets("控件").CodeName
  12.     '需打开Excel-》工具-》宏-》安全性-》可靠发行商,选中“信任对于Visiual Basic 项目的访问”,按确定即可。

  13.     With ThisWorkbook.VBProject.VBComponents.Item(CodeN).CodeModule
  14.          .InsertLines 101, "Private Sub  " & br(1, 1).Name & "_Click()"
  15.          .InsertLines 102, "Msgbox ""你已点击了一个控件!"
  16.          .InsertLines 103, "'这是一个注释示例"
  17.          .InsertLines 105, "End Sub"
  18.      End With
  19. End Sub</p><p>
  20. </p><p>补充一个测试附件:</p><p> 将控件装入数组.rar (27.6 KB, 下载次数: 26) </p>
复制代码

TA的精华主题

TA的得分主题

 楼主| 发表于 2018-11-20 23:16 | 显示全部楼层
zpy2 发表于 2018-11-20 06:34
collection可以,dictionary可以,好像就是数组不能放置集合吧?

这样的不知算不算是集合,还是仍只是数组:
  1. Sub arrtest4()
  2. Dim jh, i, j, k
  3. Dim sh As Worksheet, wn As String
  4. wn = ThisWorkbook.Name
  5. ReDim jh(1 To 3, 1 To 2)
  6. Set jh(1, 1) = Workbooks(wn).Sheets(Array("Sheet1", "Sheet2", "Sheet3", "Sheet5"))    '工作薄中需存在这些名称的工作表,下同
  7. Set jh(1, 2) = Workbooks(wn).Sheets(Array("表1", "表3", "表3"))
  8. For j = 1 To UBound(jh, 2)
  9.     For Each sh In jh(1, j)
  10.         MsgBox sh.Name
  11.     Next sh
  12. Next
  13. End Sub
复制代码

TA的精华主题

TA的得分主题

 楼主| 发表于 2018-11-22 22:55 | 显示全部楼层
做了个实例测试,批量导出多个工作表图片,
将工作表、Shaps集合、Shap都装到数组里面去:

  1. Sub arrtest5()
  2. Application.EnableEvents = False
  3. On Error Resume Next
  4. Dim sh As Worksheet, shr, spr, PathG
  5. Dim i, j, k, n, m, p, q
  6. PathG = ThisWorkbook.Path & "\导出图库(arr)"
  7. If Dir(PathG, vbDirectory) = "" Then MkDir (PathG)
  8. n = Worksheets.Count
  9. ReDim shr(1 To n, 1 To 4)
  10. For Each sh In Worksheets
  11.     k = k + 1
  12.     Set shr(k, 1) = sh
  13.     Set shr(k, 2) = sh.Shapes
  14.     shr(k, 3) = shr(k, 2).Count
  15.     If shr(k, 3) > 0 Then
  16.        ReDim spr(1 To shr(k, 3), 1 To 2)
  17.        For i = 1 To shr(k, 3)
  18.            Set spr(i, 1) = shr(k, 2)(i)
  19.            spr(i, 2) = spr(i, 1).TopLeftCell.Offset(0, -1).Value
  20.        Next
  21.        shr(k, 4) = spr
  22.     End If
  23. Next

  24. For p = 1 To UBound(shr)
  25.     For q = 1 To UBound(shr(p, 4))
  26.         shr(p, 4)(q, 1).Copy    '.CopyPicture
  27.         With shr(p, 1).ChartObjects.Add(0, 0, shr(p, 4)(q, 1).Width, shr(p, 4)(q, 1).Height).Chart
  28.              .Paste
  29.              .Export ThisWorkbook.Path & "\导出图库(arr)" & shr(p, 4)(q, 2) & ".jpg"
  30.              .Parent.Delete
  31.         End With
  32.     Next
  33. Next
  34. MsgBox "OK!"
  35. Application.EnableEvents = True
  36. End Sub
复制代码

您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

关闭

最新热点上一条 /1 下一条

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

GMT+8, 2024-4-26 14:42 , Processed in 0.041957 second(s), 11 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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