Ouvrir un fichier au nom inconnu, sans "Dir"

Bonjour à tous,

Déjà je tiens à remercier énormément la communauté car même si je suis un nouveau membre, j'ai passé beaucoup de temps sur ce forum à lire différentes discussions qui m'ont beaucoup aidées dans mon évolution vba.

Contexte : J'ai un programme vba qui ouvre un fichier dans un dossier et y récupère certaines infos. Exemple type :

Sub laize_emtec()

''''''''''''''''''''''''''''''''''''''''' INITIALISATION ''''''''''''''''''''''''''''''''''''''''''
Dim CP As Workbook 'déclare la variable CP (Classeur Principal (...))
Dim OP As Worksheet 'déclare la variable OP (Onglet Principal (...))

Set CP = ThisWorkbook 'définit le classeur destination CD
Set OP = CP.Sheets("Données") 'définit l'onglet principal

Dim CA As String
Dim NF As String 'Nom du Fichier
Dim strFile As String

CA = CP.Path & "/Extraction logiciel/Laize et Emtec/"  'chemin pour accéder au fichier
CA = ConvertURLSharePoint2013(CA)

NF = Dir(CA & "*.csv")

strFile = CA + NF  'prend le premier fichier

'Et la suite consiste à ouvrir le fichier en question et réaliser certaines opérations
'...

End Sub

Problème : depuis peu, mon entreprise à tout fait basculer sur One drive / teams / sharepoint (je n'ai pas encore totalement compris comment tout ça fonctionne), et cela a créé un petit problème dans mes programmes. Notamment avec toutes mes utilisation de la fonction "Dir()", qui me permet d'ouvrir un fichier dont je ne connais pas le nom (car il change constamment), mais dont je connais l'emplacement (le chemin d'accès).

Question : Comment m'affranchir de ce "Dir()" ? Avez vous une autre méthode pour ouvrir un fichier au nom inconnu ?

Sachant que j'ai déjà beaucoup farfouillé sur les différents sites. Du coup j'ai conscience que mon chemin d'accès est différent maintenant qu'il est sur sharepoint. Ce côté a été réglé avec une fonction qui me nettoie mon url au profil de sharepoint (une fonction "assainir mon URL trouvé sur cette plateforme), légèrement adapté. Donc là j'ai vraiment le bon chemin d'accès, mais il n'arrive pas à passer le cap du Dir (erreur 52).

J'ai également vu l'astuce d'utiliser une boite de dialogue pour avoir le nom du fichier, mais ça complique les choses pour l'utilisateur final, qui doit déjà faire pas mal de manip. Du coup l'idéal c'est que le programme fasse vraiment le maximum sans intervention de l'utilisateur.

(Désolée, c'est très spécifique comme demande, mais là ça fait déjà 3 jours que je consacre pleinement à la résolution de ce problème, je ne le trouve vraiment nul part)

Bonjour,

Vous pouvez tout simplement revenir à la fonction "Dir()" en associant à votre URL, un lecteur réseau :

Function lecteur_réseau(URL As String) As String
    Dim i As Integer
    Dim lettre As String

    Set FSO = CreateObject("Scripting.FileSystemObject")
    Set LAN = CreateObject("WScript.Network")
    For i = Asc("Z") To Asc("A") Step -1
        lettre = Chr(i)
        If Not FSO.DriveExists(lettre) Then
            LAN.MapNetworkDrive LocalName:=lettre & ":", RemoteName:=URL
            lecteur_réseau = lettre & ":"
            Exit For
        End If
    Next i

End Function

Après votre traitement, vous déconnectez le lecteur réseau avec :

Sub déconnecter_lecteur_réseau(lecteur As String)
    Set LAN = CreateObject("WScript.Network")
    LAN.RemoveNetworkDrive (lecteur)
End Sub

Bonjour Thev,

Merci pour ta réponse ! Je l'ai testé ce matin et la fonction lecteur_reseau marche super bien. J'ai du faire quelques modifs dans mon programme, mais il commence déjà à mieux tourner.

Cependant j'ai rajouté à la fin de ma fonction principale un "call déconnecter_lecteur_réseau", et je ne comprends pas le message d'erreur, n'étant pas (encore) familière avec les lecteurs réseaux. Sachant que le fichier que j'ouvre au début de mon programme est refermé avant le call.

image

Un bout du code, si vous voulez avoir un aperçu plus visuel

Sub laize_emtec()

'''''''''''''''''''''''''''''''''''''' INITIALISATION ''''''''''''''''''''''''''''''''''''''''''

Dim CP As Workbook 'déclare la variable CP (Classeur Principal (...))
Dim OP As Worksheet 'déclare la variable OP (Onglet Principal (...))

Set CP = ThisWorkbook 'définit le classeur destination CD
Set OP = CP.Sheets("Données") 'définit l'onglet principal

Dim CA As String 'chemin d'accès
Dim NF As String 'Nom du Fichier
Dim strFile As String 'nom complet du fichier avec son chemin d'accès

CA = CP.Path & "/Extraction logiciel/Laize et Emtec/"   'chemin pour accéder au fichier

strFile = CA  'stockage le temps de trouver le nom du fichier
CA = lecteur_réseau(CA)
NF = Dir(CA & "*.csv")

strFile = ConvertURLSharePoint2013(strFile + NF)   'prend le premier fichier

''''''''''''''''''''''''''''''''''''''' OUVRIR EXCEL LAIZE EMTEC EXTRAIT  '''''''''''''''''''''''''''''''''''''''''''''''''

Dim wb As Workbook
Set wb = Application.Workbooks.Open(strFile)

Do Until wb.ReadOnly = False
wb.Close
Application.Wait Now + TimeValue("00:00:01")
Set wb = Application.Workbooks.Open(strFile)
Loop
DoEvents

Workbooks("" & NF).Activate
DoEvents

'ouvrir le fichier présent dans le dossier "Laize et Emtec"

Dim CS As Workbook
Dim OS As Worksheet 'onglet du classeur secondaire 

Set CS = ActiveWorkbook 
Set OS = ActiveSheet          'définit l'onglet secondaire            

'''''''''''''''''''''''''''''''''''''''''' MANIPULATIONS '''''''''''''''''''''''''''''''''''''''''
'diverses manipulations que j'effectue entre les 2 fichiers 
'récupération de données, etc ...
''''''''''''''''''''''''''''''' END '''''''''''''''''''''''''''''''''''

Workbooks("" & NF).Close SaveChanges:=False
Call déconnecter_lecteur_réseau(CA)

End Sub
Sachant que le fichier que j'ouvre au début de mon programme est refermé avant le call.
Oui, mais le fichier SharePoint se trouvant dans le lecteur réseau ne l'est pas (wb.close ??)

Je ne comprends pas ta remarque. En faisant :

Workbooks("" & NF).Close SaveChanges:=False (ou même wb.close)

Call déconnecter_lecteur_réseau(CA)

je vois le fichier concerné se fermer. Mais tu veux dire que malgré ça il reste ouvert dans le lecteur ? Et dans ce cas comment le fermer ?

edit : en effet, même sans ouvrir le fichier, lorsque je vais sur l'espace PC pour deconnecter manuellement le lecteur activé, ça m'indique que des fichiers sont ouverts. Mais toujours même interrogations du coup, comment les fermer car je ne vois pas à quoi ils font référence

Je ne comprends pas ta remarque. En faisant Workbooks("" & NF).Close SaveChanges:=False (ou même wb.close)

Effectivement le fichier est bien fermé. Mais j'ai été surpris par cette instruction car j'attendais plutôt wb.close SaveChanges:=False

Cela dit, il faudrait à mon avis effectuer la déconnexion du lecteur_réseau après avoir terminé la procédure : Sub laize_emtec, avec par exemple une instruction Application.OnTime.

Ça marche !

Alors déjà merci beaucoup pour ton aide

En parallèle j'ai fait des recherches et des tests suivant les indications que tu m'as donné, et après plusieurs tests j'ai enfin réussi !

Alors finalement j'utilise ta solution de départ (je n'arrivais pas avec le OnTime), mais je l'ai modifié suite à une soluce trouvée sur internet, qui consiste à forcer la fermeture des fichiers ouverts, pour valider la fermeture du lecteur. ça donne ça :

Code principal :

Sub try()

''''''''' INITIALISATION ''''''''''
'déclaration des différentes variables (déjà indiqué dans les messages précédents)

Dim CA As String 'chemin d'accès
CA = CP.Path & "/Extraction logiciel/Laize et Emtec/"   'chemin pour accéder au fichier
strFile = CA 'stockage le temps de trouver le nom du fichier
CA = lecteur_réseau(CA)
NF = Dir(CA & "*.csv")
strFile = ConvertURLSharePoint2013(strFile + NF)   'prend le premier fichier

''''''''' MANIPULATIONS DES FICHIERS '''''''''
'j'ouvre le fichier voulu grâce à l'URL strfile 
'je fais mes petites manipulations entre les 2 fichiers
''''''''' END ''''''''''''''''''

wb.Close SaveChanges:=False
fermer = déconnecter_lecteur_réseau(CA, True)

End Sub

Fonction Connecter / Déconnecter le lecteur réseau :

Function lecteur_réseau(URL As String) As String
'Merci Thev
    Dim i As Integer
    Dim lettre As String

    Set FSO = CreateObject("Scripting.FileSystemObject")
    Set LAN = CreateObject("WScript.Network")
    For i = Asc("Z") To Asc("A") Step -1
        lettre = Chr(i)
        If Not FSO.DriveExists(lettre) Then
            LAN.MapNetworkDrive LocalName:=lettre & ":", RemoteName:=URL
            lecteur_réseau = lettre & ":"
            Exit For
        End If
    Next i
End Function

Function déconnecter_lecteur_réseau(lecteur As String, Optional bolForce As Boolean = False) As Boolean
    Set LAN = CreateObject("WScript.Network")
    déconnecter_lecteur_réseau = LAN.RemoveNetworkDrive(lecteur, IIf(bolForce, 1, 0)) = 0
End Function

Pour le moment ça fonctionne, mais on n'est pas à l'abris d'une double erreur qui se compense, quelque part dans mon programme

Je vais le tester plusieurs fois, et également sur mes autres programmes qui ont également besoin de chercher un fichier dont le nom change.

Bonjour,

Pure curiosité de ma part, est-ce que ce code ne serait pas suffisant :

Function déconnecter_lecteur_réseau(lecteur As String) As Boolean
    dim LAN as object

    Set LAN = CreateObject("WScript.Network")
    déconnecter_lecteur_réseau = LAN.RemoveNetworkDrive(lecteur, True, True)
End Function

Bonjour,

En effet, je viens de le tester et il fonctionne également !

Rechercher des sujets similaires à "ouvrir fichier nom inconnu dir"