学习资源:《Excel VBA从入门到进阶》第34集 by兰色幻想
这篇笔记写对话框的FileDialog对象。开始前先把上篇漏写的改变窗口默认路径补一下。
chdrive 盘符 可以改变默认驱动器
chdir 路径 可以改变默认路径
这两个默认路径的设置都是长期的,直到重新设置才会变更过来。代码位置如下例:
Sub t6()
Dim f
ChDrive "E" '改变默认驱动器为E盘
'ChDir ThisWorkbook.Path '改变默认路径为当前路径(就不另写例子了)
f = Application.GetOpenFilename("Excel2003文件,*.xls,Word文件,*.doc,文本文件,*.txt", 1, MultiSelect:=True)
MsgBox f(1)
End Sub
一、FileDialog对象简介
上篇写的GetOpenFilename和GetSaveFilename都只能把选择的文件路径返回到程序,但不能真正打开文件,也不能选择文件夹。
所以我们需要学习另一个对象——FileDialog对象。它提供文件对话框,功能与 Microsoft Office 应用程序中标准的“打开”和“保存”对话框类似。利用这些对话框,解决方案的用户可以简便地指定解决方案中应该使用的文件和文件夹。
①“打开”对话框:让用户选择一个或多个可以在主机应用程序中使用 Execute 方法打开的文件。
②“另存为”对话框:让用户选择一个可以使用 Execute 方法保存当前文件的文件。
③“文件选取器”对话框:让用户选择一个或多个文件。用户选择的文件路径将捕获到 FileDialogSelectedItems 集合。
④“文件夹选取器”对话框:让用户选择一个路径。用户选择的文件路径将捕获到 FileDialogSelectedItems 集合。
二、FileDialog语法和属性
FileDialog语法:
Application.FileDialog(FileDialogType)
FileDialog属性:
- AllowMultiSelect :允许用户从文件对话框中选择多个文件,填写 True。
- Filters.Add 规则名称, 过滤文件类型, 规则起始位置(初始为1) :添加过滤规则
- SelectedItems :选取的多个文件集合
- InitialFileName :设置初始路径和文件名称
- InitialView :可以设置初始文件的显示样式(文件查看类型)
- Title :对话框标题
- show :可以判断用户是否点击了取消按钮,如果点击取消会返回0,否则返回-1
- ilters.Clear :清除当前的过滤规则
- ButtonName :选择按键名称
属性还有很多,这里只列了一些常用的属性,需要用的时候可以再去深入了解。
※ 下面讲一下例子:
例1:选择并返回一组文件名和路径。
Sub f1()
Dim f
Dim dig As Object
Set dig = Application.FileDialog(msoFileDialogOpen)
With Application.FileDialog(msoFileDialogOpen)
.AllowMultiSelect = True '允许选择多个文件
.Filters.Add "Excel文件", "*.xls", 1 '过滤规则为把后缀为.xls的Excel文件筛选出来
.InitialFileName = ThisWorkbook.FullName '初始路径和文件名称为当前文件名及其路径
.InitialView = msoFileDialogViewDetails '初始文件的显示样式:详细信息
.Title = "对话框测试" '对话框标题:对话框测试
.Show
'把文件名和路径放在selecteditem属性里,通过序号或者循环一一读取
For Each f In .SelectedItems
MsgBox f
Next f
End With
Set dig = Nothing
End Sub
运行效果:
例2:选择并返回文件夹
Sub F2()
Dim dig As Object
Set dig = Application.FileDialog(msoFileDialogFolderPicker)
With dig
.InitialFileName = "d:" '设置初始路径为D盘
.Show
MsgBox .SelectedItems(1)
End With
Set dig = Nothing
End Sub
运行结果:
三、小结
个人认为,FileDialog对象的功能更加实用,但如果只是想获取文件夹路径的话,可以选择GetOpenFilename 和 GetSaveFilename ,看情况使用吧。