天天看點

xcopy複制檔案夾及其子檔案_VBA學習筆記48:VBA檔案夾操作

xcopy複制檔案夾及其子檔案_VBA學習筆記48:VBA檔案夾操作

學習資源:《Excel VBA從入門到進階》第48集 by蘭色幻想

忘了之前老師有沒有講過Dir函數了,還是寫一下吧,再開始正文吧:

Dir函數:

傳回一個

String

,它表示與指定路徑下的檔案、目錄或檔案夾的名稱。

文法:Dir ( pathname, 屬性 )

①pathname:指定位址,第一次調用必填。

若要擷取與 pathname 比對的任何其他檔案名,請重新調用

Dir

且不填寫參數。

簡單舉例:

filename = Dir("C:" & "*.doc")  ‘在C槽查找word檔案,并傳回word文檔的名稱給filename
filename2 = Dir                  '再次調用Dir,在C槽查找第二份word檔案,并傳回它的文檔名給filename2
           

Dir查找周遊的順序是按照系統排序。如果對排序有要求,可用數組存儲檔案名,然後對數組進行排序。

一般會搭配循環周遊檔案,結束循環的條件為Dir傳回空值。

當不再有比對的檔案名時,

Dir

将傳回零長度字元串 ("")。在傳回零長度字元串後,後續再調用需重新填寫參數pathname,否則将發生錯誤。

②屬性:選填,有如下屬性c:

xcopy複制檔案夾及其子檔案_VBA學習筆記48:VBA檔案夾操作

本節課中Dir函數第二個參數主要使用vbNormal(預設,即不寫),和 vbDirectory(可以傳回路徑下的指定檔案和檔案夾)。

一、檔案夾基本操作 1. 判斷檔案夾是否存在

使用dir函數去判斷檔案夾路徑,如果結果為"",則表示不存在。

例1:判斷目前檔案路徑下是否存在"2011年報表2"檔案夾。

Sub w1()

If Dir(ThisWorkbook.path & "2011年報表2", vbDirectory) = "" Then
    MsgBox "不存在"
Else
    MsgBox "存在"
End If

End Sub
           
2. 建立檔案夾

Mkdir語句,建立一個檔案夾。

文法:MkDir 路徑

例2:在目前檔案路徑下建立"Test"檔案夾。

Sub w2()
   MkDir ThisWorkbook.path & "Test"
End Sub
           
3. 删除檔案夾

RmDir語句可以删除一個空的檔案夾。

文法:RmDir 路徑

例3:删除目前檔案路徑下的"Test"檔案夾。

Sub w3()
    RmDir ThisWorkbook.path & "Test"
End Sub
           

但注意:RmDir隻能删除空檔案夾,如果使用 RmDir 來删除一個含有檔案的目錄或檔案夾,會發生錯誤(如下圖提示)。是以在試圖删除目錄或檔案夾之前,先使用 Kill 語句來删除所有檔案。

xcopy複制檔案夾及其子檔案_VBA學習筆記48:VBA檔案夾操作

增加一句kill語句,清空Test檔案夾下的所有檔案:

Sub w3()
    Kill ThisWorkbook.Path & "Test*"
    RmDir ThisWorkbook.Path & "Test"
End Sub
           
4. 檔案夾重命名

使用Name語句重命名。

文法:Name 路徑/舊檔案名 as 路徑/新檔案名

例4:把"Test"檔案夾重命名為“Test2”。

Sub w4()
    Name ThisWorkbook.path & "Test" As ThisWorkbook.path & "Test2"
End Sub
           
5. 檔案夾移動

同樣使用name方法,可以達到移動的效果,而且連檔案夾的檔案一起移動。

例5:把"Test2"檔案夾移動到“2011年報表”檔案夾下。

Sub w5()
    Name ThisWorkbook.Path & "Test2" As ThisWorkbook.Path & "2011年報表Test2"
End Sub
           
6. 檔案夾複制

用FileSystemObject對象的CreateObject方法(CopyFolder方法)複制檔案夾。

文法:object.CopyFolder source, destination[, overwrite]

object:必須, FileSystemObject對象的名字。

source:必須,指明一個或多個被複制檔案夾的字元串檔案夾說明,可包括通配符,如*。destination:必須,被複制檔案夾和子檔案夾的接受端的字元串,不允許有通配符。

overwrite:可選,表示已存在的檔案夾是否被覆寫。如果為True,檔案被覆寫,如果為False,檔案不被覆寫。預設值為True。

例6:把"Test2"檔案夾複制到“2011年報表”檔案夾下,設定可複制相同名稱檔案夾。

Sub CopyFile_fso()

Dim fso As Object
Set fso = CreateObject("Scripting.FileSystemObject")
fso.CopyFolder ThisWorkbook.Path & "Test2", ThisWorkbook.Path & "2011年報表",1

End Sub
           
7. 打開檔案夾

使用shell函數桌面管理程式打開檔案夾。

文法:shell “explorer 路徑”

例7:打開“2011年報表”檔案夾。

Sub w7()
    Shell "explorer.exe " & ThisWorkbook.Path & "2011年報表", 1
End Sub
           

注:"explorer.exe "後面有個空格,不能漏寫!

二、周遊檔案夾中的檔案
  1. 周遊指定檔案夾中的檔案 dir+循環

例:擷取“2011年報表”檔案夾下所有EXCEL檔案的名稱。

用dir擷取檔案夾中的檔案,再用Do Loop語句循環記錄。

Sub 周遊檔案()

Dim Filename As String, mypath As String, k As Integer
mypath = ThisWorkbook.Path & "2011年報表"
Range("A1:A10") = ""                           '先清空要填寫的單元格區域(加快程式運作)
Filename = Dir(mypath & "*.xls")               '

Do
    k = k + 1
    Cells(k, 1) = Filename
    Filename = Dir
Loop Until Filename = ""

End Sub
           
xcopy複制檔案夾及其子檔案_VBA學習筆記48:VBA檔案夾操作

運作結果展示

2. 周遊子檔案 dir(,

vbDirectory

)+循環+檔案名判斷

dir第二個參數是vbdirectory可以傳回路徑下的指定檔案和檔案夾。

例:擷取“2011年報表”檔案夾下所有檔案夾的名稱。

檔案夾路徑不像檔案名的格式是“*

.

*”,是以增加檔案名判斷。

Sub 周遊子檔案()

Dim Filename As String, mypath As String, k As Integer
mypath = ThisWorkbook.Path & "2011年報表"
Range("A1:A10") = ""
Filename = Dir(mypath, vbDirectory)

Do

    If Not Filename Like "*.*" Then      '如檔案名不像"*.*",則判斷為檔案名可進行記錄。
        k = k + 1
        Cells(k, 1) = Filename
    End If
    
    Filename = Dir
    
Loop Until Filename = ""

End Sub
           
xcopy複制檔案夾及其子檔案_VBA學習筆記48:VBA檔案夾操作

運作結果顯示

把判斷語句注釋掉,看看運作結果是如何的:

xcopy複制檔案夾及其子檔案_VBA學習筆記48:VBA檔案夾操作

沒做檔案名判斷

它會把檔案夾下所有檔案的名稱都粘貼上去,是以記得要做判斷。

檔案夾周遊是很常用,還會再講一節,整理好筆記,明天再發啦。

以上,晚安。