前景提要
上一節(jié)玉转,我們學(xué)習(xí)了在進(jìn)行批量工作薄匯總的過程中芍耘,碰到工作薄已經(jīng)被打開的情況要如何處理凤壁,其實(shí)按照正常的邏輯來說,在進(jìn)行批量工作薄匯總之前膘掰,應(yīng)該首先確保所有的工作薄都已經(jīng)關(guān)閉畢竟相應(yīng)的數(shù)據(jù)已經(jīng)做好了保存章姓,這是最基本的一點(diǎn)要求佳遣,但是有時(shí)候忙碌的時(shí)候難免會(huì)導(dǎo)致疏忽或者遺漏的情況,如果不做判斷的話凡伊,可能會(huì)導(dǎo)致花費(fèi)了一個(gè)小時(shí)更新的數(shù)據(jù)都沒有了零渐,所以為了腳本的完整和通用性,我們還是要坐下判斷比較好
今天我們來繼續(xù)學(xué)習(xí)批量匯總工作薄的操作系忙,在昨天的學(xué)習(xí)之后诵盼,有童鞋私下找我說,他們要匯總的工作薄有很多银还,經(jīng)常都是幾十個(gè)风宁,在上節(jié)的學(xué)習(xí)上,我們說過要遍歷所有被打開的工作薄蛹疯,從而得出我們將要打開的工作薄是否已經(jīng)被打開戒财,但是幾十個(gè)工作薄的循環(huán)會(huì)不會(huì)導(dǎo)致系統(tǒng)奔潰呢?同時(shí)一次性打開那么多的窗口捺弦,對(duì)于電腦的內(nèi)存的損耗會(huì)不會(huì)很大呢饮寞?看來這些童鞋都會(huì)經(jīng)常處理大數(shù)據(jù)的童鞋,經(jīng)驗(yàn)非常的豐富列吼,沒錯(cuò)幽崩,如果按照我們之前的代碼來操作的話,確實(shí)會(huì)出現(xiàn)大家所擔(dān)心的問題冈欢,那么怎么辦呢歉铝?好,今天我們繼續(xù)完善代碼
方法分析
其實(shí)方法還是一樣的凑耻,不過我們換一個(gè)思路太示,既然我們知道同時(shí)打開太多的工作薄的話,會(huì)導(dǎo)致電腦卡死香浩,而且在遍歷已經(jīng)打開的工作薄的過程中类缤,也會(huì)拖累腳本的處理速度,那么我們?yōu)槭裁丛谟猛炅藬?shù)據(jù)之后及時(shí)關(guān)閉工作薄呢邻吭,打開一個(gè)關(guān)閉一個(gè)餐弱,那么最終已經(jīng)開始的工作薄不就只有僅僅幾個(gè)而已嘛,僅僅幾個(gè)工作薄肯定不會(huì)造成電腦的死機(jī)囱晴,除非你的數(shù)據(jù)非常的大膏蚓,太大的數(shù)據(jù)的話,確實(shí)不太適合用excel來處理了畸写,建議用其他的大數(shù)據(jù)軟件或者acces ,power query之類的軟件驮瞧,小編最近也在接觸這些軟件有學(xué)習(xí)的朋友大家可以一起交流下。
回歸正題枯芬,那么如何關(guān)閉我們正在打開的工作薄呢论笔?前面有一個(gè)workbooks.open,那么關(guān)閉是不是就是workbooks.close 呢采郎?是的,所以今天我們就用workbooks.close來執(zhí)行工作薄的關(guān)閉
場(chǎng)景模擬
我們還是繼續(xù)使用我們之前的場(chǎng)景
代碼區(qū)
我們 先不寫匯總數(shù)據(jù)的代碼狂魔,我們先執(zhí)行打開并關(guān)閉的代碼
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
我們來看看效果蒜埋,這樣一來程序執(zhí)行完之后,真正打開的文件只有兩個(gè)最楷,我們要匯總的總表以及一個(gè)代碼窗口而已整份,相遇于上節(jié)一次打開N多個(gè)工作薄,感覺是不是舒暢了很多管嬉,對(duì)于有強(qiáng)迫癥的童鞋來說皂林,也是一種結(jié)果朗鸠,我們來看看前后的效果對(duì)于
非常的完美
為了考慮代碼的通用性蚯撩,我們?cè)谠黾右粋€(gè)意外因素,假設(shè)未來某一天我們要執(zhí)行的操作并不僅僅是合并匯總數(shù)據(jù)烛占,同時(shí)還要執(zhí)行數(shù)據(jù)的更改胎挎,我們假設(shè)更改了原始數(shù)據(jù)中的某個(gè)位置,當(dāng)我們?cè)俅卫蒙厦娴拇a關(guān)閉工作薄的時(shí)候忆家,就會(huì)有彈窗了犹菇。
原來你操作了數(shù)據(jù)的更改之后,沒有及時(shí)保存的話芽卿,如果這個(gè)時(shí)候選擇了關(guān)閉按鈕揭芍,也會(huì)有這樣的報(bào)錯(cuò),這樣的報(bào)錯(cuò)影響就不大了卸例,你可以根據(jù)自己的需要選擇是保存還是不保存称杨,對(duì)于數(shù)據(jù)并沒有任何的影響,但是如果你有幾十個(gè)工作薄筷转,那么你可能要點(diǎn)擊幾十次的保存或者是不保存姑原,你不累嘛?那么這個(gè)時(shí)候要怎么辦呢呜舒?
來锭汛,我們繼續(xù)完善代碼
workbooks.close方法還有一個(gè)參數(shù),是布爾類型的袭蝗,F(xiàn)ALSE 和TRUE兩種選擇唤殴,當(dāng)你在關(guān)閉工作薄的時(shí)候,你可以選擇TRUE將你已經(jīng)修改的數(shù)據(jù)保存并關(guān)閉到腥,也可以選擇FALSE 不保存修改直接關(guān)閉朵逝,通過代碼執(zhí)行選擇,就不用再去我們手工點(diǎn)擊鼠標(biāo)進(jìn)行操作了左电,這樣程序就更加的完美了廉侧。
看看完整代碼
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
依然有個(gè)小遺憾页响,沒有辦法上傳動(dòng)畫,具體的過程段誊,只能大家在腦海中天馬行空咯闰蚕。
代碼分析
今天的代碼分析直說一個(gè)問題
ActiveWorkbook.Close True
大家可能注意到了,我這里并沒有直接寫workbooks.close,而是ActiveWorkbook.Close.這兩者的區(qū)別就是ActiveWorkbook代表的是當(dāng)前的活動(dòng)工作薄连舍,就是我們正操作和打開的工作薄没陡,簡(jiǎn)單說就是我們能夠看到的工作薄,舉個(gè)例子
假設(shè)我們現(xiàn)在同時(shí)打開了N個(gè)工作薄索赏,有名為中國(guó)盼玄,印度等,中國(guó)潜腻,印度的工作薄都可以稱之為workbook埃儿,但是ActiveWorkbook只有當(dāng)前標(biāo)題欄的那個(gè)工作薄才可以說是ActiveWorkbook,就是名為中國(guó)的工作薄才是工作薄融涣,我們要關(guān)閉的話童番,就只會(huì)關(guān)閉這個(gè)工作薄,而不會(huì)因?yàn)椴恍⌒娜リP(guān)閉了其他的工作薄威鹿,導(dǎo)致數(shù)據(jù)的丟失