VBA Excel FileDialog设置/重置过滤器

时间:2017-07-26 16:32:40

标签: excel vba excel-vba filter

我有一个宏,要求用户选择多个文件进行数据分析。用户首先选择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

似乎过滤得恰到好处:

Custom Excel Files

完成此数据分析后,用户运行第二个子选择另一个文件,但它必须只是一个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

问题是FileDialog框会记住第一个过滤器(Custom XLS),他们需要点击下拉列表才能看到适合CSV的过滤器......

Select CSV

所以这肯定会让用户感到困惑......我猜我需要在用户完成第一个宏之后“清除”我们的第一个过滤器。有关该代码的任何建议,以清除(或重置)第一个过滤器?

当我发现我认为类似的问题FileDialog persists previous filters

时,尝试在下面添加此内容
With .Filters
.Clear 
End With

但导致编译错误:无效或不合格的参考

2 个答案:

答案 0 :(得分:4)

这适用于我的环境。我做出的唯一不同的做法是将对话框声明为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

答案 1 :(得分:0)

尽管这不是直接来自OP的特定msoFileDialogFilePicker的答案(并用谷歌搜索了此答案),但我在Excel 2010中的msoFileDialogSaveAs对话框中遇到了相同的问题,尝试在此对话框中出现错误以任何方式修改过滤器,因为它obviously is not supported:-/

  

msoFileDialogSaveAs对话框不支持文件过滤器