VBA代碼大全010:用vba遍歷文件夾及其子文件夾內的文件

2021-02-18 水星Excel

vba老手都知道,vba寫多了,其實都是在做循環。

循環處理多個單元格的內容,循環處理多個工作表的內容,循環處理多個工作簿的內容。

其中又以循環處理多個文件最為頻繁,一個excel工作簿內的內容循環有些人還可以藉助函數來實現,但是涉及到多個文件的循環處理時,用函數就顯得無力回天,這時候就需要祭出vba大招了。

我們經常遇到的是這樣的場景,需要處理的數據位於多個不同的文件,這時候就涉及到對每個文件的逐一讀取,也就是遍歷文件。

在vba中遍歷文件可以有多種方法,有用dir函數遍歷的,也有用FileSystemObject對象遍歷的,對比之下,用FileSystemObject對象功能齊全,可以延伸做其它事情。

以下是一個通用的遍歷文件夾下的文件的代碼,可以包含是否遍歷子文件夾:

Sub begin()    Excel.Application.ScreenUpdating = False    Excel.Application.DisplayAlerts = False    Excel.Application.Calculation = xlCalculationManual    Dim sPath As String    '選擇要操作的文件夾    sPath = GetPath()    If Len(sPath) Then        '開始遍歷選中的文件夾中的所有文件        EnuAllFiles sPath, False        MsgBox "操作完成!!!"    End If    Excel.Application.Calculation = xlCalculationAutomatic    Excel.Application.DisplayAlerts = True    Excel.Application.ScreenUpdating = TrueEnd Sub'遍歷文件夾及其子文件夾的通用過程,'sPath參數表示要遍歷的文件夾的路徑,bEnuSub可選參數表示是否遍歷子文件夾,不提供表示不遍歷子文件夾'QQ:1722187970,微信:xycgenius,公眾號:水星excelSub EnuAllFiles(ByVal sPath As String, Optional bEnuSub As Boolean = False)    '定義文件系統對象    Dim oFso As Object    Set oFso = CreateObject("Scripting.FileSystemObject")    '定義文件夾對象    Dim oFolder As Object    Set oFolder = oFso.GetFolder(sPath)    '定義文件對象    Dim oFile As Object    Dim oWB  As Workbook    Dim oWK As Worksheet    Dim oWB1  As Workbook    Dim oWK1 As Worksheet    Set oWB = Excel.ThisWorkbook    Set oWK = oWB.Worksheets(1)    iRow = oWK.Range("A65536").End(xlUp).Row    '如果指定的文件夾含有文件    If oFolder.Files.Count Then        For Each oFile In oFolder.Files            With oFile                '輸出文件所在的盤符                Dim sDrive As String                sDrive = .Drive                '輸出文件的類型                Dim sType As String                sType = .Type                '輸出含後綴名的文件名稱                Dim sName As String                sName = .Name                '輸出含文件名的完整路徑                Dim sFilePath As String                sFilePath = .Path                 '輸出文件的上次修改時間                Dim dDLM                dDLM = .DateLastModified                 '輸出文件的上次訪問時間                Dim dDLA                dDLA = .DateLastAccessed                 '輸出文件的創建時間                Dim dDC                dDC = .DateCreated                 '輸出文件的屬性                Dim sATT                sATT = .Attributes                '如果文件是Excel文件且不是隱藏文件                If sType Like "*Excel*" And Not (sName Like "*~$*") Then                    Set oWB1 = Excel.Workbooks.Open(sFilePath)                    With oWB1                        Set oWK1 = .Worksheets(1)                        With oWK1                            iRow = .Range("a65536").End(xlUp).Row                            '***********************************                            '其它操作代碼                            '***********************************                        End With                        Excel.Application.Calculation = xlCalculationAutomatic                        .Close                    End With                Else
End If End With Next '如果指定的文件夾不含有文件 Else End If '如果要遍歷子文件夾 If bEnuSub = True Then '定義子文件夾集合對象 Dim oSubFolders As Object Set oSubFolders = oFolder.SubFolders If oSubFolders.Count > 0 Then For Each oTempFolder In oSubFolders sTempPath = oTempFolder.Path Call EnuAllFiles(sTempPath, True) Next End If Set oSubFolders = Nothing End If Set oFile = Nothing Set oFolder = Nothing Set oFso = NothingEnd SubFunction GetPath() As String '聲明一個FileDialog對象變量 Dim oFD As FileDialog' '創建一個選擇文件對話框' Set oFD = Application.FileDialog(msoFileDialogFilePicker) '創建一個選擇文件夾對話框 Set oFD = Application.FileDialog(msoFileDialogFolderPicker) '聲明一個變量用來存儲選擇的文件名或者文件夾名稱 Dim vrtSelectedItem As Variant With oFD '允許選擇多個文件 .AllowMultiSelect = True '使用Show方法顯示對話框,如果單擊了確定按鈕則返回-1。 If .Show = -1 Then '遍歷所有選擇的文件 For Each vrtSelectedItem In .SelectedItems '獲取所有選擇的文件的完整路徑,用於各種操作 GetPath = vrtSelectedItem Next '如果單擊了取消按鈕則返回0 Else End If End With '釋放對象變量 Set oFD = NothingEnd Function

上述代碼通過遞歸的方式逐級遍歷文件夾及其子文件,通過參數的設置可以選擇是否遍歷子文件夾。

基本上可以解決任何遍歷文件夾的需求。

在看和轉發分享就是最大的支持

相關焦點

  • 【代碼合集】VBA操作文件夾代碼合集
    本篇文章把操作文件夾的代碼整理了一個合集。給大家收藏備用,希望各取所需。第二參數用來指定文件屬性,常用的幾種屬性如下: vbNormal 0 標準文件 vbReadOnly 1 只讀文件 vbHidden 2 隱藏文件 vbDirectory 16 文件夾這裡我們要判斷某個文件夾是否存在,用的是vbDirectory
  • Qt:選取文件夾 遍歷子文件夾和文件
    採用遞歸和QDir實現文件夾下所有文件遍歷的方法#ifndef MAINWINDOW_H
  • GO語言:遍歷文件夾
    學習io之後,尤其是文件操作,我們就可以遍歷給定的目錄文件夾了。可以使用ioutil包下的readDir()方法,這個方法可以獲取指定目錄下的內容,返回文件和子目錄。
  • VBA代碼中CopyFolder方法複製文件夾的通用過程
    大家好,我們今日繼續講解VBA代碼解決方案的第71講內容:利用Windows Scripting Host(WSH),複製文件夾如果需要複製文件夾,可以使用CopyFolder方法。b) source是必須的,指明一個或多個被複製文件夾的字符串文件夾說明,可以包括通配符。c) destination是必須的,被複製文件夾和子文件夾的接受端的字符串,不允許有通配符。d) overwrite是可選的,表示已存在的文件夾是否被覆蓋。
  • VBA: 遍歷文件抓取指定條件的數據
    ,每個文件夾內有各班的考試成績表(見下圖)。 各個控制項內的代碼如下所示:Option ExplicitOption Base 1'存儲數據Dim data(), flag As Integer1    folder = TextBox1.Text    searchdata folder        '3 遍歷文件夾2    folder = TextBox2.Text    searchdata folder        '4 數據匯總        tarSheet.Range("A2").Resize
  • python筆記4-遍歷文件夾目錄os.walk()
    前言如何遍歷查找出某個文件夾內所有的子文件呢?
  • 用Python遍歷文件夾下的所有文件並進行數據處理(Pathlib簡介)
    如果用excel來一個個處理的話需要處理128次,想想就覺得費力啊!那麼這個時候用上我們的pandas就再合適不過了。這個時候有些朋友會有些疑惑,我們該如何遍歷這些文件並讀取數據呢?本文就通過os庫以及pathlib庫為大家講解,並在最後重點介紹一下pathlib。
  • VBA常用代碼:批量獲取指定文件夾下的文件名
    今天說說如何獲取指定文件夾下文件的名稱。很久以前我們分享過DOS的方法,操作動畫如下:代碼的核心是DIR語句,注釋部分業已作了解釋,這裡就不再囉嗦了。Sub FileDir()    Dim p$, f$, k&        '獲取用戶選擇文件夾的路徑    With Application.FileDialog(msoFileDialogFolderPicker)   '選擇文件夾        .AllowMultiSelect = False
  • Python內置的文件夾操作
    1、獲取文件夾路徑:絕對路徑和相對路徑Python中通過os模塊提供的getcwd()方法獲取當前工作文件夾如代碼位於G:\Projectfile\image\test.py,運行如下代碼import os
  • 如何獲取全部文件名稱(含子文件夾)?
    比如下面根據路徑獲取文件夾對象,輸入 getfo就會調出來 GetFolder 方法講解02 | 獲取指定路徑下的全部文件夾(不含子級)非常簡單,說白了,就是FSO這個類封裝好了一些常用方法,我們只要知道語法去調用,不需要知道內部如何去實現的!
  • 【Excel VBA】批量提取文件夾下文件名
    如何獲取指定文件夾下文件的名稱
  • VBA: 獲取單元格內超連結文件的絕對路徑
    相對路徑,它相對於程序的當前工作目錄。        對於點(.)和點點(..)文件夾,它們不是真正的文件夾,而是可以在路徑中使用的特殊名稱。單個的句點(「點」)用作文件夾目錄名稱時,是「這個目錄」的縮寫。兩個句點(「點點」)的意思是父文件夾。
  • Excel VBA 操作文件(夾)神器——FSO對象
    FSO 對象模型可以實現文件(夾)的創建、改變、移動和刪除等常見操作,也可以獲取文件(夾)的名稱、大小、屬性、創建日期或最近修改日期等信息,還可以檢測是否存在指定的文件夾。通過FSO 對象模型可以獲取當前系統驅動器信息,如驅動器的種類(CD-ROM還是可移動磁碟)、磁碟剩餘空間等等。
  • Excel VBA和文件夾-1.9獲得文件的最後修改時間-即用型
    前景提要VBA和文件夾的一些知識點,分享到這裡已經差不多了,基本上常用的幾種方法都已經告訴大家了,後面就是綜合自己日常工作中的各種要求來套用了,後面幾篇我們主要分享一些和文件夾相關的一些代碼,稍作修改就可以拿來即用的,這些功能並不是很長用,但是需要的時候非常的實用
  • 文件太多找不到咋整?用excel製作文件管理器,所有版本皆可使用
    >宏表函數是早期低版本excel的產物,它是vba的前身,現在已經被vba完全取代了,但是我們仍然可以使用它,只不過需要通過定義名稱來使用。,因為宏表函數本質上也是vba,vba是無法刷新數據的,我們使用重新再運行一次三、製作文件管理器緊接著我們在文件路徑中輸入函數; =IFERROR("F:\文件\"&INDEX(ww,ROW(A1)),"")來獲取文件路徑在文件名中輸入函數:=IFERROR(INDEX(ww
  • VBA基礎入門(24)FSO CopyFile
    上期我們分享了《VBA基礎入門(23)初識FSO;文件,文件夾的遍歷 》了解了如何遍歷文件夾獲取每個文件的名字
  • PyQt5中文件及文件夾操作
    判斷是否隱藏isReadable()判斷是否可讀isWritable()判斷是否可寫isExecutable()判斷是否可執行3、使用QDir類操作文件夾QDir類提供對文件夾結構及其內容的訪問,對文件夾進行創建、重命名、刪除、遍歷等操作。
  • VBA如何移動文件夾,如何為電腦定製程序
    大家好,今日內容仍是和大家分享VBA編程中常用的簡單「積木」過程代碼,這些內容大多是取至我編寫的「VBA代碼解決方案」教程中內容。NO.183-NO.184內容是:NO. 188:在VBA中使用MoveFolder方法將文件夾移動NO. 189:在VBA中使用工作簿打開時判斷電腦的名稱,實現量身定做NO. 190:在VBA中使用工作簿打開時判斷電腦的名稱,實現量身定做2
  • Linux怎麼刪除文件夾及其下所有文件?
    而 Linux 沒有回收站的說法,所以用命令刪除文件或文件夾都要格外小心,boke112 也是輸入刪除命令反覆確認後才敢按回車鍵刪除。為了以後刪除文件需要特意將 Linux 刪除文件夾及其下所有文件的命令分享給大家。
  • 強制刪除文件夾及文件
    System.currentTimeMillis(); System.out.println("總共耗時:"+((okTime-firstTime)/1000)+"秒"); } catch (IOException e) { e.printStackTrace(); } } /** * 刪除文件夾下所有內容