2017-07-26 572 views
0

我有一个宏,要求用户选择多个文件进行数据分析。用户首先选择一个Excel或CSV文件(XLSX,XLS,CSV),然后请求第二个文件但仅CSV。该工具的目的是将两个数据文件合并为一个。VBA Excel FileDialog设置/重置过滤器

在一个小组,我要求用户选择任何兼容XLSX,XLS,或使用FileDialog的代码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的会记住第一个过滤器(自定义XLS),他们需要点击下拉菜单,查看CSV只有...

适当的过滤器

Select CSV

所以这肯定会造成用户困惑......我猜我需要“明确”我们的用户后,首先过滤器完成第一个宏。关于该代码的任何建议,以清除(或重置)第一个过滤器?

尝试添加此下方,当我发现了我认为是一个类似的问题FileDialog persists previous filters

With .Filters 
.Clear 
End With 

但结果编译错误:无效的或不合格的参考

+1

使用'FileDialog'对象的作品'.Filters'属性的'.Clear'方法,因此,所有我能想到的是你没有把'随着.Filters'内你的'随着yourObj3 '块。 – YowE3K

回答

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 
+0

@ YowE3K你是对的,我会编辑。 – VBobCat

+1

P.S.我怀疑这个问题真的是OP把'With .Filters'放在其他'With'块之外,所以VBA不知道'.Filters'中的'.'是指什么。该代码可以工作,无论它是“对象”还是“FileDialog”。 – YowE3K

+0

你知道吗?我想你是对的... – VBobCat