宏运用入门及数组运用_第1页
宏运用入门及数组运用_第2页
宏运用入门及数组运用_第3页
宏运用入门及数组运用_第4页
宏运用入门及数组运用_第5页
已阅读5页,还剩5页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、1、 宏命令的使用方法11按图1 步骤操作可添加控件及编写相关代码,图2为代码编写窗口图1 在工作表中添加控件图2 编写控件代码12按图3 所示步骤自定义函数后就可以像使用excel函数一样运用它了,如图4图3 自定义函数图4 自定义函数的使用13按图5 所示步骤编写自己的宏命令,例如在代码窗口输入如下代码:sub sheetcount()dim num as integernum = thisworkbook.sheets.countrange("a1") = numend sub此函数功能是求取工作薄中所有工作表的个数,按图6方法运行该宏命令,也可以按图7所示步骤执行宏

2、命令图5 编写宏命令图6运行宏命令图7在excel中调用宏命令2、用array创建数组按alt+f11打开vbe窗口,插入一新的模块,在代码窗口中写入代码:sub test()红绳子 = array("辣1", "辣2", "辣3", "辣4", "辣5", "辣6", "辣7", "辣8", "辣9", "辣10")end sub按f8,逐行运行代码,程序成功创建了一个数组,数组名称是“红绳子”

3、,"辣1", "辣2", "辣3", "辣4", "辣5", "辣6", "辣7", "辣8", "辣9", "辣10"是数组元素。用array()创建数组,各元素之间用逗号隔开。元素如果是文本,要用半角引号作定界符。练习,创建两个数组:数组名为cname,数据为8个同学的姓名:林思明、曾玉婷、曾国文、林伟权、林兴发、刘卓怀、曾仙婷、林平数组名为cj,数据为8个数值:99, 85, 92.5, 7

4、0, 78.5, 65, 84, 100参考答案:数组入门01.xls点击浏览该文件 推荐:excelhome技术论坛的最佳学习方法 山菊花 -3、我们已经初步认识了数组,数组是把一组数保存到一个数组变量中,它有两个重要特征。它是一个变量,对一组数进行统一管理带来方便。上面建立的姓名数组,我们要把它写入到工作表区域a1向右连续8个单元格中,可用命令:range(“a1:h1”)=cname我们认识的这类数组,称为一维数组,一维数组是一个水平数组,相当于工作表中的行。如果要把姓名按垂直方向填充到单元格,可转置命令。如,把这个数组写入到a1:a8单元格中:range(“a1:a8”)= works

5、heetfunction.transpose(cname)练习:把数组cname分别写入到单元格c4:j4、d8:d15。答案:数组入门02.xls点击浏览该文件第二个重要的特征,是数组元素的有序性,一组数据有序地保存到数组变量中。数组中,用数组名加序号(称索引值)构成唯一的名称对元素进行引用。元素与序号一一对应,根据序号,可以修改和读取指定位置上的元素。把一串姓名保存到数组cname中,数据在数组中按顺序保存,默认从0开始,依次是1、2、3,用cname(0)表示第一个姓名、cname(1)表示第二个姓名,等等。在工作表中插入一个按钮,点击按钮,把姓名填入单元格a1:a8中:private

6、sub commandbutton1_click() cname = array("林思明", "曾玉婷", "曾国文", "林伟权", "林兴发", "刘卓怀", "曾仙婷", "林平")for i = 1 to 8 range("a" & i) = cname(i - 1)nextend sub数组序号(索引值)默认从0开始,也可以通过命令option base 1修改为从1开始。该命令写在模块的前面。如

7、果设定索引值从1开始,则上面的代码修改为:private sub commandbutton1_click() cname = array("林思明", "曾玉婷", "曾国文", "林伟权", "林兴发", "刘卓怀", "曾仙婷", "林平")for i = 1 to 8 range("a" & i) = cname(i ) 工作表行号与数组序号相吻合nextend sub参考:数组入门03.xls点击浏

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

9、ub同样可以用本地窗口检查转换结果。注意,split()函数把文本转换成数组,并不受option base的影响,索引号总是从0开始。很自然想知道,a1单元格中有多少个姓名?创建的数组有多少个元素?瑞士军刀中有把小尺子,可以量一量:ubound()返回数组的最大下标。sub test()xm = split(range("a1"), ",")msgbox "数组最大下标是 " & ubound(xm) & chr(13) _& "数组共有 " & ubound(xm) + 1 &am

10、p; " 个元素"end sub参考:数组入门04.xls点击浏览该文件5、三维表示一个空间,四维、五维、六维呢?三维已经可以代表宽广无垠的宇宙,而数组却允许声明为4维、5维、6维,直至60维。这是一个什么样的概念?我曾经打过一个这样的比方:6、由工作表区域创建数组。与array()和split()相比,由工作表区域创建数组更加直观而简易,一个等号便解决问题:如:用sheet2工作表a1:e83的数据创建一个数组:private sub commandbutton1_click()arr = sheet2.range("a1:e83")end sub如果

11、把该数据复制到sheet1工作表相同区域,用数组操作,代码如下:private sub commandbutton1_click()arr = sheet2.range("a1:e83")range("a1:e83") = arrend sub共两句,前一句把数据保存到数组,第二句,把数组内容写入到工作表。选择第3行代码,按f9设置断点。点击按钮运行代码,到该行,程序自动中断,此时,可从本地窗口中观察到运行结果,一个83行2列的数组已经创建。也可以按f8逐行运行代码,查看数组创建的结果。参考:数组入门05.xls点击浏览该文件7、随心所欲创建数组以上几种

12、办法都是根据已有的数据创建数组。实际使用中,更多时候,程序需要先创建数组,然后对数组进行赋值和修改。private、public、dim、static,这些语句都可声明数组变量,区别在于声明的数组的使用范围,可查看各语句的帮助。新建一个过程:sub 声明数组()dim myarray(10) '在过程中间声明一个数组,过程结束,本数组将被释放。myarray(1) = 100 '给数组赋值myarray(5) = 90end sub按f8逐行运行程序,在本地窗口中可以看到数组myarray()已成功创建。dim是声明变量的语句;myarray是数组名称;10是数组最大下标。当o

13、ption base 0的模式下,数组的序号(索引值)从0到10,表示数组有11个元素,当option base 1的模式下,数组的索引值从1到10,该语句创建的数组共有10个元素。上面声明的数组是一维数组,数组最大可以定义60维。多维数组的表示方法,维与维之间用逗号相隔。sub 声明数组b()dim data(10,5) 声明一个二维数组data (1,1) = “a001” '给数组赋值data (1,2) = 90data (3,1) = “a003” data (3,2) = 80end sub这里,data是一个二维数组。二维数组的两维,我们通常用“行、列”称呼它,如data

14、,最大行号是10,最大列号是5,在option base 1 模式下,表示是一个10行5列共50个元素的数组空间。在option base 0 模式下,表示一个11行6列共66个元素的数组空间。二维数组是使用频率最高的数组形式,因为我们的工作表也是二维的。用工作表来领会二维数组,将会更加直观:data(1,1)相当于cells(1,1),表示第1行,第1列;data(5,3)相当于cells(5,3),表示第5行,第3列。下面的语句,声明的是一个三维数组:sub 声明数组b()dim x(3,30,3) x (1,1,1) = “1班” '给数组赋值x (1,1,2) = “张三”x

15、(1,1,3) = 88 x (1,2,1) = “1班” '给数组赋值x (1,2,2) = “李四”x (1,2,3) = 95 x (2,1,1) = “2班” '给数组赋值x (2,1,2) = “刘日”x (2,1,3) = 92 end sub此主题相关图片如下:我们可以用工作簿的概念来迁移领会三维数组:x(1,2,3):第1个工作表第2行第3列;x(2,14,10):第2个工作表第14行第10列。假如我们要测量数组各维的最大下标,可以在ubound()函数使用第二个参数:ubound(x,1),返回数组x第1维的最大下标;ubound(x,2),返回数组x第2维的

16、最大下标;ubound(x,3),返回数组x第3维的最大下标。参考:数组入门06.xls点击浏览该文件8、进阶操作声明数组声明数组还可以根据需要自己指定下标和上标,而且不受option base 的影响:sub 声明数组()dim carr(11 to 20) 声明一个数组carr,下标从11到20,共有10个元素。carr(11) = "上"carr(12) = "中"carr(13) = "下"end sub数组的索引值还允许为负整数:sub 声明数组()dim narr(-10 to 10) 声明一个数组 narr,下标从-10

17、到10,共21个元素。narr(-10) = 123narr(-9) = 456narr(-2) = 789end sub可变的下标给你的程序带来灵活性,推荐另一个函数:ubound()函数的姐妹花lbound()。lbound()可以返回指定数组维可用的最小下标。如:xb = lbound(narr)msgbox xb声明数组时,还允许像声明单值变量一样为数组指定为数据类型。sub 声明数组()dim carr(11 to 20) as stringcarr(11) = "上"carr(12) = "中"carr(13) = "下"

18、end subas string 表示数组carr()是一个字符型变量,在本地窗口中可以看到,没有赋值的元素默认为空文本。sub 声明数组()dim narr(-10 to 10) as integernarr(-10) = 123narr(-9) = 456narr(-2) = 789end subas integer表示数组narr()是一个整型变量,在本地窗口中可以看到,没有赋值的元素默认为0。没有指定类型的变量,默认为variant,没有赋值的元素默认为“空值”。此主题相关图片如下:参考:数组入门07.xls点击浏览该文件变量的级别问题以上都是在过程内部声明变量,当过程结果时,变量自动

19、被释放。在模块级别中声明变量,对该模块中的所有过程都是可用的。参考:数组入门08.xls点击浏览该文件如果要声明级别更高的变量,可使用public语句。详见帮助。9、动态数组以上声明的数组都属于“静态数组”,每个数组有确定的维数,每维有确定的最大下标。与之相对应的是动态数组。程序中,数组的大小有时不是固定的,而是随数据的变化而变化。声明数组的时候,不指定数组的维数与下标,这样的数组就是动态数组,在程序中可用命令redim为动态数组变量重新分配存储空间。例:单元格a1中有一串姓名:朱清燕(女),林鑫,林秋静(女),林永鑫,林云艳(女),林嘉惠(女),曾文婷(女),林悦,陈诚,林伟健,赖紫岚(女)

20、,曾雁(女),赖文强,钟娟(女),张琪(女),林文彬,黄晓婷(女),李朕,林依婷(女),林佳利(女),曾德福要求:把名单整理成两列,第一列是姓名,第二列是性别,把它输出到b:c两列。与例4相同,用split(),把这串文本创建为一个数组,然后根据这个数组的大小,创建另一个数组:redim arr(1 to s, 1 to 2)其中s是数组xm()的最大下标,xm()有多少行,arr()就有多少行,列数为2,一列是姓名,另一列是性别。参考:数组入门09.xls点击浏览该文件允许使用redim语句反复地改变数组的元素以及维数的数目,请自己练习。10、对同一数组的反复定义对同一数组反复改变大小的时候

21、,也有规则必须遵守。如果数组中存在数据,再次定义的时候默认把原数据清除,重新定义后的数组是一个空的数组。如果你要保留原来的数据,必须加上参数preserve。使用preserve参数又有一个限制,只能改变最后一维的大小,比如二维数组,只能改变第2维(列)的大小而不能改第1维(行)的大小。还是使用上个示例,要求把a1单元格中的女同学的姓名整理成两列,第一列序号,第二列是姓名。使用数组arr()记录整理结果,我们在遍历原始数组xm()的时候,根据性别的判断即时改变arr()的大小。但不能把数组arr()定义为n行2列,第1列保存序号,第2列保存姓名,因为我们必须使用preserve参数保留原来的数

22、据,此时数组arr(n,2)的第一维是不允许改变的。为了解决为个矛盾,我们可以把数组定义为2行n列,第一行记录序号,第二行记录姓名,列数在程序过程中反复改变。n = n + 1redim preserve arr(1 to 2, 1 to n) '改变动态数组的大小,共2行,n列数组第1行记录序号,第2行记录姓名:arr(1, n) = narr(2, n) = left(xm(i), len(xm(i) - 3) 对数组xm()遍历结束后,把结果写入工作表,因为数组的方向与结果要求的方向不一致,所以要加一个转置函数:range("b6").resize(n, 2)

23、 = 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点击浏览该文件12、连接数组元素有一个函数,是spli

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论