web-dev-qa-db-fra.com

Comment extraire le nom du fichier du chemin?

Comment extraire le nom de fichier myfile.pdf de C:\Documents\myfile.pdf dans VBA?

47
Johan

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
37
Gonzalo

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.

110
Zen
Dir("C:\Documents\myfile.pdf")

renverra le nom du fichier, mais seulement s'il existe.

43
Dick Kusleika

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.

24
user2780436
Dim sFilePath$, sFileName$
sFileName = Split(sFilePath, "\")(UBound(Split(sFilePath, "\")))
9
Artur Piwkowski

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.

4
dnLL

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)
3
niki

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)

3
Roberto

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:


**Extract Filename from <code>x:\path\filename</code>:**

Function getFName(pf)As String:getFName=Mid(pf,InStrRev(pf,"\")+1):End Function

**Extract Path from <code>x:\path\filename</code>:**

Function getPath(pf)As String:getPath=Left(pf,InStrRev(pf,"\")):End Function

Exemples:

 examples

3
ashleedawg

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)
2
ePandit

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))))
1
live-love

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
0
Dan

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, "\"))))) 
0
Doug
 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 
  1. ici, vous donnez votre nom de fichier en tant qu'entrée de la fonction
  2. la fonction split de VBA divise le chemin en différentes parties en utilisant "\" comme séparateur de chemin et les stocke dans un tableau nommé "temp"
  3. uBound () trouve le nombre maximal d'éléments du tableau et attribue finalement le résultat à la fonction "nom_fichier_seulement"

J'espère que cela vous sera utile.

0
mishu36