對文件/文件夾的操作需要注意文件是否存在或者打開等異常情況,,不然會報錯,。 (一)重命名/移動語法:Name 原路徑 As 新路徑 可實現(xiàn)對文件(夾)的重命名,、移動操作,,“新路徑”中目錄部分與“原路徑”目錄部分相同則是重命名,,不同則是移動,。 原路徑可能已有數(shù)據(jù),,也可能需要提取,,對于后者,,使用Dir函數(shù)獲取路徑數(shù)據(jù)再進(jìn)行操作即可,對于前者,,則需要對路徑是否存在進(jìn)行判斷,。該操作對文件與文件夾均適用。 1.重命名文件夾(已有路徑數(shù)據(jù))案例如下圖,,判斷C列數(shù)據(jù)后4位對應(yīng)的文件夾是否存在,,如果存在將其重命名為后4位+“權(quán)利人姓名”,如果不存在則將C列對應(yīng)單元格標(biāo)記,。 因為代碼所在工作簿(VBA demo.xls)在主路徑下,,所以待操作子文件夾的路徑為: ThisWorkbook.Path + "\" & Right(Cells(rowIndex, 3).Value, 4)
實現(xiàn)代碼如下:
Sub FolderRename() Dim mainPath As String Dim rowIndex, maxRowIndex, counter As Integer '取工作簿路徑 mainPath = ThisWorkbook.Path maxRowIndex = Range("C65536").End(xlUp).Row counter = 0 Columns("C:C").Interior.Pattern = xlNone For rowIndex = 2 To maxRowIndex '判斷工作簿路徑+C列(右4)數(shù)據(jù)組成的路徑是否存在 If Dir(mainPath + "\" & Right(Cells(rowIndex, 3).Value, 4), vbDirectory) <> "" Then '存在,就把 工作簿路徑+C列(右4)數(shù)據(jù)組成的路徑所表示的文件夾重命名為 工作簿路徑+C列(右4)數(shù)據(jù)+D列數(shù)據(jù)組成的路徑 Name mainPath + "\" & Right(Cells(rowIndex, 3).Value, 4) As mainPath + _ "\" & Right(Cells(rowIndex, 3).Value, 4) & Cells(rowIndex, 4).Value counter = counter + 1 Else '路徑不存在就給對應(yīng)單元格加背景色標(biāo)記 Cells(rowIndex, 3).Interior.Color = 15773696 End If Next rowIndex MsgBox "完成改名,!共改名" & counter & "個文件夾,。" & Chr(10) & "找不到對應(yīng)文件夾的C列數(shù)據(jù)已標(biāo)記為藍(lán)色" End Sub
2.移動文件(沒有路徑數(shù)據(jù))案例為將下圖主路徑下的文件移動到1601文件夾里。首先,,需要獲取文件的路徑(Dir函數(shù)1.1“遍歷文件夾下的文件”)到Excel A列,,在B列組合新文件路徑,然后Name A列原路徑 As B列新路徑即可,。 ※組合新文件路徑可以使用替換,、工作表函數(shù)、VBA代碼等方式實現(xiàn),;加入容錯語句 On Error Resume Next,,可以在發(fā)生錯誤時自動跳過。
上圖A列是文件路徑,B列是組合后的路徑,;下圖是執(zhí)行后的結(jié)果,。
為什么VBA demo.xls 沒有被移動?代碼在此工作簿,,它正處于打開占用狀態(tài),。 為什么代碼沒有報錯?加入了容錯語句 On Error Resume Next
Sub GetFilePath() Columns(1).Clear Dim fileName As String Dim rowIndex As Integer fileName = Dir("C:\Users\Administrator\Desktop\vba\demo\") rowIndex = 1 Do While fileName <> "" Cells(rowIndex, 1).Value = "C:\Users\Administrator\Desktop\vba\demo\" & fileName rowIndex = rowIndex + 1 fileName = Dir Loop End Sub
Sub Move() On Error Resume Next Dim maxRowIndex, lastRowIndex, index As Integer maxRowIndex = Rows.Count lastRowIndex = Cells(maxRowIndex, 1).End(xlUp).Row For index = 1 To lastRowIndex Name Cells(index, 1).Value As Cells(index, 2).Value Next index End Sub
(二)文件復(fù)制/重命名語法:FileCopy “原路徑”, “新路徑”
Sub FileCopyDemo() FileCopy "F:\vstorredist.exe", "F:\C#\vstorredist.exe" End Sub
該語句還可以實現(xiàn)在復(fù)制過程中給文件改名,,相比較Name 原路徑 As 新路徑來說,,使用FileCopy語句進(jìn)行重命名是“安全”的。
Sub FileCopyDemo() FileCopy "F:\vstorredist.exe", "F:\C#\vstorredist1.exe" End Sub
關(guān)于批量處理的樣本代碼,,即: 在工作表中取路徑,、以及是否需要判斷路徑存在、如何判斷在“(一)重命名/移動”中已經(jīng)說明,,下不復(fù)述,。 (三)刪除文件語法:Kill “文件路徑” 1.遍歷刪除特定文件既然是刪除特定文件,那必然是有一個判斷的過程,,常用InStr函數(shù)判斷字符串是否存在,。本例是要刪除下圖擴展名為“.txt”的文件。路徑均存在,,故代碼中不做存在判斷,。
Sub KillTxt() Dim maxRow, lastRow, index As Integer maxRow = Rows.Count '取工作表行數(shù) '從B列最大行索引位置向前找到最后一個非空單元格,取其行號 lastRow = Cells(maxRow, 2).End(xlUp).Row For index = 2 To lastRow Step 1 '如果路徑中存在“txt”,,即索引大于0…… If InStr(Cells(index, 2).Value, "txt") > 0 Then Kill Cells(index, 2).Value End If Next index End Sub
2.通配符匹配刪除你一定遇到過文件復(fù)制重復(fù)出現(xiàn)下圖中的情況,,這種情況適合用通配符去匹配刪除。 還記得通配符嗎,?在“一,、獲取文件夾、文件路徑——1.2使用通配符匹配文件”,。
Sub KillAllMatchFile() Kill "C:\Users\Administrator\Desktop\vba\demo\1601\* (?).xlsx" End Sub
(四)創(chuàng)建/刪除文件夾1.創(chuàng)建文件夾語法:Mkdir path 必要的 path 參數(shù)是用來指定所要創(chuàng)建的目錄或文件夾的字符串表達(dá)式,。path 可以包含驅(qū)動器。如果沒有指定驅(qū)動器,,則MkDir 會在當(dāng)前驅(qū)動器上創(chuàng)建新的目錄或文件夾,。 在案例代碼中使用自定義函數(shù)GetMainDirectory獲取了主文件夾路徑,然后與表格A列的數(shù)據(jù)組成新文件夾路徑以創(chuàng)建文件夾,。 ※自定義GetMainDirectory使用Application.FileDialog屬性打開“文件瀏覽對話框”拾取路徑,,可參考“一、獲取文件夾,、文件路徑——(二)Application.FileDialog屬性(番外篇)”,。
Sub CreateFolder() Dim maxRow, lastRow, index As Integer Dim MainDirectory As String MainDirectory = GetMainDirectory(msoFileDialogFolderPicker) & "\" maxRow = Rows.Count lastRow = Cells(maxRow, 1).End(xlUp).Row For index = 1 To lastRow Step 1 MkDir MainDirectory & Cells(index, 1).Value Next index End Sub
Function GetMainDirectory(ByVal DialogType As MsoFileDialogType) As String With Application.FileDialog(DialogType) If .Show = True Then GetMainDirectory = .SelectedItems(1) End If End With End Function
2.刪除文件夾語法:Rmdir path 必要的 path 參數(shù)是一個字符串表達(dá)式,,用來指定要刪除的目錄或文件夾。path 可以包含驅(qū)動器,。如果沒有指定驅(qū)動器,,則 RmDir 會在當(dāng)前驅(qū)動器上刪除目錄或文件夾。如果想要使用 RmDir 來刪除一個含有文件的目錄或文件夾,,則會發(fā)生錯誤,。在試圖刪除目錄或文件夾之前,先使用 Kill 語句來刪除所有文件,,即只能刪除空文件夾,。 該函數(shù)實際用到的地方不多,不建議使用,。 |
|