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 SubProblè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)
- Messages
- 4'199
- Excel
- 2021 FR 64 bits
- Inscrit
- 13/06/2016
- Emploi
- bénévole associations Goutte d'Or
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 FunctionAprè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 SubBonjour 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.
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- Messages
- 4'199
- Excel
- 2021 FR 64 bits
- Inscrit
- 13/06/2016
- Emploi
- bénévole associations Goutte d'Or
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
- Messages
- 4'199
- Excel
- 2021 FR 64 bits
- Inscrit
- 13/06/2016
- Emploi
- bénévole associations Goutte d'Or
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 SubFonction 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 FunctionPour 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.
- Messages
- 4'199
- Excel
- 2021 FR 64 bits
- Inscrit
- 13/06/2016
- Emploi
- bénévole associations Goutte d'Or
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 FunctionBonjour,
En effet, je viens de le tester et il fonctionne également !