【问题标题】:VBA Excel FileDialog to set/reset filtersVBA Excel FileDialog 设置/重置过滤器
【发布时间】:2018-01-02 02:49:16
【问题描述】:

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

似乎过滤得当:

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

问题是文件对话框会记住第一个过滤器(自定义 XLS),他们需要单击下拉菜单才能看到仅适用于 CSV 的适当过滤器...

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

当我发现我认为是类似的问题FileDialog persists previous filters时尝试在其下方添加:

With .Filters
.Clear 
End With

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

【问题讨论】:

  • 使用.Filters 对象的.Filters 属性的.Clear 方法有效,所以我能想到的只是你没有将With .Filters 放在With yourObj3 块中。

标签: vba excel filter


【解决方案1】:

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

【讨论】:

  • P.S.我怀疑问题真的是OP将With .Filters放在其他With块之外,所以VBA不知道.Filters中的.指的是什么。无论是Object 还是FileDialog,代码都有效。
  • 我永远是对的!! (除非我妻子说我不是。)
  • 是的!谢谢VBobCat,工作得很好。 @YowE3K 你是对的,我把它放在不同的 With 块下...... doh!
【解决方案2】:

虽然它不是直接来自 OP 的特定 msoFileDialogFilePicker 的答案(并在 Google 上搜索了这个答案),但我在 Excel 2010 中的 msoFileDialogSaveAs 对话框中遇到了同样的问题,在该对话框中尝试修改过滤器时会出现错误无论如何,因为它obviously is not supported :-/

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-06-15
    • 2016-03-25
    • 2015-10-29
    • 1970-01-01
    • 2021-09-12
    • 1970-01-01
    • 2015-07-31
    相关资源
    最近更新 更多