如何提示用户在 VBA 中选择文件位置以将文件合并到一个工作簿中

Posted

技术标签:

【中文标题】如何提示用户在 VBA 中选择文件位置以将文件合并到一个工作簿中【英文标题】:How to prompt user to select file location in VBA to merge files into one workbook 【发布时间】:2022-01-23 09:22:42 【问题描述】:

我正在努力编写提示用户使用 FileDialog 选择文件夹路径的工作代码,但无法将其与将所需文件导入打开工作簿的另一个例程集成。以下是我到目前为止的代码,但我需要提示用户,而不是预先确定文件夹路径:

Sub MergeCsvFilesToWb()

Dim FolderPath As String
Dim Filename As String
Dim Sheet As Worksheet
Dim fldr As FileDialog


    Application.ScreenUpdating = False
    
    Set fldr = Application.FileDialog(msoFileDialogFolderPicker)
    With fldr
        .Title = "Select the Folder where the '.csv' files are located."
        .AllowMultiSelect = False
        .Show
    End With
    FolderPath = fldr.SelectedItems(1)
    Filename = Dir(FolderPath & "*.csv*")
        Do While Filename <> ""
            Workbooks.Open Filename:=FolderPath & Filename, ReadOnly:=True
            
            For Each Sheet In ActiveWorkbook.Sheets
            
                Sheet.Copy After:=ThisWorkbook.Sheets(1)
            
            Next Sheet
            
            Workbooks(Filename).Close
            Filename = Dir()
        
        Loop
        
Application.ScreenUpdating = True

End Sub

感谢任何帮助

【问题讨论】:

请编辑您的问题并包括您使用FileDialog的尝试 @RaymondWu 现在更新了 调试您的代码并确保变量msoFileDialogFolderPicker 具有有效值(非零)。如果变量不存在,VB 不会警告你。你能解释一下当你尝试这样做时会发生什么意想不到的事情吗? 如果您查看FileDialog documentation(它是object documentation)及其示例,您会看到SelectedItems 属性包含所选文件夹/文件的集合。由于文件夹选择器只允许您选择 1 个文件夹,请尝试 FolderPath = fldr.SelectedItems(1) 会弹出文件对话框,但是一旦我选择了文件夹,文件就不会导入工作簿(新添加的行)。 @RaymondWu 【参考方案1】:

FileDialog 中选择的文件/文件夹可以在SelectedItems 属性中找到 (Documentation)

所以要将变量FolderPath 分配给选定的文件夹:

    Dim fldr As FileDialog
    
    Set fldr = Application.FileDialog(msoFileDialogFolderPicker)
    With fldr
        .Title = "Select the Folder where the '.csv' files are located."
        .Show
        
        Dim FolderPath As String
        FolderPath = .SelectedItems(1)
    End With

请注意,您应该处理用户未在对话框中选择任何文件夹(单击Cancel)的事件,以便更好的版本是:

    Dim fldr As FileDialog
    
    Set fldr = Application.FileDialog(msoFileDialogFolderPicker)
    With fldr
        .Title = "Select the Folder where the '.csv' files are located."
        .Show
        
        Dim FolderPath As String
        If .SelectedItems.Count <> 0 Then
            FolderPath = .SelectedItems(1)
        Else
            'Code to handle event that nothing is selected
            'e.g.
            'Exit Sub
        End If
    End With

最后,返回的文件夹路径末尾没有斜杠,因此您需要:

    Filename = Dir(FolderPath &amp; "*.csv*")修改为Filename = Dir(FolderPath &amp; "\*.csv*")

    FolderPath = .SelectedItems(1)修改为FolderPath = .SelectedItems(1) &amp; "\"

【讨论】:

以上是关于如何提示用户在 VBA 中选择文件位置以将文件合并到一个工作簿中的主要内容,如果未能解决你的问题,请参考以下文章

VBA EXCEL提示用户响应选择文件夹并将路径作为字符串变量返回[重复]

用vba新建工作表,并命名

通过使用 VBA 浏览将文件保存在所需文件夹中

vbscript VBA用于遍历文件和文件夹,并提示用户选择文件/文件夹。包括一个例子。

更正权利标志以将文件保存在同一位置两次

如何实现:编写vba 弹出文件对话框,并打开选中文件?