如何使用VBA在Windows资源管理器中从Excel中的选定单元格中选择多个文件?

如何使用VBA在Windows资源管理器中从Excel中的选定单元格中选择多个文件?,excel,vba,Excel,Vba,我有几个文件夹,每个文件夹包含1000多个子文件夹。根据每个子文件夹中的进度,我必须将其中一些(大约一半)移动到其他位置。进度记录在电子表格中,电子表格还提供了进度路径。我有以下代码: Sub open_explorer() Shell "C:\Windows\explorer.exe /select, K:\user\folder\A\" & ActiveCell.Value, vbMaximizedFocus End Sub 因此,这段代码将打开一个窗口资源

我有几个文件夹,每个文件夹包含1000多个子文件夹。根据每个子文件夹中的进度,我必须将其中一些(大约一半)移动到其他位置。进度记录在电子表格中,电子表格还提供了进度路径。我有以下代码:

    Sub open_explorer()
    Shell "C:\Windows\explorer.exe /select, K:\user\folder\A\" & ActiveCell.Value, vbMaximizedFocus
    End Sub
因此,这段代码将打开一个窗口资源管理器,其中选择了一个文件(该文件是path+ActiveCell值后面的文件)。 有一种方法可以同时选择多个文件吗?假设我想选择200个单元格,这样窗口资源管理器将打开200个选定的文件


感谢您的帮助!

不幸的是,
/select
选项只允许您选择单个文件。没有其他选项允许您选择多个文件。您可以通过选中此选项来确认

话虽如此,既然API
SHOpenFolderAndSelectItems
不可用,那么在VBA中是否有可能实现这一点呢?答案是

遵循以下步骤

  • 打开一个模块并添加对
    Microsoft Shell控件和自动化
    Microsoft Internet控件
    的引用,如下所示

  • 接下来出于测试目的,我们将使用文件夹
    C:\Users\Siddharth Rout\Desktop\Test1
    ,其中包含5个编号为1到5的csv文件,如下所示

  • 现在将下面的代码粘贴到模块中,并运行过程
    Sub-Sample()

  • 代码

    Option Explicit
    
    Sub Sample()
        SelectMultipleFiles "C:\Users\Siddharth Rout\Desktop\Test1"
    End Sub
    
    Sub SelectMultipleFiles(sFolder As String)
        Dim wb As WebBrowser
        Dim objExp As Shell32.Shell
        
        Set objExp = New Shell32.Shell
        
        objExp.Open sFolder
        
        '~~> Find our explorer window
        Do While wb Is Nothing: Set wb = GetExplorer(sFolder): Loop
        
        '~~> We are going to select files 1,3 and 5.csv
        '~~> The 5& is used so that any previous selections are cleared off
        Call wb.document.SelectItem(sFolder & "\1.csv", 5&)
        Call wb.document.SelectItem(sFolder & "\3.csv", 1&)
        Call wb.document.SelectItem(sFolder & "\5.csv", 1&)
    End Sub
    
    '~~> Function to find the releavnt explorer window
    Function GetExplorer(sFolder As String) As WebBrowser
        Dim objExp As New Shell32.Shell
        Dim wb1 As WebBrowser
    
        For Each wb1 In objExp.Windows
            If wb1.Name = "Windows Explorer" And _
            LCase(wb1.document.Folder.Self.Path) = LCase(sFolder) Then
                Set GetExplorer = wb1
            End If
        Next
    End Function
    
    输出:

    注意:如@ChrisB所述,在Windows 10中,
    WebBrowser.Name
    属性返回
    文件资源管理器
    ,而不是
    Windows资源管理器
    ,以便使其兼容您可以使用的两个版本

    If wb1.Name = "Windows Explorer" or wb1.Name = "File Explorer"....
    
    或者,您可以使用
    WMI
    查找Windows版本,然后在Windows/文件资源管理器之间进行选择。但是,它只适用于窗口标题为
    的Windows平台

    要在Windows 8/8.1/10(不仅仅是英文版的Windows 7)上实现此功能,我们可以使用
    GetExplorer
    的函数定义:

    '~~> Function to find the relevant explorer window
    Function GetExplorer(sFolder As String) As WebBrowser
        Dim objExp As New Shell32.Shell
        Dim wb1 As WebBrowser
    
        For Each wb1 In objExp.Windows
            If UCase(wb1.FullName) = "C:\WINDOWS\EXPLORER.EXE" Then
                If LCase(wb1.Document.Folder.Self.Path) = LCase(sFolder) Then
                    Set GetExplorer = wb1
                End If
            End If
        Next
    End Function
    

    类似的问题:-(虽然答案有些陈旧,但与vba无关)这有点复杂。让我发布一个答案并解释一下吧。Hanks@KekuSemau,我看到了那篇帖子,但不适用。对我来说,一个显而易见的问题是,一旦你选择了它们,你将如何处理它们。为什么不改为移动它们?+1一个非常好的问题!我发布了一个解决方案。你可能需要刷新页面才能看到它:)真有趣<但是,在我的例子中,
    Name
    Windows资源管理器
    (Win7)。这是一个输入错误还是有所不同?以上内容在Win 7上进行了测试:)@KekuSemau我发布了Windows 10中最后一个函数的一个变体,WebBrowser.Name属性返回
    文件资源管理器
    。将以下内容替换为:
    如果wb1.Name=“Windows资源管理器”
    ,如果wb1.Name=“文件资源管理器”