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

Posted

技术标签:

【中文标题】打开文件资源管理器并在文本框中搜索变量【英文标题】:Open file explorer and search for variable in textbox 【发布时间】:2018-10-05 18:35:41 【问题描述】:

用户在文本框中输入关键字并在宏执行时;

打开一个由路径指定的新 Windows 文件资源管理器窗口。

路径 = C:\Users\ME\Desktop\Folder7

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

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

我看到了多篇使用 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 打开一个资源管理器窗口到路径 by

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

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

【问题讨论】:

我可能已经更接近了,但现在卡在字符串中的变量上。调用 Shell("explorer.exe " & Chr(34) & "search-ms:displayname=Search%20Results% 20in%20Folder7&crumb=System.Generic.String%3A(""mySearch"")&crumb=location:C%3A%5CUsers%5CME%5CDesktop%5CFolder7" & Chr(34), vbNormalFocus) 【参考方案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?

【讨论】:

【参考方案2】:

双击单元格进行搜索

这是我从各个地方组合在一起的解决方案,以在路径上打开资源管理器窗口,使用 Windows 文件资源管理器搜索功能按所选单元格中的术语过滤(搜索)。它由双击包含搜索词的单元格触发:

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://***.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://***.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 的所有文件,所以它不是很具体!)

【讨论】:

感谢您的回复。我有点困惑。我如何拥有一个 activeX txt 框或一个 txt 字段表单控件(我使用哪个重要吗?),成为搜索的关键字。我无法弄清楚如何让你的代码工作。 这段代码只是我拥有的一张表格中的一个 sn-p,它捕获了对包含搜索值的单元格的双击。我将用更多细节更新我的答案,特别是关于拥有文本框和 ActiveX 控件的更多信息...... 感谢您的入住。是的,您的解释和图片帮助我理解了。非常感谢【参考方案3】:

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

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

您有该路径内所有文件的列表,您可以通过检查每个执行相同操作的子文件夹以相同的方式检查子文件夹。

【讨论】:

我不确定这将如何通过我的 SearchBox1 进行搜索。【参考方案4】:

我不相信这个想法,你能做到这一点真是太棒了。我只是将这个想法更进一步并使其模块化,因此您可以添加任何类型的搜索:

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://***.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

【讨论】:

以上是关于打开文件资源管理器并在文本框中搜索变量的主要内容,如果未能解决你的问题,请参考以下文章

如何在系统文件资源管理器中打开文件/文件夹?

将csv文件作为python中的变量读入

如何打开文件资源管理器让用户在 go 中选择文件

如何在cmd中进行简单的文件搜索

如何在 Django Admin 的搜索框中添加占位符文本?

mt管理器怎么连接虚拟机