Ouvrir un répertoire en vba, s'il n'est pas déjà ouvert.

webmuster

XLDnaute Junior
Bonjour à toutes et à tous, et mes meilleurs vœux pour cette nouvelle année.

Je reviens vers vous après des heures de recherche sur ce forum, et sur bien d'autres.

A partir d'une feuille Excel, j'enregistre, via un bouton de commande, un fichier PDF dans un répertoire.
Une Message Box confirme la création du dit-fichier et informe l’utilisateur du chemin du répertoire.
Elle lui donne également la possibilité d'ouvrir le dossier de destination.

Je vous joins une partie du code sur lequel je planche :
Code:
Private Sub CommandButton2_Click()

  Dim cheminfichier As String

  cheminfichier = ThisWorkbook.Path & "\" & "mondossierdedestination" & "\"

' Exporter au format PDF
     ActiveSheet.ExportAsFixedFormat Type:=xlTypePDF, Filename:=cheminfichier & nomfichier, _
                                      Quality:=xlQualityStandard, IncludeDocProperties:=True, IgnorePrintAreas:=False, OpenAfterPublish:=False
    
      If MsgBox("Le fichier pdf a été édité avec succès dans le dossier suivant : " & ThisWorkbook.Path & "\" & "Contrôles de sécurité au transbordement" & Chr(10) & "Voulez-vous accéder à ce dossier ?", vbYesNo) = vbNo Then
     
      Exit Sub
      Else

 
ActiveWorkbook.FollowHyperlink cheminfichier, NewWindow:=True
  End If

End Sub

Voici mes problématiques:
- le code utilisé pour l'ouverture du dossier de destination est-il le plus pertinent ?
- comment, si ce dossier est déjà ouvert, l'activer sans l'ouvrir en double ?

J'espère vous avoir exposé mon problème de manière claire.

Bien cordialement
 
Dernière édition:

webmuster

XLDnaute Junior
Re : Ouvrir un répertoire en vba, s'il n'est pas déjà ouvert.

Bonjour à tous

Je comprends que l'intitulé de ma demande ne déclenche pas les passions, compte tenu de la multitude de discussions sur ce sujet.
J'en ai parcourues plusieurs dizaines avant de vous solliciter.
La majorité traitait de l"ouverture d'un fichier.

Ma démarche est-elle sans intérêt ?

Pouvez-vous m'éclairer?

Cordialement
 

Staple1600

XLDnaute Barbatruc
Re : Ouvrir un répertoire en vba, s'il n'est pas déjà ouvert.

Bonsoir à tous

Voici mes problématiques:
- le code utilisé pour l'ouverture du dossier de destination est-il le plus pertinent ?
Dans ton code, je vois pas de code dédié à l'ouverture d'un dossier
(sauf celui-ci en quelque sorte : ActiveWorkbook.FollowHyperlink cheminfichier, NewWindow:=True)
(NB: un dossier = répertoire contenant des fichiers)
- comment, si ce dossier est déjà ouvert, l'activer sans l'ouvrir en double ?
Idem.
Tu parles d''un dossier ouvert dans l'explorateur Windows ou d'un fichier Excel ?

PS: Il arrive que des fils restent sans réponse (ou qu'elle tardent à venir)
Dans ce cas un up, comment tu viens de le faire, en ajoutant précisions et détails font souvent avancer les choses;)

Donc pour savoir si un dossier (folder) est ouvert, un exemple ici
check if a folder is open (vba) - Stack Overflow
 
Dernière édition:

webmuster

XLDnaute Junior
Re : Ouvrir un répertoire en vba, s'il n'est pas déjà ouvert.

Merci Staple1600

- le code utilisé pour l'ouverture du dossier de destination est-il le plus pertinent ?
Dans ton code, je vois pas de code dédié à l'ouverture d'un dossier
(sauf celui-ci en quelque sorte : ActiveWorkbook.FollowHyperlink cheminfichier, NewWindow:=True)
(NB: un dossier = répertoire contenant des fichiers)

Désolé, le mot "code" n'était donc pas approprié.
Accordons-nous, si tu le veux bien, sur le terme "méthode d'ouverture d'un dossier".

- comment, si ce dossier est déjà ouvert, l'activer sans l'ouvrir en double ?
Idem.
Tu parles d''un dossier ouvert dans l'explorateur Windows ou d'un fichier Excel ?

Je parles bien d''un dossier ouvert dans l'explorateur Windows.

J'ai consulté le lien que tu me proposais.
Voici le code que je me suis efforcé d'adapter :

Code:
Sub test1()
        Dim OpenFold As Variant
        Dim oShell As Object
        Dim Wnd As Object
        Dim strFolder

        OpenFold = "mondossierdedestination"
        strFolder = ThisWorkbook.Path & "\" & OpenFold
        Set oShell = CreateObject("Shell.Application")

        For Each Wnd In oShell.Windows
            If Wnd.Name = "Windows Explorer" Then
               If Wnd.Document.Folder.Self.Path = strFolder Then Exit Sub
            End If
        Next Wnd
        Application.ThisWorkbook.FollowHyperlink Address:=strFolder, NewWindow:=True
End Sub

Puis :
Code:
Private Sub CommandButton2_Click()

  Dim cheminfichier As String

  cheminfichier = ThisWorkbook.Path & "\" & "mondossierdedestination" & "\"

' Exporter au format PDF
     ActiveSheet.ExportAsFixedFormat Type:=xlTypePDF, Filename:=cheminfichier & nomfichier, _
                                      Quality:=xlQualityStandard, IncludeDocProperties:=True, IgnorePrintAreas:=False, OpenAfterPublish:=False
   
      If MsgBox("Le fichier pdf a été édité avec succès dans le dossier suivant : " & ThisWorkbook.Path & "\" & "Contrôles de sécurité au transbordement" & Chr(10) & "Voulez-vous accéder à ce dossier ?", vbYesNo) = vbNo Then
     
  Exit Sub
  Else
 
test1

  End If
End Sub

Si le dossier s'ouvre bien dans l'explorateur (chose que mon premier code faisait déjà), lorsqu'il est déjà ouvert et qu'on sollicite la commande une seconde fois, il s'ouvre en double.
Cela peut sembler n'être qu'un détail, mais ce fichier ayant vocation à être démultiplié, j'aimerai assurer à mes collaborateurs le maximum de confort.
A ce sujet, ce code fonctionnera-t-il sous Excel 2003 ?

Ai-je commis une erreur quelconque lors de l'adaptation du code ?

Cordialement
 

Staple1600

XLDnaute Barbatruc
Re : Ouvrir un répertoire en vba, s'il n'est pas déjà ouvert.

Re

En modifiant ainsi cela fonctionne ;) (j'ai testé)
Donc il te suffit de faire comme dans la macro test, un If/End if
Code:
Function FolderIsOpen(Folder$) As Boolean
        Dim OpenFold$, strFolder$
        Dim oShell As Object, Wnd As Object
      
        OpenFold = Folder
        strFolder = OpenFold
        Set oShell = CreateObject("Shell.Application")

        For Each Wnd In oShell.Windows
             FolderIsOpen = Wnd.Document.Folder.Self.Path = strFolder
        Next Wnd
End Function
Code:
Sub test()
If FolderIsOpen("C:\Temp") Then
MsgBox "Ouvert"
Else
MsgBox "Fermé"
End If
End Sub
 

webmuster

XLDnaute Junior
Re : Ouvrir un répertoire en vba, s'il n'est pas déjà ouvert.

Merci Staple1600

Une fois "C:\Temp" adapté à mon répertoire de destination, cela fonctionne parfaitement.

Code:
Sub test()
If FolderIsOpen("ThisWorkbook.Path & "\mondossierdedestination") Then
MsgBox "Ouvert"
Else
MsgBox "Fermé"
End If
End Sub

Grâce à ce code, je suis informé de l'ouverture ou non de ce répertoire.

Ma démarche est la suivante:
Si le répertoire est déjà ouvert alors le mettre au 1er plan
et s'il est fermé alors l'ouvrir

J'ai fais plusieurs essais, en vain.
Quelle est la syntaxe appropriée ?

Bien cordialement
 

Staple1600

XLDnaute Barbatruc

Staple1600

XLDnaute Barbatruc
Re : Ouvrir un répertoire en vba, s'il n'est pas déjà ouvert.

Re

Voila je suis tout propre et tout sec et en attendant mieux, ceci fonctionne en situation de test
Je te laisse adapter à tes besoins et tester.
PS: Test OK avec Excel 2003 sur XP
Code:
Public Declare Function ShowWindow Lib "user32" _
 (ByVal hWnd As Long, ByVal nCmdShow As Long) As Long

Const SW_SHOW = 5
Const SW_RESTORE = 9

Function FolderIsOpen(Folder$) As Boolean
        Dim OpenFold$, strFolder$
        Dim oShell As Object, Wnd As Object

        OpenFold = Folder
        strFolder = OpenFold
        Set oShell = CreateObject("Shell.Application")

        For Each Wnd In oShell.Windows
             FolderIsOpen = Wnd.Document.Folder.Self.Path = strFolder
        Next Wnd
End Function
Code:
Sub testII()
Dim oShell As Object, Wnd As Object
Set oShell = CreateObject("Shell.Application")
If FolderIsOpen("C:\Temp") Then
For Each Wnd In oShell.Windows
Call ShowWindow(Wnd.hWnd, SW_RESTORE)
Next Wnd
Else
MsgBox "Fermé"
End If
End Sub
 
Dernière édition:

webmuster

XLDnaute Junior
Re : Ouvrir un répertoire en vba, s'il n'est pas déjà ouvert.

Merci Staple1600

Après insertion du code dans un module et adaptation:
Code:
Sub test()
Dim oShell As Object, Wnd As Object
Set oShell = CreateObject("Shell.Application")
If FolderIsOpen(ThisWorkbook.Path & "\mondossierdedestination") Then
For Each Wnd In oShell.Windows
Call ForceForegroundWindow(Wnd.hWnd)
Next Wnd
Else
MsgBox "Fermé"
End If
End Sub

Au premier essai, le répertoire a été reconnu ouvert (ce qui était vrai) et mis au 1er plan.
Je l'ai ensuite refermé et il a été reconnu fermé (quelle est la syntaxe pour l'ouvrir, dans ce cas là ?).
Depuis, il est reconnu systématiquement fermé.

Je me demande si je n'ai pas également besoin de me rafraichir les idées ... et de m'alimenter!

J'avoue que les codes proposés dépassent de loin mes modestes connaissances.
Mais je ne lâche rien.

Encore merci pour ta patience et ton esprit de partage.
 

Staple1600

XLDnaute Barbatruc
Re : Ouvrir un répertoire en vba, s'il n'est pas déjà ouvert.

Re

Bon appétit
PS: Ne pas hésiter et abuser des moteurs de recherche (quels qu'ils soient) ;) parce que moi aussi il faut que je m'alimente.
Ci-dessous modification pour ouvrir le dossier si il n'est pas ouvert.
Code:
Sub testIII()
Dim oShell As Object, Wnd As Object
Set oShell = CreateObject("Shell.Application")
If FolderIsOpen("C:\Temp") Then
For Each Wnd In oShell.Windows
Call ShowWindow(Wnd.hWnd, SW_RESTORE)
Next Wnd
Else
oShell.Open "C:\Temp"
End If
End Sub
 

webmuster

XLDnaute Junior
Re : Ouvrir un répertoire en vba, s'il n'est pas déjà ouvert.

Merci Staple1600

Je te rejoins sur la nécessité de faire de vraies recherches avant de vous solliciter, mais malgré les incalculables discussions que j'ai pues suivre sur différents forums, je m'y suis résigné.
Comme je te le précisais dans mon dernier message, je continue à prospecter sans relâche.

Je vais tester ton nouveau code.

Cordialement
 

webmuster

XLDnaute Junior
Re : Ouvrir un répertoire en vba, s'il n'est pas déjà ouvert.

Merci Staple1600

Ton code fonctionne parfaitement.
Quelle maîtrise!

Encore merci à toi, et à cette communauté.
J'espère que l'intitulé de ma demande était suffisamment explicite pour pouvoir servir de piste de recherche pour d'autres.

Le meilleur pour toi et tes proches en cette nouvelle année. :)

Bien cordialement
 

Discussions similaires