VBA学习笔记5:对文件路径的获取

 VBA中经常需要对文件夹里的XLS文件进行打开、复制粘贴等操作,可以直接在代码中指定文件路径,但如果是要批量打开多个文件,就要想办法把所有的文件名存到数组里再一一读取。可以使用Application的FileDialog方法,来获取文件或文件夹的路径,再使用Dir函数读取具体的文件名。

调用FileDialog方法可以使用with语句构建,如下:

With Application.FileDialog(msoFileDialogFolderPicker)

End With

括号里面的参数可以有四种选择,分别是msoFileDialogFilePicker-允许用户选择文件,msoFileDialogFolderPicker-允许用户选择文件夹,msoFileDialogOpen-允许用户打开文件,msoFileDialogSaveAs-允许用户保存文件。直接运行此语句就会跳出文件对话框。这里以文件夹举例。

接下来就可以在with语句内部对文件对话框框的选择结果进行操作。这里涉及到FileDialog的show方法,show方法返回-1(操作)或者0(取消)。FileDialog还有一个SelectedItems属性,会返回一个集合,里面是所选文件的路径列表。可以用一个简单的语句理解.show和.SelectedItems的使用:

If .Show = -1 Then

    PathStr = .SelectedItems(1)

    MsgBox PathStr

Else

    MsgBox "Cancel"

End If

如果选了文件夹并点了确定按钮,Msg就会显示出所选文件夹的路径;如果选了取消,Msg就显示Cancel。实际应用中,通常在.Show返回0的情况后面跟Exit Sub,退出程序。


需要注意的是,如果上面的例子我们没有使用选择文件夹的参数,而是msoFileDialogOpen或msoFileDialogSaveAs,在文件对话框里选择了文件并确定后,系统并不会真的执行Open或者Save动作,而是要再写Workbook.Open语句进行操作。

FileDialog的参数可以使用msoFileDialogFilePicker来选择多个文件,因为.SelectedItems返回的是一个集合,包括所有选中的文件名,所以可以使用循环for each依次提取文件名,并赋值到数组里以便日后引用。注意以下语句要写在With Application.FileDialog(...)里。

Dim vrtSelectedItem As Variant, File()

For Each vrtSelectedItem In .SelectedItems    'vrtSelectedItem会返回文件的路径

    n = n + 1

    ReDim Preserve File(1 To n)

    File(n) = vrtSelectedItem

Next

也可以使用前面例子里获取的文件夹的路径,结合Dir函数,跳出With进行数组赋值。

FileStr = Dir(PathStr & "\" & "*.xlsx")

Dir函数可以使用通配符,以上语句返回的是PathStr文件夹(前例获得)下,所有xlsx文件中的第一个xlsx文件的完整路径。

Dir有个特性是,首次调用必须指定pathname,即文件夹路径,而后续调用时无需再指定文件夹路径,直接用Dir()就可以返回其他与pathname匹配的文件名,直到不再有可匹配的文件。如上例,语句运行后返回0.xlsx,再运行一次Dir(),返回1.xlsx,再运行Dir(),返回2.xlsx,我的文件夹里共有6个文件,直到第7次Dir(),返回""。基于这个特性,可以使用循环来为数组赋值。

FileStr = Dir(PathStr & "\" & "*.xlsx")

While Len(FileStr) > 0

    n = n + 1

    ReDim Preserve File(1 To n)

    File(n) = PathStr & "\" & FileStr

    FileStr = Dir()

Wend

我觉得直接在with里面循环获取所有文件的路径的方法更好,更直接一些,因为使用Dir函数还要考虑字符串的组合问题。


评论