我有一个宏要求用户选择多个文件进行数据分析。用户首先选择 Excel 或 CSV 文件(XLSX、XLS、CSV),然后要求第二个文件,但仅 CSV。该工具的目的是将两个数据文件合二为一。
在一个 Sub 中,我要求用户使用 FileDialog 代码选择任何兼容的 XLSX、XLS 或 CSV 文件:
Dim myObj As Object
Dim myDirString As String
Set myObj = Application.FileDialog(msoFileDialogFilePicker)
With myObj
.InitialFileName = "C:\Users\" & Environ$("Username") & "\Desktop"
.Filters.Add "Custom Excel Files", "*.xlsx, *.csv, *.xls"
.FilterIndex = 1
If .Show = False Then MsgBox "Please select Excel file.", vbExclamation: Exit Sub
myDirString = .SelectedItems(1)
End With
Run Code Online (Sandbox Code Playgroud)
它似乎适当地过滤:
完成此数据分析后,用户运行第二个子程序以选择另一个文件,但它只能是 CSV 文件。所以我用这个代码来请求 CSV:
Dim yourObj3 As Object
Dim yourDirString3 As String
Set yourObj3 = Application.FileDialog(msoFileDialogFilePicker)
With yourObj3
.InitialFileName = "C:\Users\" & Environ$("Username") & "\Desktop"
.Filters.Add "CSV Files", "*.csv"
.FilterIndex = 1
If .Show = False Then MsgBox "Please select CSV file.", vbExclamation: Exit Sub
yourDirString3 = .SelectedItems(1)
End With
Run Code Online (Sandbox Code Playgroud)
问题是 FileDialog 框记住了第一个过滤器(自定义 XLS),他们需要单击下拉列表才能查看仅适用于 CSV 的适当过滤器...
所以这肯定会让用户感到困惑......我猜我需要在用户完成第一个宏后“清除”我们的第一个过滤器。关于清除(或重置)第一个过滤器的代码有什么建议吗?
当我发现我认为是类似的问题FileDialog 保留以前的过滤器时,尝试在它下面添加它:
With .Filters
.Clear
End With
Run Code Online (Sandbox Code Playgroud)
但导致编译错误:无效或不合格的引用
这适用于我的环境。我所做的唯一不同的是将对话框声明为FileDialog而不是Object.
Sub Test()
Dim myObj As FileDialog
Dim myDirString As String
Set myObj = Application.FileDialog(msoFileDialogFilePicker)
With myObj
.InitialFileName = "C:\Users\" & Environ$("Username") & "\Desktop"
.Filters.Clear
.Filters.Add "Custom Excel Files", "*.xlsx, *.csv, *.xls"
.FilterIndex = 1
.Show
End With
Dim yourObj3 As FileDialog
Dim yourDirString3 As String
Set yourObj3 = Application.FileDialog(msoFileDialogFilePicker)
With yourObj3
.InitialFileName = "C:\Users\" & Environ$("Username") & "\Desktop"
.Filters.Clear
.Filters.Add "CSV Files", "*.csv"
.FilterIndex = 1
.Show
End With
End Sub
Run Code Online (Sandbox Code Playgroud)