Я использую приведенный ниже код, чтобы открыть определенную папку.
Мне нужно проверить перед открытием, если этот папка или подпапка уже открыт в проводнике Windows или нет, чтобы предотвратить дублирование.
Благодарю за любые полезные комментарии и ответы.
Sub Prevent_opening_duplicate_folder ()
Dim Folder_Path As String
Folder_Path = "D:\Users\Waleed\Desktop\Test"
Shell "explorer """ & Folder_Path & ""
DoEvents
End Sub
@VBasic2008, извините, но я не могу получить ваш комментарий
Вы имеете в виду проверку, открыты ли папка или любая из его подпапок?
Это сделает это:
Function isFolderOpen(Path As String) As Boolean
Dim sh As Object, w As Object, Document
Set sh = CreateObject("shell.application")
For Each w In sh.Windows
If w.Name = "Windows Explorer" Or w.Name = "File Explorer" Then
Debug.Print w.Document.folder.self.Path
Set Document = w.Document
If Document.folder.self.Path = Path Then
isFolderOpen = True
Exit Function
End If
End If
Next
End Function
Ссылка: Excel VBA для открытия только одного экземпляра проводника
Function isFolderOpenOrSubFolder(Path As String) As Boolean
Dim sh As Object, w As Object, Document
Set sh = CreateObject("shell.application")
For Each w In sh.Windows
If w.Name = "Windows Explorer" Or w.Name = "File Explorer" Then
Set Document = w.Document
If Left(Document.folder.self.Path, Len(Path)) = Path Then
isFolderOpenOrSubFolder = True
Exit Function
End If
End If
Next
End Function
Он работает с основной папкой правильно, но если подпапка уже открыта, основная папка все еще открыта.
@Валид: Попробуй If Instr(1, Document.folder.self.Path, Path, vbTextCompare) = 1 Then
.
Теперь обновленный ответ отлично работает @TinMan
Спасибо, что принял мой ответ @Waleed.
Чтобы проверить, открыта ли папка или какая-либо из ее подпапок, попробуйте следующую функцию:
Function isFoldSubFoldOpen(strFolder As String, Optional boolSubFld As Boolean = False) As Boolean
Dim oShell As Object, Wnd As Object, sFld As Variant
Set oShell = CreateObject("Shell.Application")
If boolSubFld Then
Dim fso As Object, fold As Object, colSFld As New Collection
Set fso = CreateObject("Scripting.FileSystemObject")
Set fold = fso.GetFolder(strFolder)
AllSubFolders fold, colSFld
End If
For Each Wnd In oShell.Windows
If Wnd.name = "Windows Explorer" Or Wnd.name = "File Explorer" Then
If Wnd.Document.folder.Self.path = strFolder Then isFoldSubFoldOpen = True: Exit Function
If boolSubFld Then
For Each sFld In colSFld
If Wnd.Document.folder.Self.path = sFld Then
Debug.Print Wnd.Document.folder.Self.path
isFoldSubFoldOpen = True: Exit Function
End If
Next sFld
End If
End If
Next Wnd
End Function
Ему также нужен рекурсивный Sub
, который помещает все подпапки в коллекцию:
Private Sub AllSubFolders(FSOFolder As Object, colSFld As Collection)
Dim objSubfold As Object, objFile As Object
For Each objSubfold In FSOFolder.SubFolders
colSFld.Add objSubfold 'place the subfolder in the collection
AllSubFolders objSubfold, colSFld 'recursively call the sub itself
Next
End Sub
Вышеуказанная функция может быть вызвана только для возврата True
, если папка открыта (без второго параметра или с ним False
) или любая из ее подпапок:
Debug.Print isFoldSubFoldOpen(FolderPath) 'check if the folder is open
Debug.Print isFoldSubFoldOpen(FolderPath, True) 'check if the folder or any of its sub-folders are open
Это работает отлично, также отлично работает другой первый ответ от «TinMan». Я помню, что ты узнал меня принять первый опубликованный ответ (если он работает). Спасибо за вашу поддержку.
@Waleed Это предложение (только) действительно только в случае похожих ответов. Но вы вольны выбрать ответ, который кажется вам более подходящим. Во всяком случае, я бы тоже выбрал этот ответ. Очевидно, что он более компактен и не требует рекурсивной итерации для извлечения подпапок. Интересный подход тоже должен быть Wnd.Document.folder.Self.Parent.Self.path
... Я всегда рада, когда чему-то учусь. Я также чувствую, что не тратил время зря, придумывая это решение. Это может быть хорошо для чего-то другого. А для мозга... :)
Пожалуйста, stackoverflow.com/questions/71599888/…
Вы можете использовать
ThisWorkbook.FollowHyperlink "D:\Users\Waleed\Desktop\Test"
.