VBA打开文件资源管理器并在文本框中搜索变量

时间:2018-10-05 18:35:41

标签: excel vba excel-vba

我要做的就是让用户在文本框中以及执行宏时输入一个关键字。打开一个由路径指定的新的Windows文件浏览器窗口

path = C:\Users\ME\Desktop\Folder7

,然后从SearchBox1中的变量进行搜索(这是工作表上的ActiveX文本框。)

mySearch = sht.OLEObjects("SearchBox1").Object.Text & "*" 

我一直到处都是,因为我是VBA的新手,所以我不确定该怎么做。

我看到了使用Shell命令打开“文件资源管理器”窗口的多个主题/帖子。

 Call Shell("explorer.exe " & Chr(34) & "search-ms:query=*.pdf&crumb=location:C:\Users\ME\Desktop\Folder7" & Chr(34), vbNormalFocus)

当我在上面的代码行中运行时,浏览器提示错误

  

“ Windows找不到”。请确保您正确输入了名称,然后重试。”

我需要宏来搜索与字符串关联的所有文件(文件夹名称,文件名以及每种类型文档中的单词/字符(它们都已由Windows进行OCR编制和索引))。还可以搜索不完整的单词。

我已经获得了Shell,以打开指向该路径的资源管理器窗口

Call Shell("explorer.exe " & Chr(34) & "C:\Users\ME\Desktop\Folder7" & Chr(34), vbNormalFocus)

宏如何在这个新打开的窗口中搜索所有文件夹和子文件夹?我不需要,将结果编译到Excel或任何其他程序中。我只需要快速搜索一个按钮,就像您要手动打开该文件夹并使用搜索栏一样。

提前感谢您提供任何输入!

4 个答案:

答案 0 :(得分:1)

这对我有用:

Sub Tester()
    ShowSearch "C:\_Stuff\test", "*.pdf"           'search by file name
    ShowSearch "C:\_Stuff\Mail\", "reminder", True 'search by keyword
End Sub


Sub ShowSearch(searchWhere, searchFor, Optional SearchByKeyword As Boolean = False)
    Const CMD As String = "explorer.exe ""search-ms:crumb=name:{query}&crumb=location:{location}"" "
    Dim s
    s = Replace(CMD, "{query}", WorksheetFunction.EncodeURL(searchFor))
    s = Replace(s, "{location}", WorksheetFunction.EncodeURL(searchWhere))
    If SearchByKeyword Then s = Replace(s, "crumb=name:", "crumb=")
    'Debug.Print s
    Shell s
End Sub

注意WorksheetFunction.EncodeURL()是2013年及之后的版本。有关替代方法,请参见:

How can I URL encode a string in Excel VBA?

答案 1 :(得分:1)

双击要搜索的单元格

这是我从不同地方组合来在路径上打开资源管理器窗口的解决方案,使用Windows File Explorer搜索功能通过选定单元格中的术语对其进行过滤(搜索)。双击包含搜索词的单元格即可触发该事件:

Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
If Not Application.Intersect(Target, Range("A1:AA1048576")) Is Nothing Then
Dim d As String
Dim searchpath As String
Dim searchlocation As String
Cancel = True
d = Selection.Value
'change window name to make sure new explorer window is opened for each instance
'copy string from manual search
searchpath = "search-ms:displayname=" & d & "%20Results%20&crumb=System.Generic.String%3A"
'copy string from manual search (e.g. my documents replace USERNAME)
searchlocation = "&crumb=location:C%3A%5CUsers%5CUSERNAME%5CDocuments"
If Not d = "" Then
    Call Shell("explorer.exe """ & searchpath & d & searchlocation & "", 1)
   'src: https://stackoverflow.com/questions/24376850/open-explorer-search-from-excel-hyperlink
End If
End If
End Sub

这将在VbNormalFocus中打开窗口,窗口标题设置为单元变量(d)。确保如果此代码在另一个单元格值上运行,则将打开一个新的单独窗口。没有这个,我下次运行代码时发现资源管理器窗口没有更新为新的搜索值,而是将焦点更改为先前的结果。

编辑:“从搜索栏复制”是位置后的字符串:在资源管理器中手动搜索的地址栏中

使用ActiveX控件

添加一个ActiveX文本框(TextBox1)和按钮(CommandButton1),并将以下代码添加到命令按钮:

Private Sub CommandButton1_Click()
Dim d As String
Dim searchpath As String
Dim searchlocation As String
Cancel = True
d = TextBox1.Value
'change window name to make sure new explorer window is opened for each instance
'copy string from manual search
searchpath = "search-ms:displayname=" & d & "%20Results%20&crumb=System.Generic.String%3A"
'copy string from manual search (e.g. my documents replace USERNAME)
searchlocation = "&crumb=location:C%3A%5CUsers%5CUSERNAME%5CDocuments"
If Not d = "" Then
    Call Shell("explorer.exe """ & searchpath & d & searchlocation & "", 1)
   'src: https://stackoverflow.com/questions/24376850/open-explorer-search-from-excel-hyperlink
End If
End Sub

现在,用户可以在文本框中更改文本,然后单击按钮将打开Windows文件浏览器,以搜索代码中的指定文件夹。

Screenshot example using button search for "Editable Search Text"

编辑

您可以在Windows搜索语法中包括其他搜索功能: http://download.microsoft.com/download/8/1/7/8174a74e-3d8d-4478-abc6-84cd51ad93c4/Windows_Desktop_Advanced_Query_Reference.pdf

例如。您可以通过更改搜索变量“ d:

在文件夹中搜索与字符串中每个单词部分匹配的所有文件
...
d = Selection.Value
d = "(" & Replace(d, " ", " OR ") & ")"
...

如果选择(d)的值为Where will I find it 这将在Windows资源管理器中搜索(Where OR will OR I OR find OR it),并返回名称为WHEREverLast WILL and testament之类的文件。我发现这对于定性信息很有用,在其中进行更广泛的搜索是可以接受的,并且用户可以轻松地对其进行过滤(注意:上面的示例还会返回名称包含i的所有文件,因此不是非常具体!)

答案 2 :(得分:0)

在具有给定路径的Dir()之后执行Dir()为空将开始列出该目录中的所有文件,您只需使用InStr()<> 0来检查您的值即可。

sFileName = Dir(path)
Do While sFileName > ""
tmp = tmp & sFileName & ";" : sFileName = Dir()
Loop
List() = Split(tmp, ";")

在该路径中有所有文件的列表,可以通过检查每个子文件夹以相同的方式以相同的方式检查子文件夹。

答案 3 :(得分:0)

我不相信这个主意,可以做到这一点很棒。我将这个想法更进一步,使其模块化,因此您可以添加任何类型的搜索:

Sub searchInExplorer_TEST()
    'searchInExplorer "D:\", , , True, "*.jpg", True, "24 Feb 20"
    searchInExplorer "D:\", , , , , True, "24 Feb 20", True, "picture"
End Sub


Sub searchInExplorer(searchWhere _
                    , Optional isSearchAll As Boolean, Optional strAll _
                    , Optional isSearchName As Boolean, Optional strName _
                    , Optional isSearchModified As Boolean, Optional strModified _
                    , Optional isSearchType As Boolean, Optional strType)
    
    '*****************************************************
    'https://stackoverflow.com/questions/52671500/vba-to-open-file-explorer-and-search-for-variable-in-textbox
    'ALLOWS SEARCHING IN WINDOWS EXPLORER USING VARIABLES
    'EITHER USE SEARCH ALL OR OTHER SEARCH TIMES
    'EACH SEARCH TYPE HAS AN ON/OFF SWITCH AND A STRING VARIABLE TO SEARCH BY
    '*****************************************************
        
    Dim STR As String
    
    STR = "explorer.exe ""search-ms:"
    If isSearchAll Then
        STR = STR & "crumb=:" & WorksheetFunction.EncodeURL(strAll)
        
    Else
        If isSearchName Then
            STR = STR & "&crumb=name:" & WorksheetFunction.EncodeURL(strName)
        End If
        
        If isSearchModified Then
            STR = STR & "&crumb=modified:" & WorksheetFunction.EncodeURL(strModified)
        End If
        
        If isSearchType Then
            STR = STR & "&crumb=kind:" & WorksheetFunction.EncodeURL(strType)
        End If
        
    End If
    
    STR = STR & "&crumb=location:" & WorksheetFunction.EncodeURL(searchWhere)
    STR = STR & """ "
    
    Debug.Print STR
    Shell STR
End Sub