Comment extraire le nom de fichier myfile.pdf
de C:\Documents\myfile.pdf
dans VBA?
Ceci est pris de snippets.dzone.com :
Function GetFilenameFromPath(ByVal strPath As String) As String
' Returns the rightmost characters of a string upto but not including the rightmost '\'
' e.g. 'c:\winnt\win.ini' returns 'win.ini'
If Right$(strPath, 1) <> "\" And Len(strPath) > 0 Then
GetFilenameFromPath = GetFilenameFromPath(Left$(strPath, Len(strPath) - 1)) + Right$(strPath, 1)
End If
End Function
La meilleure façon de travailler avec des fichiers et des répertoires dans VBA pour Office 2000/2003 consiste à utiliser la bibliothèque de scripts. Ajoutez une référence à Microsoft Scripting Runtime (Outils> Références dans l'EDI).
Créez un objet système de fichiers et effectuez toutes les opérations utilisant cet objet.
Dim fso as new FileSystemObject
Dim fileName As String
fileName = fso.GetFileName("c:\any path\file.txt")
FileSystemObject est génial. Il offre de nombreuses fonctionnalités telles que l'obtention de dossiers spéciaux (Mes documents, etc.), la création, le déplacement, la copie, la suppression de fichiers et de répertoires de manière orientée objet. Vérifiez-le.
Dir("C:\Documents\myfile.pdf")
renverra le nom du fichier, mais seulement s'il existe.
J'ai lu toutes les réponses et j'aimerais en ajouter une de plus qui, à mon avis, l'emporte à cause de sa simplicité. Contrairement à la réponse acceptée, cela ne nécessite pas de récursivité. De plus, il n'est pas nécessaire de référencer un FileSystemObject.
Function FileNameFromPath(strFullPath As String) As String
FileNameFromPath = Right(strFullPath, Len(strFullPath) - InStrRev(strFullPath, "\"))
End Function
http://vba-tutorial.com/parsing-a-file-string-into-path-filename-and-extension/ a ce code ainsi que d'autres fonctions permettant d'analyser le chemin, l'extension et même le nom du fichier sans l'extension.
Dim sFilePath$, sFileName$
sFileName = Split(sFilePath, "\")(UBound(Split(sFilePath, "\")))
Si vous voulez une solution plus robuste qui vous donnera à la fois le chemin du dossier complet ET le nom du fichier, la voici:
Dim strFileName As String, strFolderPath As String
Dim lngIndex As Long
Dim strPath() As String
strPath() = Split(OpenArgs, "\") 'Put the Parts of our path into an array
lngIndex = UBound(strPath)
strFileName = strPath(lngIndex) 'Get the File Name from our array
strPath(lngIndex) = "" 'Remove the File Name from our array
strFolderPath = Join(strPath, "\") 'Rebuild our path from our array
Ou en tant que sous/fonction:
Private Sub SeparatePathAndFile(ByRef io_strFolderPath As String, ByRef o_strFileName As String)
Dim strPath() As String
Dim lngIndex As Long
strPath() = Split(io_strFolderPath, "\") 'Put the Parts of our path into an array
lngIndex = UBound(strPath)
o_strFileName = strPath(lngIndex) 'Get the File Name from our array
strPath(lngIndex) = "" 'Remove the File Name from our array
io_strFolderPath = Join(strPath, "\") 'Rebuild our path from our array
End Sub
Vous transmettez le premier paramètre avec le chemin complet du fichier et il sera défini sur le chemin du dossier, tandis que le second paramètre sera défini sur le nom du fichier.
Pour obtenir le nom du fichier dans une macro Excel, procédez comme suit:
filname = Mid(spth, InStrRev(spth, "\", Len(spth)) + 1, Len(spth))
MsgBox Mid(filname, 1, InStr(filname, ".") - 1)
Voici une solution VBA simple que j'ai écrite qui fonctionne avec les chemins Windows, Unix, Mac et URL.
sFileName = Mid(Mid(sPath, InStrRev(sPath, "/") + 1), InStrRev(sPath, "\") + 1)
sFolderName = Left(sPath, Len(sPath) - Len(sFileName))
Vous pouvez tester la sortie en utilisant ce code:
'Visual Basic for Applications
http = "https://www.server.com/docs/Letter.txt"
unix = "/home/user/docs/Letter.txt"
dos = "C:\user\docs\Letter.txt"
win = "\\Server01\user\docs\Letter.txt"
blank = ""
sPath = unix
sFileName = Mid(Mid(sPath, InStrRev(sPath, "/") + 1), InStrRev(sPath, "\") + 1)
sFolderName = Left(sPath, Len(sPath) - Len(sFileName))
Debug.print "Folder: " & sFolderName & " File: " & sFileName
Voir aussi: Wikipedia - Chemin (informatique)
Je ne peux pas croire à quel point certaines de ces réponses sont trop compliquées ... (sans vouloir offenser!)
Voici une fonction single-line qui fera le travail:
Function getFName(pf)As String:getFName=Mid(pf,InStrRev(pf,"\")+1):End Function
Function getPath(pf)As String:getPath=Left(pf,InStrRev(pf,"\")):End Function
L'approche la plus simple si vous êtes sûr que le fichier existe physiquement sur le disque:
Dim fileName, filePath As String
filePath = "C:\Documents\myfile.pdf"
fileName = Dir(filePath)
Si vous n'êtes pas sûr de l'existence d'un fichier ou si vous voulez simplement extraire un nom de fichier à partir d'un chemin donné, la méthode la plus simple consiste à:
fileName = Mid(filePath, InStrRev(filePath, "\") + 1)
Voici une solution alternative sans code. Cette VBA fonctionne dans la barre de formule Excel:
Pour extraire le nom du fichier:
=RIGHT(A1,LEN(A1)-FIND("~",SUBSTITUTE(A1,"\","~",LEN(A1)-LEN(SUBSTITUTE(A1,"\","")))))
Pour extraire le chemin du fichier:
=MID(A1,1,LEN(A1)-LEN(MID(A1,FIND(CHAR(1),SUBSTITUTE(A1,"\",CHAR(1),LEN(A1)-LEN(SUBSTITUTE(A1,"\",""))))+1,LEN(A1))))
Cette glanée de Twiggy @ http://archive.atomicmpc.com.au et d’autres lieux:
'since the file name and path were used several times in code
'variables were made public
Public FName As Variant, Filename As String, Path As String
Sub xxx()
...
If Not GetFileName = 1 Then Exit Sub '
...
End Sub
Private Function GetFileName()
GetFileName = 0 'used for error handling at call point in case user cancels
FName = Application.GetOpenFilename("Ramp log file (*.txt), *.txt")
If Not VarType(FName) = vbBoolean Then GetFileName = 1 'to assure selection was made
Filename = Split(FName, "\")(UBound(Split(FName, "\"))) 'results in file name
Path = Left(FName, InStrRev(FName, "\")) 'results in path
End Function
J'avais besoin du chemin, pas du nom de fichier.
Donc, pour extraire le chemin du fichier en code:
JustPath = Left(sFileP, Len(sFileP) - Len(Split(sFileP, "\")(UBound(Split(sFileP, "\")))))
Fonction nom_fichier_seulement (chemin_fichier Comme Chaîne) As String Dim temp As Variant Temp = Fractionné (chemin_fichier, Application.PathSeparator). temp)) Fin de la fonction
J'espère que cela vous sera utile.