Запретить открытие дубликатов папок или подпапок в проводнике Windows

Я использую приведенный ниже код, чтобы открыть определенную папку.
Мне нужно проверить перед открытием, если этот папка или подпапка уже открыт в проводнике 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

Вы можете использовать ThisWorkbook.FollowHyperlink "D:\Users\Waleed\Desktop\Test".

VBasic2008 19.03.2022 10:21

@VBasic2008, извините, но я не могу получить ваш комментарий

Waleed 19.03.2022 13:03

Вы имеете в виду проверку, открыты ли папка или любая из его подпапок?

FaneDuru 19.03.2022 16:51
Преобразование HTML-таблицы в профессиональный документ Excel
Преобразование HTML-таблицы в профессиональный документ Excel
Это самый простой способ создания Excel из HTML-таблицы.
Импорт excel в laravel в базу данных
Импорт excel в laravel в базу данных
Здравствуйте, дорогой читатель, в этой статье я расскажу практическим и быстрым способом, как импортировать файл Excel в вашу базу данных с помощью...
2
3
75
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Это сделает это:

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

Он работает с основной папкой правильно, но если подпапка уже открыта, основная папка все еще открыта.

Waleed 19.03.2022 13:02

@Валид: Попробуй If Instr(1, Document.folder.self.Path, Path, vbTextCompare) = 1 Then.

VBasic2008 19.03.2022 17:09

Теперь обновленный ответ отлично работает @TinMan

Waleed 20.03.2022 08:52

Спасибо, что принял мой ответ @Waleed.

TinMan 20.03.2022 09:48

Чтобы проверить, открыта ли папка или какая-либо из ее подпапок, попробуйте следующую функцию:

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 20.03.2022 08:43

@Waleed Это предложение (только) действительно только в случае похожих ответов. Но вы вольны выбрать ответ, который кажется вам более подходящим. Во всяком случае, я бы тоже выбрал этот ответ. Очевидно, что он более компактен и не требует рекурсивной итерации для извлечения подпапок. Интересный подход тоже должен быть Wnd.Document.folder.Self.Parent.Self.path... Я всегда рада, когда чему-то учусь. Я также чувствую, что не тратил время зря, придумывая это решение. Это может быть хорошо для чего-то другого. А для мозга... :)

FaneDuru 20.03.2022 12:34

Пожалуйста, stackoverflow.com/questions/71599888/…

Waleed 24.03.2022 10:43

Другие вопросы по теме