ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

墙上那一串串红辣椒——数组入门讲座

  [复制链接]

TA的精华主题

TA的得分主题

发表于 2006-10-26 16:05 | 显示全部楼层 |阅读模式
本帖已被收录到知识树中,索引项:数组集合和字典

写个学习数组的帖子,送给初学的朋友。

1、什么是数组

数组就是把数据组合起来以方便管理,在程序中运用数组可简化程序、提高效率。

学习数组并不难。我奶奶就是玩数组的高手,她到地里,用根红绳子将采下的辣椒一只一只串起来带回家挂在门前那墙上,她把这串辣椒称为“红绳子”,墙上还有“大串”、“初一”、“五儿”……,现在我才明白,那是数组名。中午,奶奶要我把红绳子第5颗辣椒摘下来,我不知道奶奶为什么要摘第5颗,反正我照办就是,奶奶说,她要我摘“红绳子(5)”是想考考我数数的能力,晕,一二三四五,上山打老虎,我还能数错吗?那年我已经四岁了。奶奶说话总喜欢用数组,好比“尚云嫂她家那七个孩子啊就是有出息!”,你知道奶奶用哪个数组说话?如果还不知道,等会再告诉你。

山版主的文章读起来琅琅上口,用几个简单的生活中的例子就可以把一个问题讲得很透彻。本文确实是新手学习的好材料,欢迎大家补充。——northwolves
[此贴子已经被作者于2006-10-27 9:57:51编辑过]
很久没关注本帖了,许多朋友的问题没有答复,在此说声抱歉。 多个附件不能下载,在此补上: 数组入门.zip (1.36 MB, 下载次数: 17765) --山菊花 2011-1-8

评分

16

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2006-10-26 16:07 | 显示全部楼层

2、用Array创建数组

今天,我们在Excel上来玩个串辣椒的游戏。新建一Excel文件,按Alt+F11打开VBE窗口,如图所示打开本地窗口备用。


运用实例参考: http://club.excelhome.net/forum. ... 1342799&pid=9079942

TA的精华主题

TA的得分主题

 楼主| 发表于 2006-10-26 16:08 | 显示全部楼层

3、像和尚数念珠一样把数组玩转


我们已经初步认识了数组,数组是把一组数保存到一个数组变量中,它有两个重要特征。
⑴它是一个变量,对一组数进行统一管理带来方便。上面建立的姓名数组,我们要把它写入到工作表区域A1向右连续8个单元格中,可用命令:
Range(“a1:h1”)=cname
我们认识的这类数组,称为一维数组,一维数组是一个水平数组,相当于工作表中的行。如果要把姓名按垂直方向填充到单元格,可转置命令。如,把这个数组写入到A1:A8单元格中:
Range(“a1:a8”)= WorksheetFunction.Transpose(cname)
练习:把数组cname分别写入到单元格C4:J4、D8:D15。
答案:数组入门02.xls

[此贴子已经被作者于2006-11-1 18:38:09编辑过]

TA的精华主题

TA的得分主题

 楼主| 发表于 2006-10-26 16:09 | 显示全部楼层

4、想起瑞士军刀


Array()很好用,但有时Split()更好用,我们取出这瑞士军刀的第二利器。
Split()把一个文本,根据指定的分隔符,建立一个数组。
看一个实例:
单元格A1中有一串姓名:
朱清燕(女),林鑫,林秋静(女),林永鑫,林云艳(女),林嘉惠(女),曾文婷(女),林悦,陈诚,林伟健,赖紫岚(女),曾雁(女),赖文强,钟娟(女),张琪(女),林文彬,黄晓婷(女),李朕,林依婷(女),林佳利(女),曾德福
要求:用Split(),把这串文本创建为一个数组:

QUOTE:
Sub test()
XM = Split(Range("a1"), ",")
End Sub

同样可以用本地窗口检查转换结果。
注意,Split()函数把文本转换成数组,并不受Option Base的影响,索引号总是从0开始。
很自然想知道,A1单元格中有多少个姓名?创建的数组有多少个元素?瑞士军刀中有把小尺子,可以量一量:
Ubound()——返回数组的最大下标。

QUOTE:
Sub test()
    xm = Split(Range("a1"), ",")
    MsgBox "数组最大下标是 " & UBound(xm) & Chr(13) _
    & "数组共有 " & UBound(xm) + 1 & " 个元素"
End Sub


参考:数组入门04.xls
 

应用实例:

http://club.excelhome.net/viewthread.php?tid=196840&extra=&page=1#196840

[此贴子已经被作者于2006-10-31 18:48:51编辑过]

评分

1

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2006-10-26 16:10 | 显示全部楼层

5、三维表示一个空间,四维、五维、六维呢?


三维已经可以代表宽广无垠的宇宙,而数组却允许声明为4维、5维、6维,直至60维。这是一个什么样的概念?我曾经打过一个这样的比方:
http://club.excelhome.net/viewthread.php?tid=185500&replyID=504536&skin=0

[此贴子已经被作者于2006-10-27 9:38:59编辑过]

TA的精华主题

TA的得分主题

 楼主| 发表于 2006-10-26 16:11 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助

6、由工作表区域创建数组。


与Array()和Split()相比,由工作表区域创建数组更加直观而简易,一个等号便解决问题:
如:用Sheet2工作表A1:E83的数据创建一个数组:

QUOTE:
Private Sub CommandButton1_Click()
    arr = Sheet2.Range("a1:e83")
End Sub

如果把该数据复制到Sheet1工作表相同区域,用数组操作,代码如下:

QUOTE:
Private Sub CommandButton1_Click()
    arr = Sheet2.Range("a1:e83")
    Range("a1:e83") = arr
End Sub

共两句,前一句把数据保存到数组,第二句,把数组内容写入到工作表。
选择第3行代码,按F9设置断点。点击按钮运行代码,到该行,程序自动中断,此时,可从本地窗口中观察到运行结果,一个83行2列的数组已经创建。


[此贴子已经被作者于2006-10-27 9:39:21编辑过]

TA的精华主题

TA的得分主题

 楼主| 发表于 2006-10-26 16:12 | 显示全部楼层

7、随心所欲创建数组

以上几种办法都是根据已有的数据创建数组。实际使用中,更多时候,程序需要先创建数组,然后对数组进行赋值和修改。 Private、Public、Dim、Static,这些语句都可声明数组变量,区别在于声明的数组的使用范围,可查看各语句的帮助。 新建一个过程:
  1. Sub 声明数组()
  2. Dim MyArray(10) '在过程中间声明一个数组,过程结束,本数组将被释放。
  3. MyArray(1) = 100 '给数组赋值
  4. MyArray(5) = 90
  5. End Sub
复制代码
按F8逐行运行程序,在本地窗口中可以看到数组MyArray()已成功创建。 阅读下面的帖子,可以加强对Dim语句的理解: vba中数组我搞不清

TA的精华主题

TA的得分主题

 楼主| 发表于 2006-10-26 16:13 | 显示全部楼层

8、进阶操作声明数组


⑴声明数组还可以根据需要自己指定下标和上标,而且不受Option Base 的影响:

QUOTE:

Sub 声明数组()
    Dim cArr(11 To 20) ‘声明一个数组cArr,下标从11到20,共有10个元素。
    cArr(11) = "上"
    cArr(12) = "中"
    cArr(13) = "下"
End Sub

数组的索引值还允许为负整数:

QUOTE:
Sub 声明数组()
    Dim nArr(-10 To 10) ‘声明一个数组 nArr,下标从-10到10,共21个元素。
    nArr(-10) = 123
    nArr(-9) = 456
    nArr(-2) = 789
End Sub

可变的下标给你的程序带来灵活性,推荐另一个函数:UBound()函数的姐妹花LBound()。
LBound()可以返回指定数组维可用的最小下标。如:
xb = LBound(nArr)
MsgBox xb

⑵声明数组时,还允许像声明单值变量一样为数组指定为数据类型。

QUOTE:
Sub 声明数组()
    Dim cArr(11 To 20) As String
    cArr(11) = "上"
    cArr(12) = "中"
    cArr(13) = "下"
End Sub

As String 表示数组cArr()是一个字符型变量,在本地窗口中可以看到,没有赋值的元素默认为空文本。

QUOTE:
Sub 声明数组()
    Dim nArr(-10 To 10) As Integer
    nArr(-10) = 123
    nArr(-9) = 456
    nArr(-2) = 789
End Sub

As Integer表示数组nArr()是一个整型变量,在本地窗口中可以看到,没有赋值的元素默认为0。
没有指定类型的变量,默认为Variant,没有赋值的元素默认为“空值”。

 

如果要声明级别更高的变量,可使用Public语句。详见帮助。


[此贴子已经被作者于2006-10-27 9:40:17编辑过]

TA的精华主题

TA的得分主题

 楼主| 发表于 2006-10-26 16:14 | 显示全部楼层

9、动态数组


以上声明的数组都属于“静态数组”,每个数组有确定的维数,每维有确定的最大下标。与之相对应的是动态数组。程序中,数组的大小有时不是固定的,而是随数据的变化而变化。
声明数组的时候,不指定数组的维数与下标,这样的数组就是动态数组,在程序中可用命令Redim为动态数组变量重新分配存储空间。

例:单元格A1中有一串姓名:
朱清燕(女),林鑫,林秋静(女),林永鑫,林云艳(女),林嘉惠(女),曾文婷(女),林悦,陈诚,林伟健,赖紫岚(女),曾雁(女),赖文强,钟娟(女),张琪(女),林文彬,黄晓婷(女),李朕,林依婷(女),林佳利(女),曾德福
要求:把名单整理成两列,第一列是姓名,第二列是性别,把它输出到B:C两列。

与例4相同,用Split(),把这串文本创建为一个数组,然后根据这个数组的大小,创建另一个数组:
ReDim Arr(1 To s, 1 To 2)
其中s是数组xm()的最大下标,xm()有多少行,Arr()就有多少行,列数为2,一列是姓名,另一列是性别。
参考:数组入门09.xls


允许使用ReDim语句反复地改变数组的元素以及维数的数目,请自己练习。

[此贴子已经被作者于2006-10-27 9:40:42编辑过]

TA的精华主题

TA的得分主题

 楼主| 发表于 2006-10-26 16:15 | 显示全部楼层

10、对同一数组的反复定义


对同一数组反复改变大小的时候,也有规则必须遵守。如果数组中存在数据,再次定义的时候默认把原数据清除,重新定义后的数组是一个空的数组。如果你要保留原来的数据,必须加上参数Preserve。使用Preserve参数又有一个限制,只能改变最后一维的大小,比如二维数组,只能改变第2维(列)的大小而不能改第1维(行)的大小。

还是使用上个示例,要求把A1单元格中的女同学的姓名整理成两列,第一列序号,第二列是姓名。
使用数组Arr()记录整理结果,我们在遍历原始数组xm()的时候,根据性别的判断即时改变Arr()的大小。但不能把数组Arr()定义为n行2列,第1列保存序号,第2列保存姓名,因为我们必须使用Preserve参数保留原来的数据,此时数组Arr(n,2)的第一维是不允许改变的。为了解决为个矛盾,我们可以把数组定义为2行n列,第一行记录序号,第二行记录姓名,列数在程序过程中反复改变。
n = n + 1
ReDim Preserve Arr(1 To 2, 1 To n) '改变动态数组的大小,共2行,n列
数组第1行记录序号,第2行记录姓名:
Arr(1, n) = n
Arr(2, n) = Left(Xm(i), Len(Xm(i)) - 3) 
对数组xm()遍历结束后,把结果写入工作表,因为数组的方向与结果要求的方向不一致,所以要加一个转置函数:
Range("b6").Resize(n, 2) = WorksheetFunction.Transpose(Arr)
参考:数组入门10.xls

[此贴子已经被作者于2006-10-27 9:41:02编辑过]

评分

3

查看全部评分

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

本版积分规则

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

GMT+8, 2024-12-22 16:44 , Processed in 0.034968 second(s), 11 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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