VBA檢查檔案是否存在:2種方法判斷後再新增

VBA檢查檔案是否存在是實務上常用程式語句,本文介紹Dir函數和Scripting.FileSystemObject兩種方法判斷檔案或者資料夾是否已經存在,進而在確認狀態之後以MkDir命令新增資料夾。

一、檔案及資料夾

範例是一個名稱為「活頁簿1」的Excel檔案,副檔名是「xlsm」,表示它是啟用巨集、具有VBA程式功能、可以儲存程式碼的檔案。另外在這個檔案所在的資料夾中有一個「測試」子資料夾。

E48k11

二、Dir及Len函數

設計VBA程式,首先用ThisWorkbook.Path得到目前執行程式檔案所在的資料夾路徑,接著在後面再加上資料夾斜線跟檔案名稱:「\活頁簿1.xlsm」,如此得到了檔案全稱,把它設定為是變數F的值。接著以F作為Dir函數的參數,從右側的「即時運算」結果可以看到會找到這個檔案,並且傳回檔案名稱「活頁簿1.xlsm」。

在實務上為了方便起見,常常會再搭配使用Len函數,此函數會取得參數內的文字字串長度,例如這裡的「活頁簿1.xlsm」檔案名稱連同副檔名就是「9」,一個單純的數字。

E48k21

三、檔案存在測試

瞭解了Dir函數和Len函數的用法之後,可以簡單做個反面測試。在此設定一個不存在的「活頁簿1.xlsx」檔案全稱,使用跟上個步驟相同的程式語句執行,會發現到在即時運算視窗得到的是空白字串,這個空白字串的長度自然就是「0」。

E48k31

四、資料夾存在測試

除了檔案之外,很多時候也會想要瞭解某個特定的資料夾是否存在,可撰寫相同的程式結構語句,不過記得要在Dir函數後面加上第二個參數:「vbDirectory」。

E48k41

五、Scripting.FileSystemObject

除了使用相對簡單的Dir函數,還能使用可說是Windows系統所提供的服務組件,在此用「Set」建立一個程式對象:「CreateObject(“Scripting.FileSystemObject”)」,建立好了之後便可以使用這個對象本身所具有的操作方法,也就是「FileExistes」這個方法,它以檔案路徑作為參數檢查是否存在這個檔案,檢查結果會傳回布林值,是或者否,這裡看到的是「True」。

E48k51

六、folderexists函數

除了確定檔案是否存在,還有另外一個類似的檔案操作方法是:「folderexists」,如同此名稱所示,它能夠確認資料夾是否存在,注意到這裡相較於上個步驟有特別加上一個「set O = Nothing」的語法,由於在此VBA程式是引用相對於Excel的外部對象,通常自己手工開啟這個外部對象的話,通常都會知道不用時或者結束時要將它關閉,但如果是程式自動執行,要記得用程式方式把這個外部對象關閉,也就是這裡看到的Nothing語法,如此節省電腦資源,避免記憶體持續在背景中調用這個對象因而佔用空間。

E48k61

七、VBA檢查檔案是否存在

設計程式通常想要確認檔案或資料夾是否存在,用意是為了在新增刪除變更之前先確認狀況再執行,例如這裡其實是想要新增資料夾,在進行新增的時候如果資料夾已經存在了,不管是程式執行或者是手工操作,顯然都是無法執行會有錯誤,因此在此沿用先前步驟的程式語句確認資料夾是否存在,長度是零的話代表不存在,這時候就使用MkDir這個和DOS一樣的命令新增資料夾。

VBA檢查檔案是否存在:2種方法判斷後再新增

八、新增檔案資料夾

最後回到文章開始所介紹的範例資料夾,果然執行上個步驟的程式之後,已經新增了一個「測試1」資料夾。

E48k81

VBA MkDir命令的意義

VBA原本用意是自動化Excel操作,而這篇文章最後是新增資料夾,這個顯然是Excel手工操作無法進行的操作,所以VBA本身是繼承自於VB語言,而VB本身主要是Windows作業系統的應用開發程式語言,所以VBA就有一套完整的程式庫,不但可以簡單操作Excel對象,還有可能去操作Windows系統對象,例如文章範例所使用的DOS命令MkDir。再退步一說,Windows、Excel、VBA同樣都是微軟所開發的,因此VBA是很輕鬆可以超越Excel本身的限制,這個可說是學習VBA的進階功能用法。

參考資源:

1. 微軟MkDir 陳述式說明。

2.贊贊小屋VBA程式代碼圖書館。

3.贊贊小屋VBA教學手冊。

4.贊贊小屋Excel教學手冊。

最新文章: