前景提要
上一节,我们学习了在进行批量工作薄汇总的过程中,碰到工作薄已经被打开的情况要如何处理,其实按照正常的逻辑来说,在进行批量工作薄汇总之前,应该首先确保所有的工作薄都已经关闭毕竟相应的数据已经做好了保存,这是最基本的一点要求,但是有时候忙碌的时候难免会导致疏忽或者遗漏的情况,如果不做判断的话,可能会导致花费了一个小时更新的数据都没有了,所以为了脚本的完整和通用性,我们还是要坐下判断比较好
今天我们来继续学习批量汇总工作薄的操作,在昨天的学习之后,有童鞋私下找我说,他们要汇总的工作薄有很多,经常都是几十个,在上节的学习上,我们说过要遍历所有被打开的工作薄,从而得出我们将要打开的工作薄是否已经被打开,但是几十个工作薄的循环会不会导致系统奔溃呢?同时一次性打开那么多的窗口,对于电脑的内存的损耗会不会很大呢?看来这些童鞋都会经常处理大数据的童鞋,经验非常的丰富,没错,如果按照我们之前的代码来操作的话,确实会出现大家所担心的问题,那么怎么办呢?好,今天我们继续完善代码
方法分析
其实方法还是一样的,不过我们换一个思路,既然我们知道同时打开太多的工作薄的话,会导致电脑卡死,而且在遍历已经打开的工作薄的过程中,也会拖累脚本的处理速度,那么我们为什么在用完了数据之后及时关闭工作薄呢,打开一个关闭一个,那么最终已经开始的工作薄不就只有仅仅几个而已嘛,仅仅几个工作薄肯定不会造成电脑的死机,除非你的数据非常的大,太大的数据的话,确实不太适合用excel来处理了,建议用其他的大数据软件或者acces ,power query之类的软件,小编最近也在接触这些软件有学习的朋友大家可以一起交流下。
回归正题,那么如何关闭我们正在打开的工作薄呢?前面有一个workbooks.open,那么关闭是不是就是workbooks.close 呢?是的,所以今天我们就用workbooks.close来执行工作薄的关闭
场景模拟
我们还是继续使用我们之前的场景
image.png代码区
我们 先不写汇总数据的代码,我们先执行打开并关闭的代码
Sub test()
Dim pathn, sth As Workbook
pathn = ThisWorkbook.Path
f = Dir(pathn & "\")
Do While f <> ""
If f <> "test.xlsm" Then
For Each sth In Workbooks
If sth.Name = f Then
GoTo line
End If
Next sth
Workbooks.Open (pathn & "\" & f)
'=====汇总工作薄的代码======
'****************************
'=====汇总工作薄的代码======
ActiveWorkbook.Close
End If
line:
f = Dir()
Loop
End Sub
我们来看看效果,这样一来程序执行完之后,真正打开的文件只有两个,我们要汇总的总表以及一个代码窗口而已,相遇于上节一次打开N多个工作薄,感觉是不是舒畅了很多,对于有强迫症的童鞋来说,也是一种结果,我们来看看前后的效果对于
image.png image.png
非常的完美
为了考虑代码的通用性,我们在增加一个意外因素,假设未来某一天我们要执行的操作并不仅仅是合并汇总数据,同时还要执行数据的更改,我们假设更改了原始数据中的某个位置,当我们再次利用上面的代码关闭工作薄的时候,就会有弹窗了。
image.png
原来你操作了数据的更改之后,没有及时保存的话,如果这个时候选择了关闭按钮,也会有这样的报错,这样的报错影响就不大了,你可以根据自己的需要选择是保存还是不保存,对于数据并没有任何的影响,但是如果你有几十个工作薄,那么你可能要点击几十次的保存或者是不保存,你不累嘛?那么这个时候要怎么办呢?
来,我们继续完善代码
workbooks.close方法还有一个参数,是布尔类型的,FALSE 和TRUE两种选择,当你在关闭工作薄的时候,你可以选择TRUE将你已经修改的数据保存并关闭,也可以选择FALSE 不保存修改直接关闭,通过代码执行选择,就不用再去我们手工点击鼠标进行操作了,这样程序就更加的完美了。
看看完整代码
Sub test()
Dim pathn, sth As Workbook
pathn = ThisWorkbook.Path
f = Dir(pathn & "\")
Do While f <> ""
If f <> "test.xlsm" Then
For Each sth In Workbooks
If sth.Name = f Then
GoTo line
End If
Next sth
Workbooks.Open (pathn & "\" & f)
Cells(1, 10) = 1
'=====汇总工作薄的代码======
'****************************
'=====汇总工作薄的代码======
ActiveWorkbook.Close True
End If
line:
f = Dir()
Loop
End Sub
依然有个小遗憾,没有办法上传动画,具体的过程,只能大家在脑海中天马行空咯。
代码分析
今天的代码分析直说一个问题
ActiveWorkbook.Close True
大家可能注意到了,我这里并没有直接写workbooks.close,而是ActiveWorkbook.Close.这两者的区别就是ActiveWorkbook代表的是当前的活动工作薄,就是我们正操作和打开的工作薄,简单说就是我们能够看到的工作薄,举个例子
image.png假设我们现在同时打开了N个工作薄,有名为中国,印度等,中国,印度的工作薄都可以称之为workbook,但是ActiveWorkbook只有当前标题栏的那个工作薄才可以说是ActiveWorkbook,就是名为中国的工作薄才是工作薄,我们要关闭的话,就只会关闭这个工作薄,而不会因为不小心去关闭了其他的工作薄,导致数据的丢失
网友评论