数组入门.docx

上传人:b****6 文档编号:4767960 上传时间:2022-12-08 格式:DOCX 页数:10 大小:26.63KB
下载 相关 举报
数组入门.docx_第1页
第1页 / 共10页
数组入门.docx_第2页
第2页 / 共10页
数组入门.docx_第3页
第3页 / 共10页
数组入门.docx_第4页
第4页 / 共10页
数组入门.docx_第5页
第5页 / 共10页
点击查看更多>>
下载资源
资源描述

数组入门.docx

《数组入门.docx》由会员分享,可在线阅读,更多相关《数组入门.docx(10页珍藏版)》请在冰豆网上搜索。

数组入门.docx

数组入门

数组入门讲座 

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

1、什么是数组

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

学习数组并不难。

我奶奶就是玩数组的高手,她到地里,用根红绳子将采下的辣椒一只一只串起来带回家挂在门前那墙上,她把这串辣椒称为“红绳子”,墙上还有“大串”、“初一”、“五儿”……,现在我才明白,那是数组名。

中午,奶奶要我把红绳子第5颗辣椒摘下来,我不知道奶奶为什么要摘第5颗,反正我照办就是,奶奶说,她要我摘“红绳子(5)”是想考考我数数的能力,晕,一二三四五,上山打老虎,我还能数错吗?

那年我已经四岁了。

奶奶说话总喜欢用数组,好比“尚云嫂她家那七个孩子啊就是有出息!

”,你知道奶奶用哪个数组说话?

如果还不知道,等会再告诉你。

数组入门.zip(1.36MB,下载次数:

3354)

2、用Array创建数组

今天,我们在Excel上来玩个串辣椒的游戏。

新建一Excel文件,按Alt+F11打开VBE窗口,如图所示打开本地窗口备用。

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

我们已经初步认识了数组,数组是把一组数保存到一个数组变量中,它有两个重要特征。

⑴它是一个变量,对一组数进行统一管理带来方便。

上面建立的姓名数组,我们要把它写入到工作表区域A1向右连续8个单元格中,可用命令:

Range(“a1:

h1”)=cname

我们认识的这类数组,称为一维数组,一维数组是一个水平数组,相当于工作表中的行。

如果要把姓名按垂直方向填充到单元格,可转置命令。

如,把这个数组写入到A1:

A8单元格中:

Range(“a1:

a8”)=WorksheetFunction.Transpose(cname)

练习:

把数组cname分别写入到单元格C4:

J4、D8:

D15。

答案:

数组入门02.xls

4、想起瑞士军刀

Array()很好用,但有时Split()更好用,我们取出这瑞士军刀的第二利器。

Split()把一个文本,根据指定的分隔符,建立一个数组。

看一个实例:

单元格A1中有一串姓名:

朱清燕(女),林鑫,林秋静(女),林永鑫,林云艳(女),林嘉惠(女),曾文婷(女),林悦,陈诚,林伟健,赖紫岚(女),曾雁(女),赖文强,钟娟(女),张琪(女),林文彬,黄晓婷(女),李朕,林依婷(女),林佳利(女),曾德福

要求:

用Split(),把这串文本创建为一个数组:

QUOTE:

Subtest()

XM=Split(Range("a1"),",")

EndSub

同样可以用本地窗口检查转换结果。

注意,Split()函数把文本转换成数组,并不受OptionBase的影响,索引号总是从0开始。

很自然想知道,A1单元格中有多少个姓名?

创建的数组有多少个元素?

瑞士军刀中有把小尺子,可以量一量:

Ubound()——返回数组的最大下标。

QUOTE:

Subtest()

   xm=Split(Range("a1"),",")

   MsgBox"数组最大下标是"&UBound(xm)&Chr(13)_

   &"数组共有"&UBound(xm)+1&"个元素"

EndSub

参考:

数组入门04.xls

 

应用实例:

[求助]快速输入问题[复制链接]

一些快速输入的问题,希望各位老师帮忙一下,

[em06][em06][em06][em06]

NGveAaba.rar(3.5KB,下载次数:

434)

2006-10-3013:

35上传

下载次数:

434

[求助]快速输入问题

回复:

(zaq159)[求助]快速输入问题

 

 试试:

eXg5zVa6.rar(8.54KB,下载次数:

886)

2006-10-3118:

47上传

下载次数:

886

回复:

(zaq159)[求助]快速输入问题

ULEPJcQo.rar

2006-10-3014:

16上传

下载次数:

618

10.19KB,下载次数:

618

[求助]快速输入问题

 

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

三维已经可以代表宽广无垠的宇宙,而数组却允许声明为4维、5维、6维,直至60维。

这是一个什么样的概念?

我曾经打过一个这样的比方:

[讨论]大家谈谈函数返回的“维数”问题[复制链接]

看了apolloh版主的 浅谈引用函数产生的多维引用及其应用 

很想弄清出什么是Excel函数返回的“内存数组”的“维数”。

根据自己一点点初中数学知识(我只是一个体育老师),想当然的认为:

一维:

也就是一条线上的数,用坐标表示就是一条直线。

二维:

就是两条线相互交叉,组成一个平面,用坐标轴表示就会有X轴 和Y轴,也就是一个平面,平面中的任何一个位置都可以用A(x,y)来表示

三维:

是两个平面交织在一起,形成一个空间,也就是2个二维形成一个3维的立体空间,如正方体、长方体等等。

一个三维空间里面的任何一点,都可以用 A(x,y,z)来表示。

4维:

(我真的不知道4维怎么表达)根据前面的推理,2个一维的直线组成一个二维平面,2个二维的平面组成一个3维空间,那么,是不是2个三维的空间组成一个整体形成4维……

5维:

2个4维又组成一个5维……(我不知道啊,知道的进来讨论一下)

那么对于函数而言,如果返回的是:

{a,b,c,d,e,……}或者{a;b;c;d;e;……}这样的一个内存数组,是不是就是一个一维的数组呢?

而返回的的如果是:

{a,b,c;1,2,3;d,e,f;4,5,6} 是不是一个二维的内存数组?

而内存数组结果为“三维”的是不能看见的,因为你用“抹黑,按F9”来看,看到的是#Value!

,但又可以用sumif或者countif等函数赖进一步计算。

Excel函数返回的4维内存数组是怎么样,我不得而知。

希望各位“家人”来讨论一下,我想很多人还是不很清楚函数的结果的这种“概念”并能够理解的。

举个例子吧

举个例子进行讨论,否则大家都不进来了!

FLDurJu1.rar(2.48KB,下载次数:

454)

2006-8-2911:

40上传

下载次数:

454

[讨论]大家谈谈函数返回的“维数”问题

回复:

(chenhuafu)[讨论]大家谈谈函数返回的“维数”问题

“维”源自空间概念,在Excel中,在计算机语言中,“维”应该是一种引用概念,用来表示“序”和“区域”,用“直线、平面、空间”来领会计算机语言中的“维”,还是相通的,还是直观的。

但要以此思维方向领会“四维”、“五维”,有些牵强。

想像一下我们常用的稿纸,写文章用的稿纸。

每一个格子是一个元素

一行构成“一维”

行向下延伸,若干行构成“页”,相对“格子”而言,是“二维”

将“页”层叠,构成“本”,相对每一个“格子”,“本”是“三维”,第3页第4行第5个格子,每一个格子,与三个因素有关。

把若干“本”汇集一起装在“柜”中,“柜”相对“格子”而言,是“四维”,引用每一个“格子”,你必须说“第A本第B页第C行第D格”,与四个因素相关。

依此下去,若干“柜”还可以组成“室”,“室”相对“格子”而言,是“五维”。

直至六维、七维、八维,也不过如此。

维是一种相对的概念,如“本”,相对于“格子”而言,它是“三维”,相对“行”而言,它是“二维”,称呼每一个“行”,只须说“第?

页第?

行”就行,“本”相对“页”而言,是“一维”,称呼每一“页”,只须说“第?

页”。

这样解释是否“牵强”?

 

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

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

如:

用Sheet2工作表A1:

E83的数据创建一个数组:

QUOTE:

PrivateSubCommandButton1_Click()

   arr=Sheet2.Range("a1:

e83")

EndSub

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

QUOTE:

PrivateSubCommandButton1_Click()

   arr=Sheet2.Range("a1:

e83")

   Range("a1:

e83")=arr

EndSub

共两句,前一句把数据保存到数组,第二句,把数组内容写入到工作表。

选择第3行代码,按F9设置断点。

点击按钮运行代码,到该行,程序自动中断,此时,可从本地窗口中观察到运行结果,一个83行2列的数组已经创建。

7、随心所欲创建数组

以上几种办法都是根据已有的数据创建数组。

实际使用中,更多时候,程序需要先创建数组,然后对数组进行赋值和修改。

Private、Public、Dim、Static,这些语句都可声明数组变量,区别在于声明的数组的使用范围,可查看各语句的帮助。

新建一个过程:

QUOTE:

Sub声明数组()

   DimMyArray(10)'在过程中间声明一个数组,过程结束,本数组将被释放。

   MyArray

(1)=100'给数组赋值

   MyArray(5)=90

EndSub

按F8逐行运行程序,在本地窗口中可以看到数组MyArray()已成功创建。

8、进阶操作声明数组

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

QUOTE:

Sub声明数组()

   DimcArr(11To20)‘声明一个数组cArr,下标从11到20,共有10个元素。

   cArr(11)="上"

   cArr(12)="中"

   cArr(13)="下"

EndSub

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

QUOTE:

Sub声明数组()

   DimnArr(-10To10)‘声明一个数组nArr,下标从-10到10,共21个元素。

   nArr(-10)=123

   nArr(-9)=456

   nArr(-2)=789

EndSub

可变的下标给你的程序带来灵活性,推荐另一个函数:

UBound()函数的姐妹花LBound()。

LBound()可以返回指定数组维可用的最小下标。

如:

xb=LBound(nArr)

MsgBoxxb

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

QUOTE:

Sub声明数组()

   DimcArr(11To20)AsString

   cArr(11)="上"

   cArr(12)="中"

   cArr(13)="下"

EndSub

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

QUOTE:

Sub声明数组()

   DimnArr(-10To10)AsInteger

   nArr(-10)=123

   nArr(-9)=456

   nArr(-2)=789

EndSub

AsInteger表示数组nArr()是一个整型变量,在本地窗口中可以看到,没有赋值的元素默认为0。

没有指定类型的变量,默认为Variant,没有赋值的元素默认为“空值”。

 

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

详见帮助。

9、动态数组

以上声明的数组都属于“静态数组”,每个数组有确定的维数,每维有确定的最大下标。

与之相对应的是动态数组。

程序中,数组的大小有时不是固定的,而是随数据的变化而变化。

声明数组的时候,不指定数组的维数与下标,这样的数组就是动态数组,在程序中可用命令Redim为动态数组变量重新分配存储空间。

例:

单元格A1中有一串姓名:

朱清燕(女),林鑫,林秋静(女),林永鑫,林云艳(女),林嘉惠(女),曾文婷(女),林悦,陈诚,林伟健,赖紫岚(女),曾雁(女),赖文强,钟娟(女),张琪(女),林文彬,黄晓婷(女),李朕,林依婷(女),林佳利(女),曾德福

要求:

把名单整理成两列,第一列是姓名,第二列是性别,把它输出到B:

C两列。

与例4相同,用Split(),把这串文本创建为一个数组,然后根据这个数组的大小,创建另一个数组:

ReDimArr(1Tos,1To2)

其中s是数组xm()的最大下标,xm()有多少行,Arr()就有多少行,列数为2,一列是姓名,另一列是性别。

参考:

数组入门09.xls

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

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

对同一数组反复改变大小的时候,也有规则必须遵守。

如果数组中存在数据,再次定义的时候默认把原数据清除,重新定义后的数组是一个空的数组。

如果你要保留原来的数据,必须加上参数Preserve。

使用Preserve参数又有一个限制,只能改变最后一维的大小,比如二维数组,只能改变第2维(列)的大小而不能改第1维(行)的大小。

还是使用上个示例,要求把A1单元格中的女同学的姓名整理成两列,第一列序号,第二列是姓名。

使用数组Arr()记录整理结果,我们在遍历原始数组xm()的时候,根据性别的判断即时改变Arr()的大小。

但不能把数组Arr()定义为n行2列,第1列保存序号,第2列保存姓名,因为我们必须使用Preserve参数保留原来的数据,此时数组Arr(n,2)的第一维是不允许改变的。

为了解决为个矛盾,我们可以把数组定义为2行n列,第一行记录序号,第二行记录姓名,列数在程序过程中反复改变。

n=n+1

ReDimPreserveArr(1To2,1Ton)'改变动态数组的大小,共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

11、搜索数组

园子里是不是有红苹果?

你手中的牌是不是有红桃K?

我们用眼睛一瞄就知道。

数组元素中是不是有“张三”,是不是有“李四”,我们如何知道?

不用担心,Filter()函数刚好可以帮你忙。

Filter()函数在一维数组中搜索文本型数据,并把结果保存到指定的数组中。

A1单元格是以逗号分隔的姓名串,部分有重复,要求剔除其中重复的姓名,把不重复的姓名写入单元格A2向右的区域。

第一步,把所有姓名保存到数组xm()中;

第二步,建立一个数组Arr()保存结果,遍历xm()过程中,检查Arr()中是否存在当前的姓名,用命令:

Temp=Filter(Arr,xm(i))'在数组Arr()中搜索当前值xm(i),如果找到,结果保存到Temp()数组中,如果找不到,返回一个空的数组Temp()

根据Temp()数组的大小,可以知道当前值xm(i)是不是一个重复的值。

参考:

数组入门11.xls

 

应用实例:

在对联库中检索对联

批量检索难题求助

现在有对联库 上联放A列 下联放在B列 需要输入名字按要求批量查找对应的对联并输出

说明:

A为上联,B为下联C要输入的名字D对应的对联

规律:

在C处输入名字如两字“刘岛”取"刘岛"为检索值,,如三个字“刘留非”:

 取“留非”为检索值,,如四字“欧阳留非”取“留非”为检索值

第一个检索的字在上联的任意位置,第二个检索字在下联的任意位置,上联与下联用空格隔开如果结果有多个全部输出到D列与名字对应单元格中并显示找到的数量每格对联用逗号隔开,如找不到对应的对联输出“找不到匹配的对联"

此问题比较复杂 望各位高手多帮忙

4ra95BHV.rar(40.78KB,下载次数:

168)

8Chk7PBB.rar(40.88KB,下载次数:

130)

2008-1-811:

32上传

下载次数:

130

批量检索难题求助

参考参考

感谢yoka 

=INDEX(ROW($A$1:

$A$1182)&"行-"&$A$1:

$A$1182&""&$B$1:

$B$1182,SMALL(IF(ISNUMBER(FIND(LEFT(RIGHT($C$4,2)),$A$1:

$A$1182))*ISNUMBER(FIND(RIGHT($C$4),$B$1:

$B$1182)),ROW($A$1:

$A$1182)),ROW(1:

1)))

在第四行可以用,D4的公式往下拉没有用 我想要在C列批量查找

一次一千个以上

2008-1-811:

06上传

下载次数:

168

批量检索难体求助

 

12、连接数组元素

有一个函数,是Split()的反向操作函数,把数组的元素连接成一个字符串,这个函数就是Join()。

在上例中,把要求改为,剔除重复值后,把结果依原样输出到A2单元格中。

我们只需改变最后一行代码:

把这一行:

'Range("a2").Resize(1,r)=Arr'填充到工作表

换成这一行,用上Join()函数,把Arr()数组中的元素用“,”连接成一个字符串:

Range("a2")=Join(Arr,",")

13、清除数组

当数组不需要使用时,可用Erase语句清除数组元素,释放变量占用的空间。

语句:

Erasexm,Arr

每条Erase语句,可清除一个数组,也可同时清除多个数组,数组名之间用逗号分隔。

学习数组14

对于数组感兴趣的朋友在您掌握了一些基本的取值、赋值、循环等技巧之后,不妨在了解一些也许你们不太了解的数组用法,这些都会是很有用的数组编程技巧

1,取工作表区域的绝对引用公式到数组:

arr=[a1:

c5].Formula

2,取工作表区域的相对引用公式到数组:

arr=[a1:

c5].Formular1c1

3,取工作表区域的转置到数组:

arr=Application.Transpose([a1:

c5])数组间也可以转置:

arr1=Application.Transpose(arr)

4,取数组arr的第n列赋值到某列区域:

[e1:

e5]=Application.Index(arr,,n)或者赋值产生一个新数组:

arr1=Application.Index(arr,,n)

5,同理,取数组arr的第n行赋值到某行区域:

[a6:

c6]=Application.Index(arr,n,)或者赋值产生一个新数组:

arr1=Application.Index(arr,n,)

[2005-10-14]感谢山菊花朋友为本贴提供精彩演示附件:

0bK0Oljb.rar(17.16KB,下载次数:

1749)

2005-10-1417:

13上传

下载次数:

1749

[原创][数组]补充一些大家不太了解的数组用法

   

VBA入门之一《与代码亲密接触》

学习数组15

综合应用示例:

本程序没有考虑速度的最优化,因为写了一个数组的讲座帖,而采用数组的方法去处理,但比工作表函数肯定快得多。

用VBA(数组)进行人员分类:

 

o4cPmnYn.rar(15.65KB,下载次数:

746)

2006-11-210:

27上传

下载次数:

746

求教高手:

优化公式或指点提高表格运算速度的办法

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > PPT模板 > 其它模板

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1