前景提要
今天我們接著上次的分享來繼續(xù),上次我們分享了在合并多個工作薄的過程中,將文件夾內(nèi)Excel文件批量打開的操作,今天我們繼續(xù)完善昨天的代碼,在上節(jié)我們留下了一個懸念,如果在合并工作薄的過程中,出現(xiàn)了如下的提示

要如何處理,很多的人會說可以選擇Y,沒錯這樣操作的話,程序是可以繼續(xù)執(zhí)行的,但是如果不巧這個文件你剛剛修改了某些數(shù)據(jù),如果你這個時候選擇了Y,那么不好意思,你之前的所有改動都沒有保存,你需要重新做一份新的數(shù)據(jù),是不是很煩躁,所以在批量打開工作薄的時候,需要先判斷當前工作薄是否已經(jīng)被打開,如果被打開的話,我們就不要操作再次打開了。聽起來似乎是一個判斷,沒錯,今天我們就來看看這個判斷要如何來寫。
場景模擬
我們還是繼續(xù)之前模擬的數(shù)據(jù)來分析,假設(shè)我們我們現(xiàn)在已經(jīng)打開了京東2這個工作薄,并對其中的某些數(shù)據(jù)進行了修改,我們?nèi)绻€是繼續(xù)執(zhí)行上節(jié)的代碼的話,就會出現(xiàn)提示文件被打開的提示,如果選擇Y會導(dǎo)致我們修改的數(shù)據(jù)沒有報錯,如果我們選擇N,則會提示程序運行被中斷,程序結(jié)束

方法分析
判斷文件是否被打開,我們來想想如果是我們自己手工操作的話,我們?nèi)绾闻袛喙ぷ鞅∈欠癖淮蜷_呢,當然就是看看當前已經(jīng)打開的工作薄中是否有我們將要打開的工作薄,那么要如何去判斷呢?很簡單遍歷所有已經(jīng)打開的工作薄,然后讀取已經(jīng)被打開的工作薄,看看其中是否有我們要打開的那個工作薄,我們要判斷天貓1的工作薄是否被打開,那么我們就遍歷讀取當前被打開的工作薄,看看他們的名字是否有叫做天貓1的,如果有,我們就不能再次執(zhí)行打開的操作了,需要跳過打開的命令,直接讀取數(shù)據(jù),反之如果有沒有天貓1的工作薄,我們既可以正常的打開操作了,來看下例子。
代碼區(qū)
假設(shè)我們現(xiàn)在已經(jīng)提前打開了京東2這個工作薄,并且更改了數(shù)據(jù),但是還沒有保存,我們執(zhí)行下匯總程序

有報錯,我們在調(diào)整下代碼
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)
End If
line:
f = Dir()
Loop
End Sub
看看效果,在我們已經(jīng)提前打開京東2這個工作薄的情況下,程序依然能夠正常的運行,并且打開其他的工作薄,這樣切好也滿足了我們的要求,很完美,這里如果可以上傳動畫的話,效果應(yīng)該會更加的明顯,可以好像無法上傳動畫,那么腦海中惡補下這個過程吧
代碼分析
For Each sth In Workbooks
If sth.Name = f Then
GoTo line
End If
Next sth
這里是遍歷所有已經(jīng)被打開的工作薄的意思,F(xiàn)or Each sth In Workbooks就是這個目的
然后讀取每個工作薄的名字,如果發(fā)現(xiàn)這個工作薄的名字正好和我們將要打開的工作薄的名字是相同的,那么就跳轉(zhuǎn)去執(zhí)行其他的代碼,這里的goto line就是這樣的意思,調(diào)準到line這一行

繼續(xù)從這一行開始執(zhí)行新的命令,新的命令就是繼續(xù)準備打開下一個工作薄,當前已經(jīng)被我們提前打開的工作薄京東2將會被關(guān)閉,也不會被再次打開,所以我們所作的數(shù)據(jù)操作也不會丟失了。我們來調(diào)試下,方便大家理解下程序執(zhí)行的過程

當循環(huán)遍歷的時候,如果碰到工作薄的名字等于我們要打開的工作薄的時候,我們看,程序不會執(zhí)行打開的命令, 反而去執(zhí)行調(diào)準的命令了。

大家領(lǐng)悟到了嘛?