VBA Dir函數可以依照系統路徑傳回檔案名稱,本文程式範例介紹如何使用以及特性,包括搭配萬用字元、On Error Goto錯誤處理、Do While Loop取得資料夾所有檔案名稱。
目錄
Toggle一、測試檔案資料夾
「TEST」測試資料夾中有兩個Excel檔案,分別是「活頁簿1.xlsm」和「活頁簿2.xlsm」,兩個檔案都是可以儲存格VBA程式的xlsm性質,本文以這兩個簡單檔案作為範例,程式執行檔案為「活頁簿1.xlsm」。
二、ThisWorkbook.Path
首先宣告並設定文字變數「F」,它的值是程式檔案本身所在的資料夾路徑,後面加上以文字字串寫明的檔案名稱,這個一般稱之為檔案全稱。。
接著依照VBA dir函數的特性寫了兩行程式,第一行是以變數F作為參數,程式在執行的時候會依照這個路徑找到的檔案並重回檔案名稱。
第二次同樣使用Dir函數,不過沒有帶任何參數,甚至連左右括號也沒有,這時候程式會沿用第一行程式碼所得到的檔案全稱再執行一次,不過因為先前行程式碼已經取得檔案了,因此這裡再次執行會試著找下一個符合條件的檔案,但是顯然找不到,結果它會傳回空白字串。
執行整個程式之後,會得到右側的即時運算結果,一行檔案名稱一行空白,接著第二次執行的時候,同樣是一行檔案名稱一行空白,如此比較能具體瞭解此函數的作用及特性。
三、萬用字元用法
上個步驟是以特定檔案名稱作為函數參數,在實務上通常是想要知道某個資料夾裡面到底有哪些檔案,這個可以簡單使用和Excel同樣的萬用字元星字號。
例如將檔案名稱改成星字號,保留xlsm副檔名,接著是相同的兩行程式,從執行結果可以看到已經顯示了資料夾裡面兩個檔案名稱。
四、VBA Dir特性
為了進一步瞭解,程式再做些更改,第一次單純執行Dir,不設定為變數也不偵測顯示,接著再設定第二次和第三次以Debug.Print偵測列印出來。執行結果只得到第2個檔案名稱再加一行空白。如此可瞭解到當有多個檔案同時符合條件,程式自動依序傳回符合條件的檔案名稱,同樣如果沒有找到的話顯示是空白。
五、程式執行錯誤
試看看在原來的程式下面再加上一個Dir,執行結果會產生錯誤,如此進一步瞭解到當這個函數找不到的情況,第一次找不到是傳回空白字串,第二次再找不到就是回報錯誤了。
六、On Error Goto
既然知道了會產生錯誤,程式設計的時候通常會進行錯誤處理,例如「On Error Goto E」很簡單的指定如果發生錯誤的話,就要跳到特定的標籤位置櫃子繼續執行,也就會是跳到幾乎是最下方的「E:」。
注意到錯誤處理標籤的上面有一行程式語句是「Exit Sub」,它的意思是假設沒有發生錯誤,程式正常由上到下執行到這裡就會強制結束程序,有發生錯誤才有可能會跳到E標籤這裡,因此這樣子的設計確保了如果沒有發生錯誤的話就不會執行錯誤標籤以下的程式語句。這是一般VBA設計錯誤處理機制的常見作用法,在此剛好程式比較簡單看不出來作用,不過讀者應該大致能瞭解像這樣的結構作用。
七、Do While Loop
在完全瞭解了VBA Dir特性之後,最後要介紹的是實務上最常用到的場合,要列出資料夾內所有檔案名稱,在這裡用到了另外一個流程控制語句:「Do While Loop」,這是因為以萬用字元尋找檔案的時候,程式會持續找下一個符合條件者,直到找不到傳回空白字串,利用此特性讓程式在迴圈中一次又一次的找,第一次有找到就傳回第一個檔案名稱,執行第二次傳回第二個檔案名稱,如此依序下去,直到每個檔案都已經執行過了它會傳回空白字串,這時「Do While」之後的條件不再成立,整個條件迴圈便會結束,剛好就是把資料夾內所有符合條件的檔案都跑過一次,不管有多少個檔案,都是只要四行程式碼。
VBA Dir函數的特性與延伸
經過本文幾個簡單的程式範例可以看到當有需要確認檔案名稱或者列出資料夾所有檔案的時候,Dir是個很好用的函數,只不過最好是像這篇文章所示範,能夠稍微瞭解其作用會比較能夠適當的設計程式,這部分其實在微軟線上手冊有用文字闡述,然而最好是透過範例測試會更為清楚。另外除了檔案之外, 這個函數其實也可以以資料夾為對象,贊贊小屋預計在其他文章會繼續分享。
參考資源:
1. 微軟關於VBA Dir函數的說明。
2.贊贊小屋VBA程式代碼圖書館。
3.贊贊小屋VBA教學手冊。
4.贊贊小屋Excel教學手冊。