按键精灵——数组的应用(一)

这是奔跑的键盘侠的第129篇文章

作者|我是奔跑的键盘侠

来源|奔跑的键盘侠(ID:runningkeyboardhero)

转载请联系授权(微信ID:ctwott)

数组?不知不觉,讲到了数组,让人不由得想起了C++里面看着就忧伤的数组

放心,我们今天要讲的数组,跟那个数组,不太一样。按键精灵里面,就没有什么难的语法,如果真的有,那一定是错觉

关于数组,列表中总共有5个常用的函数,本来只想简单介绍一下语法和常用情景,结果写着写着发现3000字还是收不了尾

索性数组这个专题就拆成两篇来讲吧。这期先介绍Array函数、UBound函数和LBound函数好了。

1

Array、UBound、LBound简介

Array英文就是数组的意思,举个简单的例子,大家一看就知道:

Dim A A = Array(10,20,20)

语法很简单,但是要怎么用呢??这里有个坑,就是数组A不能直接输出,比如弹窗输出A,会报错,提示类型不匹配。

这个时候,就该下标出场了。比如要输出第一个元素10,就是:

B = A(0)

注意:数组的下标是从0开始,上方的数组A总共有3个元素,如果要按顺序调用,分别是A(0),A(1),A(2)

接着,就是UBound函数LBound函数,U和B分别是upper和lower的缩写,也就是最大下标和最小下标。

而软件自带的语法讲解中写的是:返回指定数组维数的最大/最小可用下标。简单讲一下,刚才的A=Array(10,20,20),其实是一个包含3个元素的一维数组,平时用到一维的情形居多。举个例子:

max = UBound(A,1)

min = LBound(A,1)

返回结果分别是最大下标2和最小下标0。有两点要讲:

  • 最小下标是0,这个是默认的,平时基本直接用0代替了,目前暂未遇到过最小下标不是0的情形。
  • 函数中的第二个参数,一维的情形下可以省略,直接写成UBound(A),而LBound(A)写成0更省事。

2

Array、UBound、LBound的应用场景

有很多小伙伴会碰到这么一种情形:要提取某个文件夹下面的所有文件,然后根据某个规则发邮件、发qq、发微信等等到特定的联系人。

发现闭塞久了,很多新的内容都不知道。还用一些很古老的方法。比如遍历某个文件夹下面的所有文件名,我之前还专门网上搜罗了一个专用的函数:

documents = FindAllFiles(path)

Function FindAllFiles(path) 文件名 = "" Set fso = CreateObject("Scripting.FileSystemObject") Set Folder = fso.getfolder(path) Set files = Folder.files For Each f In files 文件名 = 文件名 & f.name & "," Next Set fso = Nothing FindAllFiles = Split(AllFiles, ",") End Function 网络

写到这期需要用到遍历文件夹名时,突然想起,按键好像有自带的插件命令,一句话就能搞定,随便一翻就找见了,然后就有点傻眼了……

documents = Lib.文件.遍历指定目录下所有文件夹名("C:\")

For i=0 to UBound(documents)

TracePrint documents(i)

Next

上面的代码,第一行就是遍历文件夹。遍历是一个专业的计算机术语,百度百科的解释:“所谓遍历(Traversal),是指沿着某条搜索路线,依次对树(或图)中每个节点均做一次访问。”简单讲,就是用某个方法,全部访问一圈,在算法中,方法不同访问次序也是不一样的。

后面3行是输出文件夹里的所有文件名,其中有用到Ubound函数,可是却没有LBound函数。其实是可以装逼一下,可以把i=0改一下,写成下面这样

documents = Lib.文件.遍历指定目录下所有文件夹名("C:\")

For i=LBound(documents) to UBound(documents)

TracePrint documents(i)

Next

运行结果都一样,贴一下:

3

UBound函数的坑

刚开始学按键的时候,UBound函数用的很懵懂,自然时不时意外一下。

先讲一下,为什么一定要用UBound函数。

因为很多情况下,像遍历文件夹,结果是放在数组中,要输出数组的内容,就需要用到循环,而For循环需要用到下标。可一般来讲,我们并不知道数组里面有个元素,也就不知道最大下标,所以,只好UBound出场了。

关于UBound函数的坑

有时候,数组中的元素值为空,比如读取txt文档最后一行、遍历文件夹名最后一个,末尾元素值为空。非常常见的,如果提取完元素继续后面的代码,最好使用一个判断语句,提取到的元素如果是空值,要如何操作

跳坑方式

代码调试的时候不妨输出一下看看,如果确定最后一个元素是空,可以把UBound(documents)改成UBound(documents)-1。网上有很多代码就是这个套路,但我觉得好像有点问题……

4

UBound函数可以弃用么?

灵机一动,想起另外一个遍历的方式,可以偷工减料。我想我必须要告诉大家,如何偷工减料:

documents = Lib.文件.遍历指定目录下所有文件夹名("C:\")

For Each i In documents

TracePrint i

Next

就是For循环使用Each、In,按键常用命令中没搜到这个关键词,可能是一个隐藏语法?我只是网上代码看的多了,对这个印象深刻,所以就信手拈来,分享给大家。

可以说,Each、In的出现,极大的简化了遍历输出方式。这语法感觉跟python很神似:

For i in range(100)

于是在遍历的场景下,我们就可以顺理成章的用For Each i In 的语法替换掉UBound函数,而如果要计算元素个数,还是可以用到下标+1的计算方法。可见,UBound函数也是有一些用途,不能完全舍弃的

最后,再返回之前那个有点“傻傻”的FindAllFiles(path)函数,可能就是 Lib.文件.遍历指定目录下所有文件夹名(path)的内部封装好的函数吧。

刚又去复核了一遍,彻底晕圈了。这个Lib.文件.遍历指定目录下所有文件夹名(path)并不是按键官方自带的,而是网上一个大牛写的封装函数。

如何封装自己的函数,后面再慢慢讲,再叨下去又超3000了

-END-

原文发布于微信公众号 - 奔跑的键盘侠(runningkeyboardhero)

原文发表时间:2019-09-01

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

扫码关注云+社区

领取腾讯云代金券