“Application.FileDialog及Application.GetOpenFilename用法”总是听到或看到有人问,编程好学吗?如何入门?多久能学会?它能做些什么?怎么写代码呀?执行过程中出问题了谁能帮帮我...如果你也有类似的问题那就赶快关注我的公众号,一起学起来吧!
近期一直分享文件、文件夹方面的操作,为了方便查阅代码或突出重点,常常在代码里直接“写死”文件路径或操作对象,如
startFolder = "D:\常用文件" ' 请修改为你的目标路径Set wordDoc = wordApp.Documents.Open("D:\常用文件\归档\测试文档.docx") '打开文档
这无疑牺牲了程序的灵活性,给使用带来了不便。那么,有没有办法让程序在运行时,能够让我们动态地、自由选择文件或操作路径呢?
答案是肯定的,接下来推荐两个好用的对话框,不仅能自由选择文件/文件夹,其通用的图形界面还非常容易操作
1.1 语法
Application.FileDialog 是一个功能强大的对象,它允许我们在Office应用程序(如Excel、Word)中调用系统标准的文件对话框,并以图形化界面选择文件、文件夹或指定保存路径,从而极大地增强代码的交互性和灵活性。其语法
Application.FileDialog(fileDialogType)
fileDialogType有四种类型:
msoFileDialogOpen:值为 1。这是标准的“打开”文件对话框,允许我们选择一个或多个文件
msoFileDialogSaveAs:值为 2。这是“另存为”对话框,允许我们指定一个文件名和路径来保存当前文件
msoFileDialogFilePicker:值为 3。这是“文件选取器”对话框,允许我们选择一个或多个文件,其选择结果(文件路径)会存储在 SelectedItems 集合中供后续代码处理。这是最常用于获取文件路径的类型
msoFileDialogFolderPicker:值为 4。这是“文件夹选取器”对话框,仅能选择一个文件夹(,其路径同样通过 SelectedItems 集合获取
以上内容了解后,直接看应用
1.2 选择文件夹
示例1:使用文件夹选取器 (msoFileDialogFolderPicker) 选择文件夹
With Application.FileDialog(msoFileDialogFolderPicker) .Title = "请选择一个文件夹" .InitialFileName = "D:\常用文件" '设置默认路径,如“D:\常用文件” If .Show = -1 Then MsgBox "您选择的文件夹是:" & .SelectedItems(1) End If End With
执行后,首先弹出一个对话框
然后在对话框中选择对应的文件夹
点击确认后,通过SelectedItems 集合获取路径信息
1.3 选择文件
示例2:使用文件选取器 (msoFileDialogFilePicker) 选择单个文件
With Application.FileDialog(msoFileDialogFilePicker) .Title = "请选择一个Excel文件" .AllowMultiSelect = False ' 设置为单选 .Filters.Clear .Filters.Add "Excel Files", "*.xls;*.xlsx;*.xlsm" .InitialFileName = "D:\常用文件" ' 此处设置初始路径,如 If .Show = -1 Then ' 点击“确定”按钮 MsgBox "您选择的文件是:" & .SelectedItems(1) End If End With
执行以上代码,会弹出一个对话框,红框里显示内容均在代码里设置好了
从文件夹里选中一个Excel文件,由于AllowMultiSelect = False,因此只能选中一个文件
点击确认后,通过SelectedItems 集合获取文件路径及文件名
Application.GetOpenFilename
Application.GetOpenFilename最常用的选择单个或多个文件路径的方法。它仅返回我们选择的文件路径字符串或数组,而不会实际打开文件,因此非常安全、高效。其语法:
Application.GetOpenFilename([FileFilter], [FilterIndex], [Title], [ButtonText], [MultiSelect])
所有参数都是可选的,含义如下:
FileFilter:指定文件类型过滤器,例如 "Excel文件 (*.xlsx), *.xlsx"。
FilterIndex:指定默认使用的过滤器索引号。一般情况下直接忽略此参数即可
Title:设置对话框的标题。
MultiSelect:若为 True,则允许我们选择多个文件,此时返回一个包含所有路径的数组;若为 False(默认),则只能选一个文件
2.1 选择单个文件
示例3:使用Application.GetOpenFilename选择单个文件
Dim filePath As Variant filePath = Application.GetOpenFilename("Excel文件 (*.xls;*.xlsx;*.xlsm), *.xls;*.xlsx;*.xlsm", , "请选择一个Excel文件", False) If filePath <> False Then Debug.Print "您选择的文件是:" & filePath End If
执行以上代码,打开的对话框显示内容如下:
filePath变量中保存的是选中文件的全路径,即路径+文件名
2.2 选择多个文件
示例4:使用Application.GetOpenFilename选择多个文件
Dim selectedFiles As Variant Dim i As Long ' 允许多选,返回一个数组 selectedFiles = Application.GetOpenFilename( _ FileFilter:="Excel文件 (*.xls;*.xlsx;*.xlsm), *.xls;*.xlsx;*.xlsm", _ Title:="请选择Excel文件", _ MultiSelect:=True) ' 判断用户是否选择了文件(取消选择时返回布尔值False) If TypeName(selectedFiles) = "Boolean" Then '或者 selectedFiles =False MsgBox "您取消了选择。" Else ' 遍历数组,处理每个文件路径 For i = LBound(selectedFiles) To UBound(selectedFiles) Debug.Print selectedFiles(i) Next i End If
执行后,可以在对话框中通过Ctrl+单击 或 Shift+单击选择多个文件
最后通过selectedFiles获取每个文件的全路径信息
至此,VBA相关的编码知识介绍就告一段落了,有了这些知识做铺垫,已经足够应对日常工作中的大多数自动化需求了
后续,本公众号继续为大家分享实用的案例,同时也会热烈关注评论区里大家的留言,针对提到的一些新问题或需求,穿插着提供相应的解决方法。大家想看、想了解的都欢迎继续在评论区留言