这是奔跑的键盘侠的第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。有两点要讲:
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-