还记得初探VBA(甜点篇)中提到的最初想要解决的问题吗:
1、首先是如何打开文件
2、然后是如何循环地打开待处理的文件
3、最后是在打开的文件中进行相关的数据处理
在上一篇里,咱们一起对第1个问题进行了探索,部分实现了第1个问题,为什么是部分实现呢?
因为VBA学习(第2篇)仅是能够选取单个EXCEL文件打开、处理、保存和关闭。
那如果是要选取多个EXCEL文件呢,这一篇就来说一下。代码是这样的:
1 | '选取多个文件打开后,处理并关闭 |
细心的你,相信已经发现了上述代码与之前的打开单个EXCEL文件的区别之处了吧。
是的,两者只有微小的差异,而这也是它能实现多个文件选取并打开的原因所在。
重复的代码部分,就不多说了,如果还不太明白,就翻开VBA学习(第2篇),这里主要说说差异的地方。
1 | '选取多个文件打开后,处理并关闭 |
为了代码的完整性展现,我把所有代码都贴在了这里,但你只需关注高亮的部分,因为那才是实现多个文件打开的重点,也是这篇要讲的重点。
首先是Dim i As Integer
定义了一个变量i
,它是integer
类型的,也就是整数型的,里面存放的是0、1、2、3…这样的整数。
然后重点来了,这一段代码:
1 | For i = LBound(str) To UBound(str) |
忽略其他部分,只关注蓝色显示的内容:
1 | For i = XXX To XXX |
在这里,再重申下咱们想要解决的问题:
2、如何循环地打开待处理的文件
也就是如何打开多个文件进行处理,上面代码中的For...Next...
就是为实现循环而量身定做的。
说到这里,不得不提到编程语言中的一块不可或缺的内容了:循环
这个东西真的是太重要了,毫不夸张地说,它在编程语言中占据了半壁江山,不仅是VBA,还有python,任何一门编程语言,都是如此。
当然,伴随它出现的,往往还有分支,这点以后涉及到再说。
正是有了循环,面对成百上千的待处理文档,你才能悠哉游哉,胜似闲庭信步。
因为电脑再程序代码的操控下,不遗余力地一直在帮你打工啊,而你要做的只是付一点电费而已,真是“万恶的资本家”。
举个例子:
1 | For i = 1 To 10 |
于是电脑就在代码的指挥下,乖乖地抄写了10遍《咏鹅》:鹅,鹅,鹅, 曲项向天歌。 白毛浮绿水, 红掌拨清波.
够意思吧,这要是让你抄,如今几乎不拿笔写字的你,恐怕就要崩溃了吧。这让我想起小时候,最常干的事就是把上课默写出错的字词,抄写10遍。如果那时有人帮忙就好了,那时经常写的手酸的不行,幼小的心灵饱受摧残啊,哈哈。
啰嗦了这么多,其实就是想说明一个事:循环。
在这里基础上,后面就好理解了。
1 | For i = 1 To 10 |
这段代码就是将For...Next...
中间的内容,重复执行10次。比如这里的打开文件操作。
但是仅仅对一个文件,打开关闭10次,没有任何意义啊,我们要实现的是多个不同文件的打开操作。这就是下面这段代码要干的事:
1 | #Dim str() |
还记得str里面装的是什么吧?对!就是咱们选取的要打开处理的文件。
哦,此处有个要特别注意的地方,在“打开单个文件”的时候,str是这样定义的:Dim str As String
,而在这里是这么定义的:Dim str()
。
看到不同了吧,但具体什么意思呢?这里涉及到“数组”的知识了,又是“过早引用”。我就尽量说的通俗白话一些吧。
简单地说,前者定义的str是字符串类型,里面一次只能装一样东西(此处就是待打开的文件路径),而后者定义的str()则可以看作是数组类型,里面可以同时装很多个东西(也就是很多个文件路径)。
既然str()里面有多个东西,该如何把每一样东西取出来呢?str(i)
做的就是这么个事。i
指的就是你想从里面取出来的第i
个东西。
刚开始时,定义了i
,Dim i As Integer
,那么i
中到底有多少个整数呢?
这就要说到LBound(str)、UBound(str)
了,这两个就是帮你数数的,前面说到此处定义的str()里面装了很多东西,具体的数量就是它们数出来的,其中LBound(str)
是开始计数,而UBound(str)
是结束计数,即前者是str()里面所装东西数量的下限,后者则是上限。如果str()里有10个东西,那么LBound(str)
就是1,UBound(str)
就是10,此时For i = LBound(str) To UBound(str)
是和For i = 1 To 10
是一样的。
好了,接下来就容易理解了:
1 | #Dim str() |
这段代码就是将str()中的每个文件取出来,打开、处理,然后保存、关闭。
稍微提一点:Set wb = Workbooks.Open(str(i))
是将打开的文件赋值给wb这个变量,以便后续的操作,这个在前面也涉及到了。
OK,到这里,“多个文件的打开”操作也说完了,感觉怎样呢