VBA, чтобы открыть файловый менеджер и искать переменную в текстовом поле - PullRequest
0 голосов
/ 05 октября 2018

Все, что я хочу сделать, это попросить пользователя ввести ключевое слово в текстовом поле и при выполнении макроса;Откройте новое окно проводника Windows, обозначенное путем

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

и поиском по переменной в SearchBox1 (это текстовое поле ActiveX на листе.)

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

IЯ искал повсюду, и, поскольку я относительно новичок в VBA, я не уверен, как это сделать.

Я видел несколько тем / сообщений, использующих команды Shell для открытия окна проводника ..

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

Когда я запускаю вышеприведенную строку, в проводнике появляется сообщение об ошибке:

«Windows не может найти». Убедитесь, что вы правильно ввели имя, а затем повторите попытку. '

Мне нужен макрос для поиска всех файлов, связанных со строкой (имена папок, имена файлов и слова / символы в каждом типе документа (все они были OCR'ы и проиндексированы Windows))Он также должен иметь возможность поиска неполных слов.

Я получил командную консоль, чтобы открыть окно проводника для пути по

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

Как макрос может искать во всех папкахи подпапкив этом недавно открытом окне?Мне не нужно , чтобы результаты компилировались в Excel или любую другую программу.Мне просто нужно сделать кнопку быстрого поиска, как если бы вы вручную открывали эту папку и использовали панель поиска.

Заранее спасибо за любой ввод!

Ответы [ 3 ]

0 голосов
/ 05 октября 2018

Это сработало для меня:

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 и позже.Для альтернатив см .:

Как мне URL-кодировать строку в Excel VBA?

0 голосов
/ 23 октября 2018

Двойной щелчок по ячейке для поиска

Это решение, которое я объединил из разных мест, чтобы открыть окно проводника на пути, которые фильтруются (ищутся) по термину ввыбранная ячейка с помощью функции поиска Windows 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).Гарантирует, что если этот код будет запущен для другого значения ячейки, откроется новое отдельное окно.Без этого я обнаружил, что при следующем запуске кода окно обозревателя не обновлялось новым поисковым значением, а просто меняло фокус на предыдущий результат.

edit: «копировать из панели поиска» - это строка послерасположение: в адресной строке ручного поиска в проводнике

Использование элементов управления 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 для указанной папки в коде.

Пример снимка экрана с использованием кнопки поиска для «Редактируемого текста поиска»

РЕДАКТИРОВАТЬ

Вы можете включить дополнительные функции поиска в синтаксис поиска 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 Этобудет искать (Where OR will OR I OR find OR it) в проводнике Windows и будет возвращать файлы с именами, такими как WHEREver и Last WILL and testament. Я нашел это полезным для качественной информации, где приведение более широкого поиска приемлемо и может быть легко отфильтрованоuser (ПРИМЕЧАНИЕ: приведенный выше пример также вернет все файлы с именем, содержащим i, поэтому оно не очень конкретное!)

0 голосов
/ 05 октября 2018

выполнение Dir () пустым после того, как Dir () с заданным путем начнет перечислять все файлы в этом dir, вы просто используете, если InStr () <> 0 для проверки вашего значения.

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

там у вас есть список всех файлов внутри этого пути, вы можете проверить подпапки таким же образом, просматривая каждый из них, делая то же самое.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...