Excel精英培训网

 找回密码
 注册
数据透视表40+个常用小技巧,让你一次学会!
查看: 81818|回复: 394

[习题] VBA数组入门教程之10(大结局):他山之石

  [复制链接]
发表于 2010-8-12 10:33 | 显示全部楼层 |阅读模式
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 前言: 时间过的真快,转眼间VBA数组入门已到第10例,虽然数组还有更多的深层用法,但本系列只是“入门”教程,所以也只能在第10例后划上句号了,希望本系列能给想学VBA数组的新手带来帮助。兰色如果有时间,会继续推出VBA数组的进阶教程系列,包括数组排序等。</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;他山之石,可以攻玉,VBA中除可以利用的VBA函数外,还可以调用众多的Excel工作表函数对数组进行分解、查询和分析等,调用工作表函数可以省去循环判断的麻烦,进而提高运行效率。</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;一、数组的最值</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1、<font color="#e70808" size="3">Max和Min</font>&nbsp;</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;工作表函数Max和Min是求最大值和最小值的函数,同样在VBA中也可以求数组的最大值和最小值。如:</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;Sub t()<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp; arr = Array(1, 35, 4, 13)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MsgBox Application.<font color="#0808d6">Max</font>(arr)&nbsp;&nbsp;'<font color="#0e0ebe">最大值</font><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MsgBox Application.<font color="#0834e7">Min</font>(arr)&nbsp;&nbsp;&nbsp;'<font color="#0f0fce">最小值</font><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; End Sub</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2、<font color="#d60808" size="3">large和small</font></p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 工作表函数large和small 是返回一组数的第N大和第N小,对VBA数组同样适用,如:</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Sub t1()<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;arr = Array(1, 35, 4, 13)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;MsgBox Application.<font color="#e70808">Large</font>(arr, 2)&nbsp;'<font color="#1010de">第2大值</font><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; MsgBox Application.<font color="#f70909">Small</font>(arr, 2)&nbsp;&nbsp;'<font color="#0f0fce">第2小值</font><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; End Sub</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;二、数组的统计与求和</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1、<font color="#ff1111" size="3">Sum</font></p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Sum函数可以在工作表中求,同样也可以对VBA数组求和,如:</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Sub t2()<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; arr = Array(1, 35, 4, 13)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;MsgBox Application.Sum(arr)&nbsp;&nbsp;'<font color="#1010de">对数组进行求和<br/></font>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; End Sub</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2、<font color="#ff0000" size="3">Count和Counta</font></p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Count和Counta可以统计数组中数字的个数和数字+文本的个数。</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp; Sub t3()<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;arr = Array(1, 35, "a", 4, 13, "b")<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;MsgBox Application.Count(arr)&nbsp;&nbsp;'<font color="#0808e7">返回数字的个数4</font><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; MsgBox Application.CountA(arr)&nbsp; ‘<font color="#0808d6">返回数组文本和数字的总个数</font><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;End Sub</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;三、数组的查询和拆分</p><p>
游客,如果您要查看本帖隐藏内容请回复
</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;四、数组维数的转换</p><p>&nbsp;&nbsp;&nbsp;
游客,如果您要查看本帖隐藏内容请回复
</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <font color="#dd0000">思考题</font>:我要把a1:c1中的内容用“-”连接起来,下面代码中为什么用了两次transpose </p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Sub t10()<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp; arr = Range("A1:C1")<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; MsgBox Join(Application.<font color="#c60707">Transpose</font>(Application.<font color="#ee0000">Transpose</font>(arr)), "-")<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;End Sub</p><p><font color="#0808e7">&nbsp;&nbsp;编后话</font>:用于VBA数组的工作表函数我只是列出了一部分,其实象vlookup,Lookup等等函数也可以用于处理VBA数组,大家有空了就去尝试下吧。&nbsp; </p><div class="listtitle"><a title="《新手学VBA数组--示例1》&lt;br&gt;作者:兰色幻想&lt;br&gt;发表于:2010-8-3 10:20:00&lt;br&gt;最后发贴:校长菜市场和厨..." href="http://www.excelpx.com/forum.php?mod=viewthread&tid=136776" target="_blank">新手学VBA数组--示例1</a></div><p><a title="《VBA数组学习示例教程之2:了解数组的维数》&lt;br&gt;作者:兰色幻想&lt;br&gt;发表于:2010-8-4 9:07:00&lt;br&gt;最后发贴:dim&nbsp;&nbsp;arr()&nbsp;&nbsp;这..." href="http://www.excelpx.com/forum.php?mod=viewthread&tid=136880" target="_blank">VBA数组学习示例教程之2:了解数组的维数</a></p><p><a title="《VBA数组入门教程第3例:把单元格数据搬入内存》&lt;br&gt;作者:兰色幻想&lt;br&gt;发表于:2010-8-5 12:04:00&lt;br&gt;最后发贴:回复:(兰色幻..." href="http://www.excelpx.com/forum.php?mod=viewthread&tid=137013" target="_blank">VBA数组入门教程第3例:把单元格数据搬入内存</a></p><p><a title="《VBA数组入门第4例:数组导入到单元格中》&lt;br&gt;作者:兰色幻想&lt;br&gt;发表于:2010-8-6 11:37:00&lt;br&gt;最后发贴:以下是引用小福..." href="http://www.excelpx.com/forum.php?mod=viewthread&tid=137121" target="_blank">VBA数组入门第4例:数组导入到单元格中</a></p><p><a title="《VBA数组入门教程第5例:动态数组的声明》&lt;br&gt;作者:兰色幻想&lt;br&gt;发表于:2010-8-7 11:40:00&lt;br&gt;最后发贴:跟贴学习,谢谢..." href="http://www.excelpx.com/forum.php?mod=viewthread&tid=137216" target="_blank">VBA数组入门教程第5例:动态数组的声明</a></p><div class="listtitle"><a title="《VBA数组入门教程第六例:数组的下标》&lt;br&gt;作者:兰色幻想&lt;br&gt;发表于:2010-8-8 12:43:00&lt;br&gt;最后发贴:以下是引用wbzx..." href="http://www.excelpx.com/forum.php?mod=viewthread&tid=137290" target="_blank">VBA数组入门教程第六例:数组的下标</a><br/>&nbsp;&nbsp;<a title="《VBA数组入门第7例:使用Array函数创建常量数组》&lt;br&gt;作者:兰色幻想&lt;br&gt;发表于:2010-8-9 9:01:00&lt;br&gt;最后发贴:以下是引用wbzx..." href="http://www.excelpx.com/forum.php?mod=viewthread&tid=137363" target="_blank">VBA数组入门第7例:使用Array函数创建常量数组</a></div><br/><div class="listtitle"><a title="《VBA数组教程8:数组的合并和字符串拆分(jion &amp; split)》
作者:兰色幻想
发表于:2010-8-10 9:45:00
最后发贴:请问兰版,我想..." href="http://www.excelpx.com/forum.php?mod=viewthread&tid=137472" target="_blank">VBA数组教程8:数组的合并和字符串拆....on &amp; split)[长]</a>
        </div><br/><div class="listtitle"><a title="《VBA数组教程第9例:Filter函数实现数组筛选》
作者:兰色幻想
发表于:2010-8-11 14:41:00
最后发贴:越来越深入啦,..." href="http://www.excelpx.com/forum.php?mod=viewthread&tid=137626" target="_blank">VBA数组教程第9例:Filter函数实现数组筛选</a>
        </div><div class="listtitle">&nbsp;</div>
[此贴子已经被作者于2010-8-12 11:46:46编辑过]
excel精英培训的微信平台,每天都会发送excel学习教程和资料。扫一扫明天就可以收到新教程
发表于 2010-8-12 10:43 | 显示全部楼层

VBA啊,校长,我觉得学习这个我还得先学好基础先
回复

使用道具 举报

发表于 2010-8-12 11:10 | 显示全部楼层

<p>兰版辛苦了,谢谢</p><p>下面就是要多练了</p>
回复

使用道具 举报

发表于 2010-8-12 11:20 | 显示全部楼层

[em01]
回复

使用道具 举报

发表于 2010-8-12 11:37 | 显示全部楼层

晕,都到第10了
回复

使用道具 举报

发表于 2010-8-12 13:28 | 显示全部楼层

<p>学习来了,谢谢校长!</p>
回复

使用道具 举报

发表于 2010-8-12 13:33 | 显示全部楼层

bucuo <br/>
回复

使用道具 举报

发表于 2010-8-12 16:34 | 显示全部楼层

关于这个思考题,为什么用到了两次transpose,我是这样理解的;<div><br/></div><div>transpose工作表函数具有转置的功能,</div><div>第一次用transpose,是把得到的二维数组arr(1行3列)转置成二维数组arr(3行1列);</div><div>第二次用transpose,是把得到的arr(3行1列)的二维数组转换成一维数组;(VBA数组教程8)</div><div><br/></div><div>通过两次transpose的转换,最初的arr数组终于变成一维数组啦,这个时候就可以用join函数来处理啦,我的理解对吗,兰版?</div><div><br/></div><div><br/></div><div><br/></div><div>但是,兰版,我虽然想到应该是这样的,但是我还是有个疑问,有些想不通;</div><div>我能想通transpose是转置函数,能够对单元格区域进行和列的转换;同时肯定可以对数组进行垂直方向和水平方向的转换;但是为什么只有单列垂直方向的二维数组能转换成一维数组呢?单行水平方向的二维数组不能转换成一维数组呢?</div><div><br/></div><div><br/></div><div><br/></div><div><br/></div><div><br/></div>
回复

使用道具 举报

发表于 2010-8-12 16:58 | 显示全部楼层

看了今天的课程,突然有一种豁然开朗的感觉,这两天还在纳闷,学了这么多天,就是把数组和单元格互相赋值,要不就是单元格拆开,又合并,提取,感觉并没有多大的意义。<div>当我要求和的时候,还是不得不用到循环累加,并没有感觉到数组的优势,只是听老师们说数组非常快(当然数组处理数据确实快);</div><div>今天才知道,工作表函数和数组结合,呵呵,这样就把数组的优势发挥出来啦,原来如此,非常感谢兰版。</div><div>这十课的课程,草草跟着兰版学了一遍,但是要消化和灵活运用,还是要好好咀嚼一段时间才行,嘿嘿。</div>
[此贴子已经被作者于2010-8-12 16:59:44编辑过]
回复

使用道具 举报

发表于 2010-8-12 18:02 | 显示全部楼层

没人?不能跟帖吗,我偏要~[em04]
回复

使用道具 举报

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

本版积分规则

小黑屋|手机版|Archiver|Excel精英培训 ( 豫ICP备11015029号 )

GMT+8, 2024-4-25 13:44 , Processed in 0.298235 second(s), 7 queries , Gzip On, Yac On.

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

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