分享

二、VB语句操作目录与文件

 iamyounger 2018-09-16

对文件/文件夹的操作需要注意文件是否存在或者打开等异常情况,不然会报错。

(一)重命名/移动

语法:Name 原路径 As 新路径

可实现对文件(夹)的重命名、移动操作,“新路径”中目录部分与“原路径”目录部分相同则是重命名,不同则是移动。

原路径可能已有数据,也可能需要提取,对于后者,使用Dir函数获取路径数据再进行操作即可,对于前者,则需要对路径是否存在进行判断。该操作对文件与文件夹均适用。

1.重命名文件夹(已有路径数据)

案例如下图,判断C列数据后4位对应的文件夹是否存在,如果存在将其重命名为后4+“权利人姓名”,如果不存在则将C列对应单元格标记。

因为代码所在工作簿(VBA demo.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

  Next rowIndex

  MsgBox "完成改名!共改名" & counter & "个文件夹。" & Chr(10) & "找不到对应文件夹的C列数据已标记为蓝色"

End Sub

 

2.移动文件(没有路径数据)

案例为将下图主路径下的文件移动到1601文件夹里。首先,需要获取文件的路径(Dir函数1.1“遍历文件夹下的文件”)到Excel A列,在B列组合新文件路径,然后Name  A列原路径 As  B列新路径即可。

※组合新文件路径可以使用替换、工作表函数、VBA代码等方式实现;加入容错语句 On Error Resume Next,可以在发生错误时自动跳过。

 

上图A列是文件路径,B列是组合后的路径;下图是执行后的结果。

为什么VBA demo.xls 没有被移动?代码在此工作簿,它正处于打开占用状态。

为什么代码没有报错?加入了容错语句 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

 

(二)文件复制/重命名

语法: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 “文件路径”

1.遍历删除特定文件

既然是删除特定文件,那必然是有一个判断的过程,常用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

 

 

 

 




2.通配符匹配删除

你一定遇到过文件复制重复出现下图中的情况,这种情况适合用通配符去匹配删除。

还记得通配符吗?在“一、获取文件夹、文件路径——1.2使用通配符匹配文件”。




Sub KillAllMatchFile()

      Kill "C:\Users\Administrator\Desktop\vba\demo\1601\* (?).xlsx"

End Sub

 

(四)创建/删除文件夹

1.创建文件夹

语法:Mkdir path

必要的 path 参数是用来指定所要创建的目录或文件夹的字符串表达式。path 可以包含驱动器。如果没有指定驱动器,则MkDir 会在当前驱动器上创建新的目录或文件夹。

在案例代码中使用自定义函数GetMainDirectory获取了主文件夹路径,然后与表格A列的数据组成新文件夹路径以创建文件夹。

※自定义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 参数是一个字符串表达式,用来指定要删除的目录或文件夹。path 可以包含驱动器。如果没有指定驱动器,则 RmDir 会在当前驱动器上删除目录或文件夹。如果想要使用 RmDir 来删除一个含有文件的目录或文件夹,则会发生错误。在试图删除目录或文件夹之前,先使用 Kill 语句来删除所有文件,即只能删除空文件夹。

该函数实际用到的地方不多,不建议使用。


    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多