图10-5 文件夹采集对话框允许用户选择一个路径,该对话框显示目录列表,并且标题显示为“浏览”
文件对话框使用的常量列在下面的表格里,前缀“mso”表明这些常量都是Microsoft Office 对象模型里一部分。
msoFileDialog常量 msoFileDialogOpen msoFileDialogSaveAs msoFileDialogFilePicker msoFileDialogFolderPicker
值 1 2 3 4
可以使用FileDialog的Filters属性来控制显示文件的类型。如果你打开文件打开对话框下面的“文件类型”下拉列表框时,你将看到许多可选择的文件过滤器。那里有24种预先设置好的文件过滤器,你也可以在该清单里添加你自己的过滤器。在立即窗口里输入下述语句,我们就可以得到缺省的文件过滤器数目了:
set f = Application.FileDialog(msoFileDialogOpen).Filters ?f.count
FileDialog对象的过滤器储存在FileDialogFilters集合里面。我们来创建一个简单的过程,将缺省的文件过滤器返回到Excel工作表:
1. 在当前VBA工程里插入一个新模块,并且重命名为DialogBoxes 2. 在DialogBoxes代码窗口里输入下面显示的ListFilters过程: Sub ListFilters()
Dim fdfs As FileDialogFilters Dim filt As FileDialogFilter Dim c As Integer
Set fdfs = Application.FileDialog(msoFileDialogOpen).Filters Sheets(3).Cells(1, 1).Select
Selection.Formula = \
With fdfs
c = .Count
For Each filt In fdfs
Selection.Offset(1, 0).Formula = filt.Description & _
\Selection.Offset(1, 0).Select Next
MsgBox c & \End With End Sub
该过程声明了两个对象变量,变量fdfs返回对FileDialog对象里的FileDialogFilters集合的引用,而对象变量filt则储存对对象FileDialogFilter的引用。FileDialogFilters集合的Count属性返回文件过滤器的总数。之后,过程遍历过滤器集合,并且找到每个过滤器的
描述和扩展名。
使用FileDialogFilters集合的Add方法,你可以轻易地将你自己的过滤器添加到缺省的过滤器中去。下面修改后代工程ListFilters2示范了如何将临时文件(*.tmp)过滤器添加到过滤器清单中去。该过程里的最后语句将打开文件打开对话框,因此你自己可以检查自定义的过滤器是否已经被添加到了文件类型下拉列表框里。 Sub ListFilters2()
Dim fdfs As FileDialogFilters Dim filt As FileDialogFilter Dim c As Integer
Set fdfs = Application.FileDialog(msoFileDialogOpen).Filters Sheets(3).Cells(1, 1).Select
Selection.Formula = \
With fdfs
c = .Count
For Each filt In fdfs
Selection.Offset(1, 0).Formula = filt.Description & _
\Selection.Offset(1, 0).Select Next
MsgBox c & \.Add \c = .Count
MsgBox \
& \
Application.FileDialog(msoFileDialogOpen).Show End With End Sub
你可以使用FileDialogFilters集合的Clear方法清除所有预设的过滤器。修改一下上面的过程,在添加自定义的临时文件(*.tmp)过滤器之前,清除内置的过滤器。
当你从文件打开对话框里选择一个文件时,该被选择的文件名称和路径就会被放置在FileDialogSelectedItems集合里。使用SelectedItems属性可以返回FileDialogSelectedItems集合。通过设定FileDialog对象的AllowMultiSelect属性为True,用户就可以同时按下Shift键或者Ctrl键和文件名称,选择一个或多个文件。 接下来的过程示范了如何使用上面提及的属性,该过程打开一个新的工作簿并且插入一个列表框控件。允许用户选择一个以上的文件,然后被选择的文件将加入到该列表框控件里,并且加亮第一个文件名。 Sub ListSelectedFiles()
Dim fd As FileDialog Dim myFile As Variant Dim lbox As Object
Set fd = Application.FileDialog(msoFileDialogOpen)
With fd
.AllowMultiSelect = True If .Show Then
Workbooks.Add
Set lbox = Worksheets(1).Shapes. _
AddFormControl(xlListBox, _
Left:=20, Top:=60, Height:=40, Width:=300) lbox.ControlFormat.MultiSelect = xlNone
For Each myFile In .SelectedItems
lbox.ControlFormat.AddItem myFile Next
Range(\
\lbox.ControlFormat.ListCount & \lbox.ControlFormat.ListIndex = 1 End If End With End Sub
图10-6 使用过程ListSelectedFiles(见上面)将用户选择的文件添加到工作表中列表框控件中去
注意,Show方法不会将用户所选的文件打开,它仅仅显示文件打开对话框。当用户点击“打开”按钮时,文件名称通过SelectedItems属性从SelectedItems集合里获得。如果你希望用户点击“打开”按钮时立即执行文件的打开操作的话,你就应该使用FileDialog对象的Execute方法。下面的过程示范了如何立即打开用户选择的文件: Sub OpenRightAway()
Dim fd As FileDialog Dim myFile As Variant
Set fd = Application.FileDialog(msoFileDialogOpen)
With fd
.AllowMultiSelect = True If .Show Then
For Each myFile In .SelectedItems
.Execute Next End If End With End Sub
2.GetOpenFilename和GetSaveAsFilename方法
从多年以前开始,Excel就给程序员们提供了两种方便的VBA方法来显示文件另存为和文件打开对话框:GetOpenFilename和 GetSaveAsFilename。这些方法只有在Excel里可用,并且在Excel2002里面如果需要向后兼容的话仍然可用。
GetOpenFilename方法显示“打开”对话框,在那里你可以选择要打开的文件名称,第二个方法(GetSaveAsFilename)则显示另存为对话框。 1. 在立即窗口输入下面的指令: Application.GetOpenFilename Application.GetSaveAsFilename
Application.GetSaveAsFilename (\
GetOpenFilename方法从用户处获得文件名称,而不必实际打开某特定的文件。该方法有四个可选的参数,经常使用的是第一和第三个参数,显示入下表:
GetOpenFilename参数 描述 fileFilter
该参数决定了对话框的文件类型(译者:原文为Save as type,有误)下拉框了的内容。例如,要在文件类型下拉框里显示“Excel Files(*.xls)”的话,你就应该输入下列文本作为fileFilter: “Excel Files(*.xls), *.xls”(译者:“Excel Files, *.xls”也一样。)过滤器的前面部分(逗号前)决定文件类型下拉框要显示的文本,第二部分(逗号后)明确你要显示的那种类型的文件。确保你按照表格里的例子试验一下。
title 这是对话框的标题,如果忽略,对话框将显示标题为“打开”
在立即窗口里输入下列语句(确保在一行输入),来看看这些参数是如何使用的:
Application.GetOpenFilename(\GetOpenFilename方法返回所选的或者指定的文件名称,该名称之后可以在你的VBA过程里用来打开该文件,例如:
yourFile = Application.GetOpenFilename ?yourFile
C:\\EXCEL\\Mark.xls
Workbooks.Open Filename:=yourFile
在上面的例子里,文件名称被赋予变量yourFile,接下来的两条输入为询问文件名称(?yourFile)和显示该名称(C:\\EXCEL\\Mark.xls)。第四条语句打开变量yourFile明确的文件。如果你通过点击Esc键或者对话框上的取消按钮来取消对话框的话,那么GetOpenFilename方法就会返回False。
GetSaveAsFilename方法返回文件名和路径,然而,它不会自动地保存该特定的文件。输入下述指令提供文件名称:
Application.GetSaveAsFilename (\
如果你忽略文件名称的话,Excel就会显示当前活动文件的名称。当你使用GetSaveAsFilename方法时,你可以明确文件过滤器和对话框自定义标题:
yourFile = Application.GetSaveAsFilename(“Plan2.xls”, \Files(*.xls), *.xls\要显示另存为对话框的话,就要将GetSaveAsFilename方法的结果赋予一个变量,如上所示。
3.创建窗体
尽管内置的对话框很方便使用,但是它并不能满足你所有的VBA应用程序的要求。除了将对话框显示在屏幕上和初始化它的设置之外,你不能控制对话框的外观,你不能决定增加哪个按钮,删除哪个按钮,而哪个又移动,同样,你不能改变内置对话框的大小。如果你想用提供一个自定义的界面的话,那么你的唯一办法就是创建一个用户窗体。 用户窗体看上去就像一个自定义对话框,你可以在上面添加各种各样的控件,给这些控件设置属性以及编写对窗体反应的VBA过程和控制事件。窗体是单独的对象,你可以在VB编辑器菜单里选择“插入”|“用户窗体”来添加窗体。 窗体可以在不同的应用程序之间分享使用,例如,你可以在Word或者任何其它使用VB编辑器的应用程序里面,重新使用Excel里设计的窗体。 按照下述步骤创建自定义窗体: ? 切换到VB编辑器窗口
? 选择“插入”|“用户窗体”
一个叫做窗体的文件夹显示在工程浏览器窗口,该文件夹包含一个空白用户窗体。工作区域自动显示窗体和带有添加控件的工具箱。