| excelperfect 很多時候,我們都想要遍歷文件夾中的每個文件,例如在工作表中列出所有文件名、對每個文件進行修改。VBA給我們提供了一些方式:(1)Dir函數(shù);(2)File System Object。 使用Dir函數(shù) Dir函數(shù)是一個內置的VBA函數(shù),可用于可使用VBA的任何應用程序。 使用File System Object(FSO) File System Object(FSO)是一個單獨的操作庫,我們可以在VBA代碼中使用它。有兩種方法可以打開FSO庫,即早期綁定或后期綁定。如果你不確定要使用哪個,建議使用后期綁定。它可能會導致代碼速度變慢,但運行時的錯誤應該更少。 早期綁定 在VBE編輯器中,單擊“工具——引用”。在“引用”對話框中,找到并選取“MicrosoftScripting Runtime”,單擊“確定”按鈕。 圖1 后期綁定 后期綁定不需要任何特定操作來啟用FSO庫,確保在VBA代碼中需要時打開庫。 遍歷文件夾中所有文件 下面的示例代碼將文件名打印到立即窗口,很容易修改這些代碼以更適合你的具體情況。 方法1:使用Dir函數(shù) Sub LoopAllFilesInAFolder() '遍歷文件夾中的所有文件 Dim fileName As Variant fileName =Dir('D:\excelperfect\') While fileName <> '' '插入對每個文件要執(zhí)行的操作 '本示例代碼打印文件名到立即窗口 Debug.Print fileName '設置fileName指向下一個文件 fileName = Dir Wend End Sub 上面的代碼可以很容易地通過使用通配符進行調整。例如: '遍歷帶有擴展名”.xlsx”的每個文件 filename =Dir(“D:\excelperfect\*.xlsx”) '遍歷文件名中包含單詞”January”的每個文件 filename =Dir(“D:\excelperfect\*January*”) '遍歷文件夾中的每個文本文件 filename =Dir(“D:\excelperfect\*.txt”) 方法2:使用File System Object(FSO)后期綁定 Sub LoopAllFilesInFolder1() Dim folderName As String Dim FSOLibrary As Object Dim FSOFolder As Object Dim FSOFile As Object '將文件名賦值給變量 folderName = 'D:\excelperfect\' '設置對FSO庫的所有引用 Set FSOLibrary =CreateObject('Scripting.FileSystemObject') Set FSOFolder =FSOLibrary.GetFolder(folderName) Set FSOFile = FSOFolder.Files '使用For Each循環(huán)遍歷文件夾中的每個文件 For Each FSOFile In FSOFile '插入對每個文件要執(zhí)行的操作 ' 本示例代碼打印文件名到立即窗口 Debug.Print FSOFile.Name Next '釋放內存 Set FSOLibrary = Nothing Set FSOFolder = Nothing Set FSOFile = Nothing End Sub 方法3:使用File System Object(FSO)早期綁定 要使用本方法,記得像本文開頭那樣開啟對FSO庫的引用。 Sub LoopFilesInFolder2() Dim folderName As String Dim FSOLibrary As FileSystemObject Dim FSOFolder As Object Dim FSOFile As Object '將文件名賦值給變量 folderName = 'D:\excelperfect\' '設置對FSO庫的所有引用 Set FSOLibrary = New FileSystemObject Set FSOFolder =FSOLibrary.GetFolder(folderName) Set FSOFile = FSOFolder.Files '使用For Each循環(huán)遍歷文件夾中的每個文件 For Each FSOFile In FSOFile '插入對每個文件要執(zhí)行的操作 ' 本示例代碼打印文件名到立即窗口 Debug.Print FSOFile.Name Next '釋放內存 Set FSOLibrary = Nothing Set FSOFolder = Nothing Set FSOFile = Nothing End Sub 遍歷子文件夾中所有文件 當文件存儲在子文件夾中時,可能就需要一些技巧了?,F(xiàn)在需要找到一種方法來鉆取到這些子文件夾中。我們將使用上述相同的Dir和FSO方法。為了確保這些代碼可以處理任意數(shù)量的子文件夾,宏實際上會調用自身(一種稱為遞歸的技術)。 方法1:使用Dir函數(shù) 這個示例將把完整的文件路徑(文件夾路徑和文件名)打印到立即窗口。 Sub loopAllSubFolderSelectStartDirectory() '調用LoopAllSubFolders過程 Call LoopAllSubFolders('D:\excelperfect\') End Sub Sub LoopAllSubFolders(ByVal folderPath As String) Dim fileName As String Dim fullFilePath As String Dim numFolders As Long Dim folders() As String Dim i As Long If Right(folderPath, 1) <>'\' Then folderPath = folderPath & '\' fileName = Dir(folderPath &'*.*', vbDirectory) While Len(fileName) <> 0 If Left(fileName, 1) <>'.' Then fullFilePath = folderPath &fileName If (GetAttr(fullFilePath) And vbDirectory) = vbDirectory Then ReDim Preserve folders(0 TonumFolders) As String folders(numFolders) =fullFilePath numFolders = numFolders + 1 Else '插入對每個文件要執(zhí)行的操作 '本示例代碼打印完整文件路徑和文件名到立即窗口 Debug.Print folderPath &fileName End If End If fileName = Dir() Wend For i = 0 To numFolders - 1 LoopAllSubFolders folders(i) Next i End Sub 方法2:使用File System Object(FSO)后期綁定 運行下面的過程: Sub loopAllSubFolderSelectStartDirectory1() Dim FSOLibrary As Object Dim FSOFolder As Object Dim folderName As String '將文件夾名賦值給變量 folderName = 'D:\excelperfect\' '設置對FSO庫的引用 Set FSOLibrary = CreateObject('Scripting.FileSystemObject') '調用LoopAllSubFolders1過程 LoopAllSubFolders1 FSOLibrary.GetFolder(folderName) End Sub SubLoopAllSubFolders1(FSOFolder As Object) Dim FSOSubFolder As Object Dim FSOFile As Object '遍歷每個子文件夾 For Each FSOSubFolder In FSOFolder.SubFolders LoopAllSubFolders1 FSOSubFolder Next '遍歷每個文件并打印名字 For Each FSOFile In FSOFolder.Files '插入對每個文件要執(zhí)行的操作 '本示例代碼打印完整文件路徑和文件名到立即窗口 Debug.Print FSOFile.Path Next End Sub 方法3:使用File System Object(FSO)早期綁定 要使用本方法,記得像本文開頭那樣開啟對FSO庫的引用。 Sub loopAllSubFolderSelectStartDirectory2() Dim FSOLibrary As FileSystemObject Dim FSOFolder As Object Dim folderName As String '將文件夾名賦值給變量 folderName = 'D:\excelperfect\' '設置對FSO庫的引用 Set FSOLibrary = New FileSystemObject '調用LoopAllSubFolders2過程 LoopAllSubFolders2 FSOLibrary.GetFolder(folderName) End Sub Sub LoopAllSubFolders2(FSOFolder As Object) Dim FSOSubFolder As Object Dim FSOFile As Object '遍歷每個子文件夾 For Each FSOSubFolder In FSOFolder.SubFolders LoopAllSubFolders2 FSOSubFolder Next '遍歷每個文件并打印名字 For Each FSOFile In FSOFolder.Files '插入對每個文件要執(zhí)行的操作 '本示例代碼打印完整文件路徑和文件名到立即窗口 Debug.Print FSOFile.Path Next End Sub 注:本文整理自exceloffthegrid.com,供有興趣的朋友學習參考。 | 
|  | 
來自: hercules028 > 《VBA》