对文件/文件夹的操作需要注意文件是否存在或者打开等异常情况,不然会报错。
语法:Name原路径 As 新路径
可实现对文件(夹)的重命名、移动操作,“新路径”中目录部分与“原路径”目录部分相同则是重命名,不同则是移动。
原路径可能已有数据,也可能需要提取,对于后者,使用Dir函数获取路径数据再进行操作即可,对于前者,则需要对路径是否存在进行判断。该操作对文件与文件夹均适用。
案例如下图,判断C列数据后4位对应的文件夹是否存在,如果存在将其重命名为后4位+“权利人姓名”,如果不存在则将C列对应单元格标记。
因为代码所在工作簿(VBAdemo.xls)在主路径下,所以待操作子文件夹的路径为:
ThisWorkbook.Path + "\"& Right(Cells(rowIndex, 3).Value, 4)
实现代码如下:
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)数据组成的路径是否存在
If Dir(mainPath+ "\" & Right(Cells(rowIndex,3).Value,4),vbDirectory) <> "" Then
'存在,就把 工作簿路径+C列(右4)数据组成的路径所表示的文件夹重命名为 工作簿路径+C列(右4)数据+D列数据组成的路径
Name mainPath + "\" & Right(Cells(rowIndex,3).Value,4) As mainPath + _
"\" & Right(Cells(rowIndex,3).Value,4) &Cells(rowIndex, 4).Value
counter =counter + 1
Else
'路径不存在就给对应单元格加背景色标记
Cells(rowIndex,3).Interior.Color= 15773696
End If
NextrowIndex
MsgBox "完成改名!共改名" & counter & "个文件夹。" &Chr(10) &"找不到对应文件夹的C列数据已标记为蓝色"
End Sub
案例为将下图主路径下的文件移动到1601文件夹里。首先,需要获取文件的路径(Dir函数1.1“遍历文件夹下的文件”)到Excel A列,在B列组合新文件路径,然后Name A列原路径 As B列新路径即可。
※组合新文件路径可以使用替换、工作表函数、VBA代码等方式实现;加入容错语句 OnError Resume Next,可以在发生错误时自动跳过。
上图A列是文件路径,B列是组合后的路径;下图是执行后的结果。
为什么VBA demo.xls 没有被移动?代码在此工作簿,它正处于打开占用状态。
为什么代码没有报错?加入了容错语句 On Error Resume Next
Sub GetFilePath()
Columns(1).Clear
DimfileName As String
DimrowIndex 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
DimmaxRowIndex, 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
语法:FileCopy “原路径”,“新路径”
Sub FileCopyDemo()
FileCopy "F:\vstorredist.exe", "F:\C#\vstorredist.exe"
End Sub
该语句还可以实现在复制过程中给文件改名,相比较Name 原路径As 新路径来说,使用FileCopy语句进行重命名是“安全”的。
Sub FileCopyDemo()
FileCopy "F:\vstorredist.exe", "F:\C#\vstorredist1.exe"
End Sub
关于批量处理的样本代码,即:
在工作表中取路径、以及是否需要判断路径存在、如何判断在“(一)重命名/移动”中已经说明,下不复述。
语法:Kill “文件路径”
既然是删除特定文件,那必然是有一个判断的过程,常用InStr函数判断字符串是否存在。本例是要删除下图扩展名为“.txt”的文件。路径均存在,故代码中不做存在判断。
Sub KillTxt()
Dim maxRow,lastRow, index As Integer
maxRow = Rows.Count '取工作表行数
'从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
你一定遇到过文件复制重复出现下图中的情况,这种情况适合用通配符去匹配删除。
还记得通配符吗?在“一、获取文件夹、文件路径——1.2使用通配符匹配文件”。
Sub KillAllMatchFile()
Kill "C:\Users\Administrator\Desktop\vba\demo\1601\*(?).xlsx"
End Sub
语法:Mkdir path
必要的 path 参数是用来指定所要创建的目录或文件夹的字符串表达式。path 可以包含驱动器。如果没有指定驱动器,则MkDir会在当前驱动器上创建新的目录或文件夹。
在案例代码中使用自定义函数GetMainDirectory获取了主文件夹路径,然后与表格A列的数据组成新文件夹路径以创建文件夹。
※自定义GetMainDirectory使用Application.FileDialog属性打开“文件浏览对话框”拾取路径,可参考“一、获取文件夹、文件路径——(二)Application.FileDialog属性(番外篇)”。
Sub CreateFolder()
Dim maxRow,lastRow, index As Integer
DimMainDirectory 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
WithApplication.FileDialog(DialogType)
If .Show= True Then
GetMainDirectory =.SelectedItems(1)
End If
End With
End Function
语法:Rmdir path
必要的 path 参数是一个字符串表达式,用来指定要删除的目录或文件夹。path 可以包含驱动器。如果没有指定驱动器,则RmDir 会在当前驱动器上删除目录或文件夹。如果想要使用 RmDir 来删除一个含有文件的目录或文件夹,则会发生错误。在试图删除目录或文件夹之前,先使用 Kill 语句来删除所有文件,即只能删除空文件夹。
该函数实际用到的地方不多,不建议使用。
联系客服