VBA Excel FileDialog 设置/重置过滤器

jos*_*yse 3 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
Run Code Online (Sandbox Code Playgroud)

它似乎适当地过滤:

自定义 Excel 文件

完成此数据分析后,用户运行第二个子程序以选择另一个文件,但它只能是 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 的适当过滤器...

选择 CSV

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

当我发现我认为是类似的问题FileDialog 保留以前的过滤器时,尝试在它下面添加它:

With .Filters
.Clear 
End With
Run Code Online (Sandbox Code Playgroud)

但导致编译错误:无效或不合格的引用

VBo*_*Cat 5

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