¿Cómo extraer el nombre de archivo de la ruta?

¿Cómo myfile.pdf el nombre de archivo myfile.pdf de C:\Documents\myfile.pdf en VBA?

Esto está tomado 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 '\' ' eg '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 mejor manera de trabajar con archivos y directorios en VBA para Office 2000/2003 es usar la biblioteca de scripts. Agregue una referencia a Microsoft Scripting Runtime (Herramientas> Referencias en el IDE).

Crea un objeto de sistema de archivos y haz todas las operaciones usando eso.

 Dim fso as new FileSystemObject Dim fileName As String fileName = fso.GetFileName("c:\any path\file.txt") 

FileSystemObject es genial. Ofrece muchas funciones, como obtener carpetas especiales (Mis documentos, etc.), crear, mover, copiar, eliminar archivos y directorios de una manera orientada a objetos. Echale un vistazo.

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

devolverá el nombre del archivo, pero solo si existe.

He leído todas las respuestas y me gustaría agregar una más que creo que gana debido a su simplicidad. A diferencia de la respuesta aceptada, esto no requiere recursividad. Tampoco requiere hacer referencia a 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/ tiene este código más otras funciones para analizar la ruta del archivo, la extensión e incluso el nombre del archivo sin la extensión.

 Dim sFilePath$, sFileName$ sFileName = Split(sFilePath, "\")(UBound(Split(sFilePath, "\"))) 

Si quiere una solución más robusta que le proporcione tanto la ruta completa de la carpeta como el nombre del archivo, aquí está:

 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 

O como un sub / función:

 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 

Pasará el primer parámetro con la ruta completa del archivo y se establecerá en la ruta de la carpeta, mientras que el segundo parámetro se establecerá en el nombre del archivo.

Para obtener el nombre de archivo en una macro de Excel es:

 filname = Mid(spth, InStrRev(spth, "\", Len(spth)) + 1, Len(spth)) MsgBox Mid(filname, 1, InStr(filname, ".") - 1) 

Aquí hay una solución simple de VBA que escribí que funciona con Windows, Unix, Mac y rutas de URL.

 sFileName = Mid(Mid(sPath, InStrRev(sPath, "/") + 1), InStrRev(sPath, "\") + 1) sFolderName = Left(sPath, Len(sPath) - Len(sFileName)) 

Puedes probar la salida usando este código:

 '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 

Ver también: Wikipedia – Ruta (informática)

El enfoque más simple si está seguro de que el archivo existe físicamente en el disco:

 Dim fileName, filePath As String filePath = "C:\Documents\myfile.pdf" fileName = Dir(filePath) 

Si no está seguro de la existencia de un archivo o simplemente desea extraer el nombre de archivo de una ruta determinada, el enfoque más simple es:

 fileName = Mid(filePath, InStrRev(filePath, "\") + 1) 

No puedo creer lo complicadas que son algunas de estas respuestas … (¡sin ánimo de ofender!)

Aquí hay una función de una sola línea que hará el trabajo:


** Extraer el nombre de archivo de <code/> x: \ path \ filename : **”></p>
<pre> <code>Function getFName(pf)As String:getFName=Mid(pf,InStrRev(pf,


** Extraer la ruta de <code/> x: \ path \ filename : **”></p>
<pre> <code>Function getPath(pf)As String:getPath=Left(pf,InStrRev(pf,


Ejemplos:

ejemplos

Aquí hay una solución alternativa sin código. Este VBA funciona en la barra de fórmulas de Excel:

Para extraer el nombre del archivo:

 =RIGHT(A1,LEN(A1)-FIND("~",SUBSTITUTE(A1,"\","~",LEN(A1)-LEN(SUBSTITUTE(A1,"\",""))))) 

Para extraer la ruta del archivo:

 =MID(A1,1,LEN(A1)-LEN(MID(A1,FIND(CHAR(1),SUBSTITUTE(A1,"\",CHAR(1),LEN(A1)-LEN(SUBSTITUTE(A1,"\",""))))+1,LEN(A1)))) 

Necesitaba la ruta, no el nombre de archivo.

Entonces, para extraer la ruta del archivo en el código:

 JustPath = Left(sFileP, Len(sFileP) - Len(Split(sFileP, "\")(UBound(Split(sFileP, "\"))))) 

Esto se obtuvo de Twiggy @ http://archive.atomicmpc.com.au y otros lugares:

 '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 
 Dim nme As String = My.Computer.FileSystem.GetFileInfo(pathFicheiro).Name Dim dirc As String = My.Computer.FileSystem.GetFileInfo(nomeFicheiro).Directory